如何在二进制文件-java中写入一个单字节值

时间:2015-01-09 15:49:00

标签: java readfile writetofile

我已经尝试了很多方法来编写一个程序:在文件中写入一个字节值,例如在文件中写入01010101 ..然后我想读取文件并打印我的内容所以它应该显示01010101.我的代码都没有。有帮助吗? 因为我正在编写一个压缩程序,所以必须是1个字节而不是8个

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.File;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main2 {
    public static void main(String[] args) throws Exception {
        DataOutputStream dos = new DataOutputStream(new FileOutputStream("Text.t"));
        dos.writeBytes(String.valueOf(01010101));
        File file = new File("Text.t");
        BufferedReader br = new BufferedReader(
            new InputStreamReader(
                new FileInputStream(file)));
        System.out.println(br.readLine());
        dos.close();
        br.close();

    }
}

它适用于二进制代码,它与1一起但不是0 ...例如对于01010101它显示266305

2 个答案:

答案 0 :(得分:3)

问题是“它与二进制代码一起使用,其中有一个但是为0而不是...例如对于01010101它显示为266305”是01010101是一个octal literal并且被读入编译器为base-8 (aka Octal)

在写文字时使用1010101 - 前导零对数字毫无意义;但它们确实意味着如何解析Java代码!

显示为“00xyz”的十进制数通常是zero-padded,它应用于字符串表示;数字本身就是xyz。


从评论中我相信所需的操作是使用binary literal。您必须使用"bit converter"发出此信号以按预期显示 - 位转换器将采用例如的值。 0b11(整数3)并将其转换为字符串“11”。您可能还希望应用具有假定输出宽度的填充 - 再次,0b01 == 0b1,前导0对整数没有任何意义。

以下将发出霍夫曼位序列的十进制字符串表示,没有任何前导零。但是,如果与上述配对,则可以让您离开右侧轨道。

 dos.writeBytes(String.valueOf(0b01001010));

答案 1 :(得分:0)

我会使用字节表示基数2,例如Byte.parseByte("00010001", 2)。 但问题是Java的原语是带符号的数字,因此它不适用于负值(当第一个数字为1时),因此Byte.parseByte("10010011", 2)将抛出NumberFormatException

这里的技巧是最初替换前导数字(如果它是1,带0),解析它然后再将该位设置为1.然后将该字节存储到您的文件中。

private static byte binaryStringToByte(String s) {
    //also check for null, length = 8, contain 0/1 only etc.
    if (s.startsWith("0")) {
        return Byte.parseByte(s, 2);
    } else {
        StringBuilder sBuilder = new StringBuilder(s);
        sBuilder.setCharAt(0, '0');
        byte temp = Byte.parseByte(sBuilder.toString(), 2);
        return (byte) (temp | (1 << 7));
    }
}

然后,要获取字节的二进制字符串表示形式,请使用以下代码:

byte b = binaryStringToByte("10001000");
String s1 = String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0');