我有程序,我必须将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();
}
}
答案 0 :(得分:5)
我有程序,我必须将PNG作为字符串加载然后再次保存,但是在我保存后它变得不可读。
是的,我并不感到惊讶。您将任意二进制数据视为文本数据(无论您的平台默认编码是什么,都要引导)。不是。不要那样做。在某些编码中你可能会使用它 - 直到你开始尝试将字符串传递到别处以剥离不可打印的字符等方式。
如果必须将任意二进制数据转换为文本,请使用base64或hex。如果可能,请尽量避免转换为文本。如果您只想复制文件,请使用InputStream
和OutputStream
- 不 Reader
和Writer
。
这是一个很重要的一点:只要你愿意,就可以将数据保存在“原生”表示中。只有在必要时才将数据转换为不同的表示形式,并且要非常小心。
答案 1 :(得分:2)
不要使用基于文本的API来读取二进制文件。在这种情况下,您不需要BufferedReader
,并且您当然不希望readLine
,这可能不仅仅是作为行分隔符处理一件事。使用InputStream
(例如FileInputStream
)和OutputStream
(例如FileOutputStream
),而不是读者和作者。
答案 2 :(得分:1)
PNG不是文本数据 如果您尝试将任意字节读入字符串,Java会将字节变为实际文本,从而破坏您读取的数据。
您需要使用byte[]
sm而不是string
s。