【问题标题】:Extract data from binary file with java用java从二进制文件中提取数据
【发布时间】:2016-01-10 04:45:26
【问题描述】:

我想创建一个包含检查目录文件的二进制文件,例如 one 我尝试使用此代码读取此文件

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ZeroFileDecryptor {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String file_name = "0";
        try {
            
            FileInputStream fos = new FileInputStream(file_name);
            DataInputStream os = new DataInputStream(fos);
            
            System.out.println("os read");
            
            // Header
            System.out.println(os.readShort());
            System.out.println(os.readInt());
            
            // 0 file size
            System.out.println(os.readInt());
            
            // separator
            System.out.println(os.readShort());
            
            // 1 folder path - custom description
            System.out.println(os.readUTF());
            
            os.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

它包含标题、文件大小、分隔符(不确定)、包含文件的文件的路径、校验和 crc32(不确定)和循环抛出文件文件名 - 文件扩展名 - 文件名 - 文件校验和crc32(不确定)当使用 os.readUTF() 读取文件名时,我得到了 java.io.UTFDataFormatException。 这是解析这个文件的正确方法吗? 我怎样才能得到缺失值? 如何读取文件名而不出错?

【问题讨论】:

  • 看看这个链接是否有帮助:devmanuals.com/tutorials/java/corejava/files/…
  • @ravindra OP 正在尝试解析文件中的数据,而不是简单地将其写入另一个流。
  • @ravindra 谢谢,但链接是将数据原样复制到输出文件中,我想要了解逻辑(通过解析现有文件)并能够生成这样的文件
  • 如果您不确定,请找出答案。通过数据文件猜测你的方式会给你带来麻烦,即使在它“似乎工作”的情况下也是如此。然后阅读the methods of DataInputreadUTF() 需要特定的字节序列,您的文件不遵守。
  • @VGR 当我说不确定时,文件结构并不复杂,我不确定 100% 只是 80%。如果我不能使用 readUTF() 你知道另一种正确解析文件的方法吗?谢谢

标签: java file binary ascii extract


【解决方案1】:

你不需要知道文件名的长度来准确读取它吗?

无论如何,我建议查看this question 关于读取二进制文件的信息。基本上:将文件的一部分(或整个文件)读入字节数组,然后您可以使用它将字节转换为更合理的数据类型。所以你可以为文件名这样做:

byte[] bytes = new bytes[filenameLength];
try {
    fos.read(bytes);
} catch(IOException e) {
}
String filename = new String(bytes);

【讨论】:

  • 谢谢,我会试试的
猜你喜欢
  • 2018-01-16
  • 2014-02-15
  • 2017-11-20
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 2018-01-26
  • 1970-01-01
相关资源
最近更新 更多