2011-08-22 42 views
0

我正在讀取文件中的數字以執行合併排序。合併排序必須作爲外部排序來執行,因爲它是一個龐大的數字列表,並且只有很少的主內存可用。我有一個工作實現,它使用BufferedOutputStream來加速輸出,並且我想對輸入流執行相同的操作。但是,輸入必須從兩個不同的地方讀取才能執行合併。如何使用Java中的Buffered IO從文件中的兩個不同位置讀取

從本質上講,如果我有:

RandomAccessFile File = new RandomAccessFile("File.dat", "rw"); 
BufferedInputStream Buffer = new BufferedInputStream(
    new FileInputStream(File.getFD())); 
DataInputStream InputStream = new DataInputStream(Buffer); 

和我讀到使用InputStream.readInt()一些整數,但也想用File.seek(n)訪問該文件,我怎麼知道的其他部分時,該文件將下一個被稱爲獲取更多數據,因此在獲得更多數據之前先回頭查詢。另外,是否有可能有兩個RandomAccessFiles,相同的底層文件?

+1

「是有可能有兩個RandomAccessFiles,對於相同的基礎文件?」是。讀寫可能會很棘手,但對於只讀應該沒有問題。 – Thilo

+0

你可以發表我如何將兩個隨機訪問文件附加到同一個底層文件的例子嗎?我的Java有點搖搖欲墜 – ForbesLindesay

+0

P.S.我正在寫一個單獨的文件(即一個文件要讀取,另一個要寫入) – ForbesLindesay

回答

0

對於其他人誰需要做同樣的事情,下面是用兩種不同的bufferedInputStreams和RandomAccessFiles從流中讀取一個例子:

 RandomAccessFile FileA = new RandomAccessFile("File.dat", "rw"); 
     System.out.println("Writing 100"); 
     for (int i = 0; i < 100; i++) { 
      FileA.writeInt(i); 
     } 
     FileA = new RandomAccessFile("File.dat", "r"); 
     RandomAccessFile FileB = new RandomAccessFile("File.dat", "r"); 


     FileA.seek(0); 
     DataInputStream InputStreamA = new DataInputStream(new BufferedInputStream(
       new FileInputStream(FileA.getFD()))); 

     FileB.seek(0); 
     DataInputStream InputStreamB = new DataInputStream(new BufferedInputStream(
       new FileInputStream(FileB.getFD()))); 


     System.out.println("Read A"); 
     for (int i = 0; i < 10; i++) { 
      System.out.println(InputStreamA.readInt()); 
     } 

     System.out.println("Read B"); 
     for (int i = 0; i < 10; i++) { 
      System.out.println(InputStreamB.readInt()); 
     } 

     System.out.println("Run A"); 
     for (int i = 0; i < 10; i++) { 
      System.out.println(InputStreamA.readInt()); 
     } 

     System.out.println("Run B"); 
     for (int i = 0; i < 10; i++) { 
      System.out.println(InputStreamB.readInt()); 
     } 
相關問題