2017-02-22 99 views
-3

所以我有一个数以千计的1和0的字符串,我想以二进制文件的形式保存到文件中(因此文件大小很小)。不幸的是,我不知道如何在没有运行NumberFormatExceptions的情况下做到这一点。将1和0的字符串转换为二进制文件

我试过Byte.parseByte,但似乎没有工作。任何帮助将不胜感激。

try { 
     File file = new File(BINARY_FILE); 
     DataOutputStream dso = new DataOutputStream(new FileOutputStream(file)); 
     for (int j = 0; j < bits.length(); j += 8) { 
      Byte b = Byte.parseByte(bits.substring(j, j + 8)); 
      dso.write(b); 
     } 
    } catch (IOException e) { 
     System.out.println("Error"); 
    } 
+0

显示你已经试过的代码 –

+0

增加,位变量是1和0的字符串。 – BananaPineapple

+0

另外,我们保证字符串的长度可以被8整除吗? –

回答

2

如果您只想写入字节,请不要用DataOutputStream打包。

您也应该使用try-with-resources完成后关闭文件流。

解析8位时,需要指定基数2,否则就是解析基数为10的数字,而不是二进制。

解析是针对带符号的数字的,因此,由于您使用的是8位无符号字节,因此应该解析为int而不是byte

您不应该使用valueOf(),而是使用parseInt()。不需要获得装箱对象。

所以,你的代码应该是:

try { 
    File file = new File(BINARY_FILE); 
    try (FileOutputStream out = new FileOutputStream(file)) { 
     for (int j = 0; j < bits.length(); j += 8) { 
      int b = Integer.parseInt(bits.substring(j, j + 8), 2); 
      out.write(b); 
     } 
    } 
} catch (IOException e) { 
    System.out.println("Error"); 
} 

parseByte(s, 2)是一个有符号解析,所以它onlu支持"-10000000"(-128 )和"01111111"(127 )之间的值。任何以1开头的8位二进制数将会失败java.lang.NumberFormatException: Value out of range. Value:"11111111" Radix:2

+0

虽然仅仅是因为符号,但在8位字节的情况下使用32位整数似乎有点低效。 –

+0

@DM ['write()'](https://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html#write-int-)以'int'作为参数,即使它只使用低8位,无论你是解析为“byte”,“short”还是“int”,它都会被转换为“int”。无法解析字节而没有错误,所以不妨将其解析为'int',因为这是方法所需的。 – Andreas

+0

这看起来很有效,但如果有更好的东西,它会继续尝试和改进。 – BananaPineapple

1

我想解决一个尚未解决的问题:如何处理奇数位。

您不能将单个位写入文件,只能写入字节。文件大小始终为全字节,即使Java可以处理文件大小为小数部分的文件,文件系统也无法处理。

为了输出的最后几个数字可能会或可能不会是一个完整的8,你可以做这样的事情:

for (int j = 0; j < bits.length(); j += 8) { 
     int b; 
     if (j + 8 < bits.length()) 
     { 
      b = Integer.parseInt(bits.substring(j, j + 8), 2); 
     } 
     else 
     { 
      b = Integer.parseInt(bits.substring(j), 2); 
     } 
     dso.write(b); 
    } 

现在你substring不会熄灭的字符串的结尾。

至于如何区分以“00001111”结尾的字符串与以“1111”结尾的字符串(它们具有相同的字节值)之间的区别,也许您可​​以在文件的开头写入一个字节值bits.length % 8。这会让你知道如何处理最后一个字节。例如,如果它是6,那么你知道1111确实是“001111”而不是“1111”。如果它是4,那么它确实是“1111”。

相关问题