2015-07-29 4 views
0

Итак, я создаю базу данных для игр для школьного проекта с использованием файла произвольного доступа. Я почти уверен, что у меня есть основы, и я перечитываю код миллион раз, я просто не могу найти, что не так, правильно прочитав байты случайного доступа. Я вычислил значения для каждого слова несколько раз, чтобы удвоить проверить тоже ...java.io.EOFException Брошено каждый раз, когда я читал RandomAccessFile

Мой главный метод:

public static void main(String[] args) { 
    RAFProcessing raf = new RAFProcessing(); 
    try { 
     RandomAccessFile file = new RandomAccessFile(new File(
       "src/FirstTry/database.txt"), "rw"); 

     raf.writeRecord("Fifa", "EA", 2001, file); 

     raf.readRecord(file); 

     file.close(); 
    } 

    catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

Запись данных + байт между ними:

public void writeRecord(String gameName, String publisher, int year, RandomAccessFile file) throws IOException 
{ 
    Long fileSize = file.length(); 
    file.seek(fileSize); 

    file.writeUTF(gameName); 
    for(int loop=0; loop<20-gameName.length(); loop++) 
    { 
     file.writeByte(20); 
    } 

    file.writeUTF(publisher); 
    for(int loop=0; loop<20-publisher.length(); loop++) 
    { 
     file.writeByte(20); 
    } 

    file.writeInt(year); 
} 

Долина размер 48 (22 + 22 + 4)

читаешь г Данные и Б

public void readRecord(RandomAccessFile file) throws IOException 
{ 
    file.seek(0); 
    String wholeRecord =""; 
    int totalRecord = (int) (file.length()/SIZE); 
    System.out.print(totalRecord); 
    String gameName, publisher; 
    int year; 


    for(int loop=0; loop< totalRecord; loop++) 
    { 
     gameName = file.readUTF(); 
     for(int innerloop=0; innerloop<20-gameName.length(); loop++) 
     { 
      file.readByte(); 
     } 

     publisher = file.readUTF(); 
     for(int innerloop=0; innerloop<20-publisher.length(); loop++) 
     { 
      file.readByte(); 
     } 

     year = file.readInt(); 

     wholeRecord += "|Game Name:" + gameName + " | Publisher: " + publisher + " | Year Published: " + year + "\n"; 
    } 

    System.out.println(wholeRecord); 
} 
+0

Все, что находится в каталоге 'src', будет недоступно при экспорте вашей программы. В большинстве IDE они будут включены как встроенные ресурсы в файл Jar приложений, что делает их только для чтения ... Если вам нужен доступ для чтения/записи к файлу, вам нужно поместить файл во внешнее местоположение (за пределами из Jar) – MadProgrammer

+0

@MadProgrammer Я переместил database.txt за пределы папки src и по-прежнему получаю ту же проблему –

ответ

0
for (int innerloop = 0; innerloop < 20 - gameName.length(); loop++) 

Проблема здесь. Это должно быть:

for (int innerloop = 0; innerloop < 20 - gameName.length(); innerloop++) 

(дважды).

Однако:

  1. SIZE является недопустимым предположение. Вы не можете предположить, что представление строки writeUTF() использует то же количество байтов, что и символы в строке, плюс 2 для слова длины.
  2. Было бы проще с точки зрения кодирования просто проложить строку с пробелами до, написав их, и обрезать их после прочтения. Но вы все еще не можете предположить, что каждая запись будет такого же размера.
  3. Файл, содержащий writeUTF() и writeInt() данные не являются текстовыми и не должны иметь расширение .txt.