如何将字符串转换回字节以便写入 Java 中的文件?
How to convert string back to bytes in order to write to file in Java?
我有一个文本文件,其中包含单词 "cool"。我读取了这个文件中的所有字节并将其转换为字符串。但是,在另一个函数中,我试图将相同的字符串转换回字节以写入文件,但我没有得到预期的结果。
Path path = Paths.get(fileName);
byte[] data = Files.readAllBytes(path);
String x = new String();
for(byte b: data){
x += Byte.toString(b);
}
System.out.println(x);
输出: "cool" 变成字节
99111111108
不幸的是,下面的代码不会将 "cool" 写回文件,而是写入 99111111108。
str = "99111111108";
FileOutputStream C = new FileOutputStream("new.txt");
C.write(str.getBytes());
C.close();
无法完成。问题在于,在字符串“99111111108”中,不包括字节开始和结束位置的分界。也就是说,这个字符串中第一个字符是“9”,还是“99”?
看看这个:https://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html#toString(byte)
toString
public static String toString(byte b)
Returns a new String object representing the specified byte. The radix
is assumed to be 10.
Parameters: b - the byte to be converted Returns: the string
representation of the specified byte
See Also: Integer.toString(int)
问题是您正在将字符串转换为字节,但随后您将
并将该字节转换为 string/character(解释为以 10 为底的数字 - radix=10),这意味着您基本上获得了每个字符的 ascii 等价物(c=99,o=111,o=111,l=108 ) 这是一个以 10 为底数的数字。但是你是每个数字的数字字符。当您将字符串转回字节时,您得到的是 数字字符 的字节,而不是您想要的字母字节。
根据您实际追求的目标,您将需要找到不同的方法。目前尚不清楚你试图通过转换为字节来显示什么,但如果你真的想与位串(由 0 和 1 的数字字符组成的字符串)相互转换,你将不得不做更多的工作。
如果你用逗号等其他字符分隔你正在构建的字符串(例如 99,111,111,108),那么你可以假设分隔的子字符串是整数(对于常规 ascii)并将它们传递给 'Integer.parseInt(s)' 或 'Integer.valueOf(s)' 然后转换为 char,然后将 chars 构建为字符串。
例如:
StringBuilder sb = new StringBuilder();
String str = "99,111,111,108"; // result of initial conversion
String[] sa = str.split(",");
char ch = '';
for(String s : sa) {
ch = Integer.parseInt(s);
sb.append(ch);
}
FileOutputStream fos = new FileOutputStream("new.txt");
fos.write(sb.toString().getBytes());
fos.close();
这里的一个重要注意事项是,至少对于 Java,字符只是整数,只是它们将字符解释为 ascii 字符。
我认为,基本的困境是,将字节转换为字符串是一个破坏性 操作,其中会丢失上下文。 IE。计算机不再知道原始字节的任何信息,只知道新生成的字符串是什么。字节是二进制数据,而字符串是一组字符(一般是ascii,也有各种UTF)。
如果您将字节值表示为字符串,则可以使用方法 Byte.valueOf.
将它们转换回字节
byte b = getByte();
String byteAsString = Byte.toString(b);
System.out.println(byteAsString); //might print something like '111'
byte o = Byte.valueOf(byteAsString);
assertEquals(b,o); //true
对我来说,直接用
将数据读入字符串似乎更好
new String(byteArray, encoding);
像 dnault 建议的那样。对于任何字符串,您都会得到一个带有
的字符
"string".charAt(index);
也可以在循环中通过将 byte 转换为 char 来直接获取字符。你可以这样做
for(byte b: data){
x += (char)b;
}
System.out.println(x);
并且根据您提供的示例输入,此代码将打印 "cool",尽管这是一种非常幼稚的方法,并且在使用值大于字节最大值的字符时您会 运行 遇到麻烦。
我有一个文本文件,其中包含单词 "cool"。我读取了这个文件中的所有字节并将其转换为字符串。但是,在另一个函数中,我试图将相同的字符串转换回字节以写入文件,但我没有得到预期的结果。
Path path = Paths.get(fileName);
byte[] data = Files.readAllBytes(path);
String x = new String();
for(byte b: data){
x += Byte.toString(b);
}
System.out.println(x);
输出: "cool" 变成字节
99111111108
不幸的是,下面的代码不会将 "cool" 写回文件,而是写入 99111111108。
str = "99111111108";
FileOutputStream C = new FileOutputStream("new.txt");
C.write(str.getBytes());
C.close();
无法完成。问题在于,在字符串“99111111108”中,不包括字节开始和结束位置的分界。也就是说,这个字符串中第一个字符是“9”,还是“99”?
看看这个:https://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html#toString(byte)
toString
public static String toString(byte b)
Returns a new String object representing the specified byte. The radix is assumed to be 10.
Parameters: b - the byte to be converted Returns: the string representation of the specified byte
See Also: Integer.toString(int)
问题是您正在将字符串转换为字节,但随后您将 并将该字节转换为 string/character(解释为以 10 为底的数字 - radix=10),这意味着您基本上获得了每个字符的 ascii 等价物(c=99,o=111,o=111,l=108 ) 这是一个以 10 为底数的数字。但是你是每个数字的数字字符。当您将字符串转回字节时,您得到的是 数字字符 的字节,而不是您想要的字母字节。
根据您实际追求的目标,您将需要找到不同的方法。目前尚不清楚你试图通过转换为字节来显示什么,但如果你真的想与位串(由 0 和 1 的数字字符组成的字符串)相互转换,你将不得不做更多的工作。
如果你用逗号等其他字符分隔你正在构建的字符串(例如 99,111,111,108),那么你可以假设分隔的子字符串是整数(对于常规 ascii)并将它们传递给 'Integer.parseInt(s)' 或 'Integer.valueOf(s)' 然后转换为 char,然后将 chars 构建为字符串。
例如:
StringBuilder sb = new StringBuilder();
String str = "99,111,111,108"; // result of initial conversion
String[] sa = str.split(",");
char ch = '';
for(String s : sa) {
ch = Integer.parseInt(s);
sb.append(ch);
}
FileOutputStream fos = new FileOutputStream("new.txt");
fos.write(sb.toString().getBytes());
fos.close();
这里的一个重要注意事项是,至少对于 Java,字符只是整数,只是它们将字符解释为 ascii 字符。
我认为,基本的困境是,将字节转换为字符串是一个破坏性 操作,其中会丢失上下文。 IE。计算机不再知道原始字节的任何信息,只知道新生成的字符串是什么。字节是二进制数据,而字符串是一组字符(一般是ascii,也有各种UTF)。
如果您将字节值表示为字符串,则可以使用方法 Byte.valueOf.
将它们转换回字节byte b = getByte();
String byteAsString = Byte.toString(b);
System.out.println(byteAsString); //might print something like '111'
byte o = Byte.valueOf(byteAsString);
assertEquals(b,o); //true
对我来说,直接用
将数据读入字符串似乎更好new String(byteArray, encoding);
像 dnault 建议的那样。对于任何字符串,您都会得到一个带有
的字符"string".charAt(index);
也可以在循环中通过将 byte 转换为 char 来直接获取字符。你可以这样做
for(byte b: data){
x += (char)b;
}
System.out.println(x);
并且根据您提供的示例输入,此代码将打印 "cool",尽管这是一种非常幼稚的方法,并且在使用值大于字节最大值的字符时您会 运行 遇到麻烦。