如何将二进制文件读取为二进制字符java

时间:2013-09-20 21:34:20

标签: java string binary char binaryfiles

我有一个二进制文件,我需要读取并保存为字符或0和1的字符串,其顺序与它们在二进制文件中的顺序相同。我目前能够读取二进制文件,但无法获得0和1。这是我目前使用的代码:

public void read()
{
    try
    {
        byte[] buffer = new byte[(int)infile.length()];
        FileInputStream inputStream = new FileInputStream(infile);

        int total = 0;
        int nRead = 0;
        while((nRead = inputStream.read(buffer)) != -1)
        {
            System.out.println(new String(buffer));
            total += nRead;
        }
        inputStream.close();
        System.out.println(total);
    }
    catch(FileNotFoundException ex)
    {
        System.out.println("File not found.");
    }

    catch(IOException ex)
    {
        System.out.println(ex);
    }
}  

以及使用二进制文件运行它的输出:

 �, �¨Ã �¨Êà   
�!Cˇ¯åaÃ!Dˇ¸åÇÃ�"( ≠EÃ!J�H���û�������  
����������������������������������������������������������������������������������������  
156

感谢您提供任何帮助。

4 个答案:

答案 0 :(得分:0)

结帐String to binary output in Java。基本上你需要获取String,将其转换为字节数组,并将每个字节打印为二进制字符串。

答案 1 :(得分:0)

不是将字节直接转换为字符然后打印它们,而是将每个字节转换为二进制字符串并将其打印出来。换句话说,替换

System.out.println(new String(buffer));

for (int i = 0; i<nRead; i++) {
    String bin=Integer.toBinaryString(0xFF & buffer[i] | 0x100).substring(1);
    System.out.println(bin);
}

请注意,每个字节的位都以big-endian顺序打印。无法知道位是否实际按顺序存储在磁盘上。

答案 2 :(得分:0)

即使此响应在C中,您也可以使用JNI从Java程序本机访问它。

由于它们是二进制格式,因此您将无法读取它。我会这样做。

fstream fs;
int value; //Since you are reading bytes, change accordingly.
fs.open( fileName, is.in | is.binary );

fs.read((char *) &value, sizeof(int));

while(!fs.eof())
{
    //Print or do something with value
    fs.read((char *) &value, sizeof(long));
}           

答案 3 :(得分:0)

使用JBBP这样的操作将非常容易

public static final void main(final String ... args) throws Exception {
    try (InputStream inStream = ClassLoader.getSystemClassLoader().getResourceAsStream("somefile.txt")) {
      class Bits { @Bin(type = BinType.BIT_ARRAY) byte [] bits; }
      for(final byte b : JBBPParser.prepare("bit [_] bits;",JBBPBitOrder.MSB0).parse(inStream).mapTo(Bits.class).bits)
        System.out.print(b != 0 ? "1" : "0");
    }
  }

但它不会处理大文件,因为解析数据将在操作期间缓存在内存中