0

PNGを文字列としてロードしてから再度保存する必要があるプログラムがありますが、保存すると読み取れなくなります。ロードされたPNGと保存された文字列の両方をエディターで開くと、Javaがファイル全体に改行を作成したことがわかります。これが問題である場合、どうすればこれを回避できますか?

    public static void main(String[] args)
    {
        try
        {
            File file1 = new File("C://andim//testFile.png");
            StringBuffer content = new StringBuffer();
            BufferedReader reader = null;
            reader = new BufferedReader(new FileReader(file1));
            String s = null;         
            while ((s = reader.readLine()) != null) 
            {
                content.append(s).append(System.getProperty("line.separator"));                      
            }
            reader.close();
            String loaded=content.toString();
            File file2=new File("C://andim//testString.png");
            FileWriter filewriter = new FileWriter(file2);
            filewriter.write(loaded);           
            filewriter.flush();
            filewriter.close();
        }
        catch(Exception exception)
        {
            exception.printStackTrace();
        }

    }
4

3 に答える 3

5

PNGを文字列としてロードしてから再度保存する必要があるプログラムがありますが、保存すると読み取れなくなります。

はい、私は驚いていません。任意のバイナリデータをテキストデータのように扱っています(プラットフォームのデフォルトのエンコーディングが何であれ、起動します)。そうではありません。そうしないでください。一部のエンコーディングでは、印刷できない文字などを削除する方法で文字列を他の場所に渡そうとするまで、それを回避できる可能性があります。

任意のバイナリデータをテキストに変換する必要がある場合は、base64またはhexを使用してください。ただし、可能であれば、そもそもテキストへの変換は避けてください。ファイルをコピーするだけの場合は、InputStreamand OutputStream- notand Readerを使用しますWriter

これは大きな一般的なポイントです。可能な限り、データを「ネイティブ」表現で保持します。どうしても必要な場合にのみ、データを別の表現に変換し、十分に注意してください。

于 2012-11-01T14:08:48.720 に答える
2

バイナリファイルの読み取りにテキストベースのAPIを使用しないでください。この場合、あなたは必要ありませんBufferedReader、そしてあなたは確かに必要ありませんreadLine、それはただ一つ以上のものを線区切りとして扱うかもしれません。リーダーやライターではなく、(InputStreamたとえばFileInputStream)と(たとえば)を使用します。OutputStreamFileOutputStream

于 2012-11-01T14:08:48.430 に答える
1

それをしないでください

PNGはテキストデータではありません。
任意のバイトを文字列に読み込もうとすると、Javaはバイトを実際のテキストにマングルし、読み取ったデータを破壊します。

byte[]sではなくsmを使用する必要がありますstring

于 2012-11-01T14:09:08.447 に答える