2015-09-29 3 views
0

Я пытаюсь написать сортировку внешнего слияния, но кажется, что я не могу создать второй DataInputStream для файла, если я уже закрыл первый. Например:Java DataInputStream Scope

public class test { 
    private static DataInputStream createInputStream(RandomAccessFile f) 
      throws FileNotFoundException, IOException { 
     return new DataInputStream(new BufferedInputStream(new FileInputStream(
       f.getFD()))); 
    } 
    private static int readInt(RandomAccessFile file) throws IOException{ 
     DataInputStream istream = createInputStream(file); 
     int i = istream.readInt(); 
     istream.close(); 
     return i; 
    } 
    public static void main(String[] args) throws IOException{ 
     RandomAccessFile file = new RandomAccessFile(args[0], "rw"); 
     for(int j = 0; j < 10; j++){ 
      System.out.println(readInt(file)); 
     } 
    } 
} 

Когда я запускаю это, я получаю один номер из а затем получить следующее сообщение об ошибке:

java.io.IOException: Stream Closed 
    at java.io.FileInputStream.readBytes(Native Method) 
    at java.io.FileInputStream.read(FileInputStream.java:255) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:265) 
    at java.io.DataInputStream.readInt(DataInputStream.java:387) 
    at uk.ac.cam.av429.fjava.tick0.test.readInt(test.java:19) 
    at uk.ac.cam.av429.fjava.tick0.test.main(test.java:26) 

Как я могу создать несколько независимых потоков для файла или я должен использовать один?

ответ

1

Сообщение об ошибке немного вводит в заблуждение. По всей вероятности, проблема заключается в том, что при закрытии первого потока это приводит к закрытию базового RandomAccessFile - или, по крайней мере, к его основным ресурсам.

В качестве альтернативы, также возможно, что первый поток потребляет все данные из текущей позиции RAF до конца, так что читать нечего. Это сделало бы это из-за вашей вставки BufferedInputStream в гнездо потоков. Ожидается, что BIS будет читать дальше, чтобы заполнить свой буфер, а когда вы закроете его, буферизованные данные будут потеряны.

В любом случае, вы не должны так поступать. Вместо создания нового потока каждый раз создайте один поток и повторно используйте его. Просто прочитайте каждую последующую часть данных из одного потока.

+0

Спасибо. Знаете ли вы, где я могу читать информацию о перемещении позиции потока в файле? – Rizhiy

+0

Насколько я могу судить, ваш существующий код предназначен для последовательного обработки файла, начиная с самого начала. Для этого подходит поток, и вам не нужно делать какое-либо ручное позиционирование в этом случае. Если вместо этого вы хотите перескакивать в файле, как это делает «RandomAccessFile» (см. Метод 'seek()'), вы должны использовать RAF напрямую. В этом конкретном случае, похоже, что метод 'readInt()' был бы вам полезен. –

Смежные вопросы