RandomAccessFile: добавление пробела после последнего элемента?

Я пишу программу, которая позволяет пользователю писать в текстовый файл, используя randomaccessfile. Пользователь вводит имя, возраст и адрес, и каждый из этих элементов занимает 20 байт, поэтому длина записи составляет 60 байт. Когда пользователь хочет найти запись, он вводит номер записи, программа переходит к поиску (n * 60), и эти 60 байтов сохраняются в массиве байтов, а затем выводятся. Это работает нормально, за исключением случаев, когда пользователю нужна последняя запись. Я не могу найти способ добавить дополнительный пробел после имени, возраста, адреса, чтобы заполнить 60 байт. Я получаю сообщение об ошибке java.io.EOFException: null из-за этого.

Вот код, который я использую для записи в файл:

      while(!done){
        junk.seek(y);
        System.out.println("Enter name.");
        junk.writeBytes(sc.nextLine());
        y+=20;
        System.out.println("Enter age.");
        junk.seek(y);
        junk.writeBytes(sc.nextLine());
        y+=20;
        System.out.println("Enter city.");
        junk.seek(y);
        junk.writeBytes(sc.nextLine());
        y+=20;
        System.out.println("Are you done?(Y/N)");
        choice = sc.nextLine();
        if(choice.equalsIgnoreCase("Y")){
            done = true;
        }

Итак, как я могу добавить дополнительное пустое пространство после последнего элемента в текстовом файле?


person TheEyesHaveIt    schedule 17.10.2013    source источник


Ответы (1)


Во-первых, почему вы отводите возрасту 20 байт?! это очень много для этого, ваши пользователи живут годами и годами!? Возможная ошибка будет для последней вставки данных (когда пользователь говорит, что нет никаких данных N) для города, потому что, если вы вставите, например, new york, пока это не получит 20 байтов, поэтому последний раздел будет меньше 60 байтов и наоборот, если пользователь вводит a very far far far city with friend batman, когда это больше 20 байт, он расширяет данные.

поэтому для решения вы должны убедиться, что последние данные также должны быть 20 байт.

while(!done){
        junk.seek(y);
        System.out.println("Enter name.");
        junk.writeBytes(sc.nextLine());
        y+=20;
        System.out.println("Enter age.");
        junk.seek(y);
        junk.writeBytes(sc.nextLine());
        y+=20;
        System.out.println("Enter city.");
        junk.seek(y);
        String city=sc.nextLine();
        System.out.println("Are you done?(Y/N)");
        choice = sc.nextLine();
        if(choice.equalsIgnoreCase("Y")){
            if(city.length()>20){city-city.substring(0,20);}
            else if(city.length()<20){city=city+new String(new byte[20-city.length()]);}
            done = true;
        }
        junk.writeBytes(city);
        y+=20;
}

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

person Community    schedule 17.10.2013
comment
Я понял, что это исправляет использование символа заполнения, такого как #, вместо пустого места. Но спасибо, и я просто выбрал 20 байт для простоты, так как это мой первый раз, спасибо! - person TheEyesHaveIt; 18.10.2013