将PNG加载为字符串并保存会破坏它

时间:2012-11-01 14:07:18

标签: java load png

我有程序,我必须将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();
        }

    }

3 个答案:

答案 0 :(得分:5)

  

我有程序,我必须将PNG作为字符串加载然后再次保存,但是在我保存后它变得不可读。

是的,我并不感到惊讶。您将任意二进制数据视为文本数据(无论您的平台默认编码是什么,都要引导)。不是。不要那样做。在某些编码中你可能会使用它 - 直到你开始尝试将字符串传递到别处以剥离不可打印的字符等方式。

如果必须将任意二进制数据转换为文本,请使用base64或hex。如果可能,请尽量避免转换为文本。如果您只想复制文件,请使用InputStreamOutputStream - ReaderWriter

这是一个很重要的一点:只要你愿意,就可以将数据保存在“原生”表示中。只有在必要时才将数据转换为不同的表示形式,并且要非常小心。

答案 1 :(得分:2)

不要使用基于文本的API来读取二进制文件。在这种情况下,您不需要BufferedReader,并且您当然不希望readLine,这可能不仅仅是作为行分隔符处理一件事。使用InputStream(例如FileInputStream)和OutputStream(例如FileOutputStream),而不是读者和作者。

答案 2 :(得分:1)

不要那样做

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

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