2013-04-17 262 views
0

我想用Java讀取二進制文件。我知道該文件包含一系列數據結構,如:ANSI ASCII字節字符串,Integer,ANSI ASCII字節字符串。即使假設數據結構的數量已知(N),我如何讀取和獲取文件的數據?我看到接口DataInput有一個讀取字符串的方法readUTF(),但它使用UTF-8格式。我們如何處理ASCII碼的情況?閱讀結構化二進制文件

回答

0

最靈活(高效的)的做法,我認爲是:

  1. 打開FileInputStream
  2. 使用流的getChannel()方法獲取FileChannel
  3. 使用頻道的map()方法將頻道映射到MappedByteBuffer
  4. 通過緩衝區的各種get*方法訪問數據。
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(); 
} 
+0

單純的代碼不是答案。你必須解釋它,並解釋它是如何回答這個問題的。 – EJP

0

我們如何處理ASCII的情況下?

你可以用readFully()來處理它。

NB readUTF()用於由DataOutput.writeUTF()創建的特定格式,以及我沒有意識到的其他任何內容。