2014-09-21 2 views
0

Я пытаюсь использовать класс RandomAccessFile, но у меня есть проблема со строками.Конец строки StringBuilder в RandomAccessFile

Это первая часть. Написать в Файл:

public static void main(String[] args) throws IOException { 
    File file = new File("/home/pep/java/randomFile.dat"); 
    RandomAccessFile fitxerAleatori = new RandomAccessFile(file, "rw"); 

    String[] surnames = { "SMITH", 
      "LOMU" }; 
    int[] dep = { 10, 
      20 }; 
    Double[] salary = { 1200.50, 
      1200.50 }; 

    StringBuilder buffer = null; 
    int n = surnames.length; 

    for (int i = 0; i<n; i++){ 
     randomFile.writeInt(i+1); //ID 
     buffer = new StringBuilder(surnames[i]); 
     buffer.setLength(10); //10 characters 
     randomFile.writeChars(buffer.toString()); 
     randomFile.writeInt(dep[i]); 
     randomFile.writeDouble(salary[i]); 
    } 
    randomFile.close(); 
} 

Во второй части, я стараюсь читать этот файл:

File file = new File("/home/pep/java/randomFile.dat"); 
    RandomAccessFile randomFile = new RandomAccessFile(file, "r"); 

    char[] surname = new char[10]; 
    char aux; 
    int id, dep, pos; 
    Double salary; 

    pos = 0; 

    for (;;) { 
     randomFile.seek(pos); 
     id = randomFile.readInt(); 
     for (int i = 0; i < surname.length; i++) { 
      aux = randomFile.readChar(); 
      surname[i] = aux; 
     } 
     String surnameStr = new String(surname); //HERE IS THE PROBLEM!! 
     dep = randomFile.readInt(); 
     salary = randomFile.readDouble(); 
     System.out.println("ID: " + id + ", Surname: " + surnameStr + ", Departament: " + dep + ", Salary: " + salary); 

     pos = pos + 36; // 4 + 20 + 4 + 8 

     if (randomFile.getFilePointer() == randomFile.length()) 
      break; 
    } 
    randomFile.close(); 
} 

Ну, когда я надеюсь прочитать:

ID: 1, Фамилия: СМИТ Деп: 10, Зарплата: 1200,50

Я RECIVED:

ID: 1, Фамилия: SMITH

Это как в фамилии есть конец строки, потому что если я не отображать фамилию, другая информация верна.

Спасибо!

ответ

0

Проблема была в массиве символов. Меняю де петли для этого прочитать символы:

for (int i = 0; i < surname.length; i++) { 
      aux = randomFile.readChar(); 
      surname[i] = aux != 0 ? aux : ' '; 
     } 
+0

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

1

Откуда: cognom? [Edit: OK, я нашел его. Это каталонский язык для фамилия. И теперь опечатка, исходящая от , декаменто также понятна. : -]

Что вы получаете, если вы вставляете System.out.println(Arrays.toString(surname)) перед проблемной линией? Я предполагаю, что это что-то вроде [S, M, I, T, H, [], [], [], [], []] (в представлении консоли Eclipse). Где [] обозначает квадрат, то есть непечатаемый символ.

Что вы можете получить, если вставляете System.out.println((int) surname[5])? Я предполагаю, что это 0. И я полагаю, что это значение 0 вызывает проблему.

Что вы можете получить, если используете фамилию длиной всего 10 символов?

Подсказка 1: Опечатка Departament.

Подсказка: Дайте System.out.printf(...) шанс в пользу println(...).

Подсказка 3: if в вашем решении может быть сокращена до более элегантно:

cognom[i] = aux != 0 ? aux : ' '; 
+0

cognom -> фамилия – user2592044

+0

System.out.println (Arrays.toString (фамилия)); -> [S, M, I, T, H, – user2592044

+0

System.out.println ((int) surname [5] ]) -> 0 – user2592044

0

Создание StringBuffer и настройки его длину до десяти заставит обнуляет быть написаны для строк короче десяти символов, что в свою очередь вызовет проблемы декодирования, если читать. Было бы намного лучше создать String, нанести его пробелами на десять символов, записать его, а затем вырезать() результирующую строку при ее чтении.

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