我尝试从" 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"字节并存储在" 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();
"字节文件中的模式"是这样的:
<9e>zgóoG^P$@0<81>^B*É^X¿uú<9b>^@
&#34; stringfile&#34;中的模式是这样的:
�zg�oG^P$@0�^B*�^X�u��^@�� V�
然而,&#34; newbytefile&#34;中的模式是这样的:
[B@40226788
如何在'#34; stringfile&#34;中转换字符串?在&#34; bytefile&#34;?
中与原始模式相同的字节答案 0 :(得分:2)
问题是:PrintWriter有没有方法来编写byte []数组。
因此,当您调用println(getBytes())
时...编译器会尝试查找匹配的重载方法。它会找到println(Object)
(因为:最后,任何java数组也一个对象)。
你可以看到使用javap反汇编程序:
invokevirtual#22 //方法java / io / PrintWriter.println:(Ljava / lang / Object;)V
在该方法中,在传入对象上调用toString()
。当你在一个字节数组上调用toString()时,你会得到一个看起来像“[B ....” - 的结果 - 见here为什么会这样。
换句话说:由于重载,您不是打印字节数组本身,而是打印该字节数组的默认字符串表示。
答案 1 :(得分:0)
你应该注意的一些事情:
答案 2 :(得分:0)
您可能还会发现输入数据导致问题:无法正确编码为字符串。
如果你跑:
package au.com.redbarn.stackoverflow.convert_byte_to_string_to_byte;
import java.nio.charset.StandardCharsets;
public class NoFiles {
public static void main(String[] args) {
byte[] byteIn = {60, 57, 101, 62, 122, 103, -13, 111, 71, 94, 80, 36, 64, 48, 60, 56, 49, 62, 94, 66, 42, -55, 94, 88, -65, 117, -6, 60, 57, 98, 62, 94, 64};
String s = new String(byteIn, StandardCharsets.UTF_8);
byte[] byteOut = s.getBytes(StandardCharsets.UTF_8);
System.out.println(byteOut);
}
}
byteIn!= byteOut
也许从一个你知道将正确转换为字符串的字节数组开始。你真正想做的是什么?
如果你的字节数组可以正确转换,这将有效:
package au.com.redbarn.stackoverflow.convert_byte_to_string_to_byte;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class ConvertByteToStringToByte {
public static void main(String[] args) {
try {
// Read bytes, write String.
byte[] b = Files.readAllBytes(FileSystems.getDefault().getPath("bytefile-in"));
String strOut = new String(b, StandardCharsets.UTF_8);
try (PrintWriter pw = new PrintWriter("stringfile")){
pw.println(strOut);
}
catch (IOException e) {
throw (e);
}
// Read String, write bytes.
List<String> strsIn = Files.readAllLines(FileSystems.getDefault().getPath("stringfile"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (String strIn : strsIn) {
baos.write(strIn.getBytes(StandardCharsets.UTF_8));
}
Files.write(Paths.get("bytefile-out"), baos.toByteArray());
}
catch (IOException e) {
e.printStackTrace();
}
}
}
答案 3 :(得分:-1)
你是在正确的轨道上,你仍然需要通过构造一个具有正确参数的字节将字节数组转换为字符串:
new String(line.getBytes(), "UTF-8");
请记住,有多种方法可以将字节数组转换为String。