阅读结构化二进制文件

时间:2013-04-17 21:41:33

标签: java file datainputstream

我想用Java读取二进制文件。我知道该文件包含一系列数据结构:ANSI ASCII字节字符串,整数,ANSI ASCII字节字符串。即使我们假设已知数据结构的数量(N),我如何读取和获取文件的数据?我看到接口DataInput有一个读取字符串的方法readUTF(),但它使用UTF-8格式。我们怎样才能处理ASCII格式?

3 个答案:

答案 0 :(得分:0)

我认为最灵活(最有效)的方法是:

  1. 打开FileInputStream
  2. 使用流的FileChannel方法获取getChannel()
  3. 使用频道的MappedByteBuffer方法将频道映射到map()
  4. 通过缓冲区的各种get*方法访问数据。

答案 1 :(得分:0)

public static void main(String[] args) throws Exception {
    int n = 10;
    InputStream is = new FileInputStream("bin");
    for (int i = 0; i < n; i++) {
        String s1 = readAscii(is);
        int i1 = readInt(is);
        String s2 = readAscii(is);
    }
}

static String readAscii(InputStream is) throws IOException, EOFException,
        UnsupportedEncodingException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    for (int b; (b = is.read()) != 0;) {
        if (b == -1) {
            throw new EOFException();
        }
        out.write(b);
    }
    return new String(out.toByteArray(), "ASCII");
}

static int readInt(InputStream is) throws IOException {
    byte[] buf = new byte[4];
    int n = is.read(buf);
    if (n < 4) {
        throw new EOFException();
    }
    ByteBuffer bbf = ByteBuffer.wrap(buf);
    bbf.order(ByteOrder.LITTLE_ENDIAN);
    return bbf.getInt();
}

答案 2 :(得分:0)

  

我们如何处理ASCII的情况?

您可以使用readFully()来处理它。

NB readUTF()是由DataOutput.writeUTF()创建的特定格式,而不是我所知道的其他格式。