2014-10-26 7 views
0

Я пытаюсь настроить цикл while, который будет считываться из RandomAccessFile и останавливаться, когда он достигнет конца файла. Но каждый раз, когда я пытаюсь запустить программу, я получаю сообщение об ошибке.Чтение из файла произвольного доступа в Java

RandomAccessFile raf = new RandomAccessFile(filename, "rw"); 
    final int EOF = -1; 

    while(raf.readInt() != EOF){ 

    id = raf.readInt(); 
    existingMileage = raf.readInt(); 
    gasCost = raf.readInt(); 
    ndays = raf.readInt(); 
    rate = raf.readInt(); 
    totalCharge = raf.readInt(); 
    discount = raf.readInt(); 
    tax = raf.readInt(); 
    netCharge = raf.readInt(); 
    returnMileage = raf.readInt(); 

    } 

Это ошибка я получаю:

Exception in thread "main" java.io.EOFException 
at java.io.RandomAccessFile.readInt(Unknown Source) 
at TakeHome.TakeHome.fileReaderMethod(TakeHome.java:127) 
at TakeHome.TakeHome.main(TakeHome.java:20) 
+0

Вы уверены, что ваш 'filename' является правильный путь к файлу? – tomishomo

+0

Это похоже на то, что ваш файл был прерван до того, как он получит это количество int, чтобы прочитать – gerrytan

ответ

3
final int EOF = -1; 

Вы сделали, что до. Это не в Джавадоке. Метод readInt() не возвращает -1 в конце файла. Это невозможно. -1 - внутриполосное значение. Он бросает очень EOFException, которые вы получаете.

Вы также бросаете int, который вы читаете на экзамене EOF, так что вы добираетесь до конца файла раньше, чем вы должны быть.

Вы должны контактировать while (true), поймать EOFException и перерыв, когда вы его поймаете.

+0

Можете ли вы, пожалуйста, показать мне, что вы имеете в виду? Какой аргумент я должен использовать? –

+0

Какая часть 'loop' while (true) '...' и т. Д., Вы не понимаете? И о каком аргументе вы говорите? – EJP

+0

Вы имеете в виду, что я должен это сделать? 'while (raf.readInt() == -1)' –

-1

Файл, который вы читаете, также должен быть создан как двоичный файл. Если вы пытаетесь прочитать из файла, который вы создали как текст, читатель прочитает 4 байта для int и, например, если у вас есть последовательность чисел 12345678, читатель не знает, что это отдельные числа и будет обрабатывать это как одно целое, а затем перейти к концу файла. Другое дело, что вам нужно поймать EOFException, чтобы закончить цикл. -1 также может быть целым числом.

Надеюсь, что это поможет.

EDIT: Попробуйте

RandomAccessFile raf = new RandomAccessFile(new File("/path/to/file"), "rw"); 
     int numberCounter = 0; 
     int totalNumbers = 10; 
     for (int i = 0; i < totalNumbers; i++) 
     { 
      raf.writeInt(i * 2); 
     } 

     raf.seek(0); 

     try 
     { 
      while (true) 
      { 
       int id = raf.readInt(); 
       System.out.println(id); 
       numberCounter++; 

      } 
     } 
     catch (EOFException ex) 
     { 
      System.out.println("Total number " + numberCounter); 
      System.out.println("End of file reached!"); 
     } 
     finally 
     { 
      raf.close(); 
     } 

Выход:

0 
2 
4 
6 
8 
10 
12 
14 
16 
18 
Total number 10 
End of file reached! 
+0

Нет никаких доказательств того, что он не использует двоичный файл. – EJP

+0

Нет, но я просто попытался угадать распространенную ошибку. – CMOS

+1

Не нужно гадать. Вы правильно определили одну проблему. Не нужно тратить остальные 95% вашего ответа на простое предположение. – EJP

-1

Это один способ справиться с RandomAccessFile:

RandomAccessFile file = new RandomAccessFile("testFile", "r"); 

//random code in between 

while(true){ 
    try{ 
     //do stuff with code, like reading from file 
    } catch(EOFException e){ 
     break; 
    } 
} 

//do some more stuff if you like 

file.close(); 
Смежные вопросы