我尝试从“ bytefile”读取字节,将其更改为String并将其存储到“ stringfile”。下面的代码是我的表现。
PrintWriter writer = new PrintWriter(new FileOutputStream(new File("stringfile"), true));
RandomAccessFile file = new RandomAccessFile("bytefile", "r");
byte[] b = new byte[(int)file.length()];
file.readFully(b);
String str = new String(b, StandardCharsets.UTF_8);
writer.write(str);
writer.close();
然后,我尝试将“ stringfile”中的字符串转换为byte并存储在“ newbytefile”中。但是,结果不符合我的预期。
String charset = "UTF-8";
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("stringfile"), charset));
PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream("newbytefile"), charset));
String line;
while ((line = reader.readLine()) != null){
writer.println(line.getBytes());
}
reader.close();
writer.close();
“ bytefile”中的模式如下所示:
<9e>zgóoG^P$@0<81>^B*É^X¿uú<9b>^@
“ stringfile”中的模式如下所示:
�zg�oG^P$@0�^B*�^X�u��^@�� V�
但是,“ newbytefile”中的模式如下所示:
[B@40226788
如何将“ stringfile”中的字符串转换为与“ bytefile”中原始模式相同的字节?
最佳答案
问题是:PrintWriter没有方法写入byte []数组。
因此,当您调用println(getBytes())
...时,编译器将尝试查找匹配的重载方法。它将找到println(Object)
(因为:最后,任何java数组也是Object)。
您可以看到使用javap反汇编程序:
invokevirtual#22 //方法java / io / PrintWriter.println:(Ljava / lang / Object;)V
在该方法中,在传入对象上调用toString()
。而且,当您在字节数组上调用toString()时,您将得到一个类似于“ [B ....””的结果-为何请参见here。
换句话说:由于重载,您不是在打印字节数组本身,而是在打印该字节数组的默认字符串表示形式。