将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();
        }
    }

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

是的,我并不感到惊讶。您正在将任意二进制数据视为文本数据(无论是在平台默认编码的内容中,要启动)。它不是。不要那样做。在某些编码中,您可能会摆脱它 - 直到您开始尝试以无法打印的字符等的方式将字符串传递到其他地方。

如果您必须将任意二进制数据转换为文本,请使用base64或十六进制。如果可能的话,请首先避免转换为文本。如果您只想复制文件,请使用InputStreamOutputStream- 不是 ReaderWriter

这是一个很大的一般点:将数据保留在其"本地"表示中,尽可能地将数据保留在其"本机"表示中。仅当您绝对需要时,仅将数据转换为不同的表示形式,并且要非常谨慎。

不要使用基于文本的API读取二进制文件。在这种情况下,您不需要BufferedReader,并且您当然不想要readLine,这可能不仅仅是一件事,将其视为线路分离器。使用InputStream(例如FileInputStream)和OutputStream(例如FileOutputStream),而不是读者和作家。

不要这样做

png不是文本数据。
如果您尝试将任意字节读取为字符串,Java会将字节弄脏到实际文本中,损坏您读取的数据。

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

最新更新