所以我有一个包含数千个1和0的字符串,我想以二进制形式保存到文件中(因此文件大小很小)。不幸的是,如果没有遇到NumberFormatExceptions,我无法弄清楚如何做到这一点。
我已经尝试过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 :(得分:2)
如果您只想写字节,请不要用DataOutputStream
换行。
完成后,您还应该使用try-with-resources关闭文件流。
解析8位时,需要指定基数2,否则你要解析基数为10的数字,而不是二进制数。
解析用于有符号数字,因此,由于您使用的是8位无符号字节,因此应解析为int
,而不是byte
。 1
您不应使用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");
}
1 parseByte(s, 2)
是一个已签名的解析,因此它支持"-10000000"
(-128 10 )和"01111111"
之间的值(127 <子> 10 子>)。以1
开头的任何8位二进制数都将失败,并显示java.lang.NumberFormatException: Value out of range. Value:"11111111" Radix:2
答案 1 :(得分: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”。