如何将字符串转换回字节以便在Java中写入文件?

时间:2016-04-12 20:34:55

标签: java byte

我有一个包含单词" 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);

输出"很酷"变成了字节

99111111108

不幸的是,下面的代码没有写出#34; cool"回到文件,而不是写99111111108.

str = "99111111108";
FileOutputStream C = new FileOutputStream("new.txt");
C.write(str.getBytes());
C.close();   

3 个答案:

答案 0 :(得分:4)

无法完成。问题是在字符串“99111111108”中不包括字节开始和结束的分界线。换句话说,在这个字符串中“9”是第一个字符,还是“99”?

答案 1 :(得分:2)

如果您将字节值表示为字符串,则可以使用方法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);

根据您提供的示例输入,此代码将打印“酷”,虽然这是一种非常天真的方法,但在使用值大于字节最大值的字符时会遇到麻烦。

答案 2 :(得分:1)

检查出来:https://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html#toString(byte)

  

的toString

     

public static String toString(byte b)

     

返回表示指定字节的新String对象。基数   假设是10。

     

参数:b - 要转换的字节返回:字符串   指定字节的表示

     

另见:Integer.toString(int)

问题在于您将字符串转换为字节,但随后您就开始了 并将该字节转换为字符串/字符(解释为基数10 - 基数= 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来说,字符只是整数,除了它们将char解释为ascii字符。

我认为,基本的困境是将字节转换为字符串是一种破坏性操作,其中上下文丢失。即计算机不再知道有关原始字节的任何信息,只知道新生成的字符串是什么。字节是二进制数据,但字符串是一组字符(通常是ascii,但也是各种类型的UTF)。