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-not and . ReaderWriter

这是一个重要的普遍观点:尽可能长时间地将数据保持在其“本机”表示中。仅在绝对必要时将数据转换为不同的表示形式,并且要非常小心。

于 2012-11-01T14:08:48.720 回答
2

不要使用基于文本的 API 来读取二进制文件。在这种情况下,您不想要 a BufferedReader,当然也不想要readLine,这可能不仅仅是将一件事视为行分隔符。使用InputStream(例如,FileInputStream)和OutputStream(例如,FileOutputStream),而不是读取器和写入器。

于 2012-11-01T14:08:48.430 回答
1

不要那样做

PNG 不是文本数据。
如果您尝试将任意字节读入字符串,Java 会将这些字节转换为实际文本,从而破坏您读取的数据。

您需要使用byte[]sm 而不是strings。

于 2012-11-01T14:09:08.447 回答