Странное поведение объекта RandomAccessFile

Вот фрагмент кода, который ведет себя странно.

    private void saveToFile() throws IOException {
    JFileChooser fileChooser = new JFileChooser();
    File name = null;

        int returnVal = fileChooser.showSaveDialog(fileChooser);

    //Sets the variable name to the file the user selected.
    if (returnVal == JFileChooser.APPROVE_OPTION) {
             name = fileChooser.getSelectedFile();
        //Exits the method if the user selected cancel in the dialog box.
    }else if (returnVal == JFileChooser.CANCEL_OPTION) {
             return;
        }

    //Writes the text data to a file.
    try {
        //Writes the text in the textArea to the file which was selected.
        RandomAccessFile raf = new RandomAccessFile(name, "rw");
        raf.writeBytes(textArea.getText());
        raf.close();
    //Display the stack trace and an error message if the file could not be written.
    } catch (IOException e) {
        e.printStackTrace();
        System.err.print("    Cannot process file....\n");
    }

        //Displays the filename of which the file was saved to.
    String fileName = name.getName();
        super.setTitle("XText: " + fileName);

    //The text has now been saved and is no longer considered changed.
    changed = false;
}

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

Текст открытого файла.

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

Изменился на.

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

Текст в сохраненном файле. Открыт в другом редакторе.

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

ленивые собаки обратно.
Быстрая коричневая лиса перепрыгнула через ленивых псов назад.
Быстрая коричневая лиса перепрыгнула через ленивых псов назад.

Текст сохраняется нормально, если он сохраняется в новый файл. Спасибо за вашу помощь.

12.10.2009 22:58:38
1 ОТВЕТ

Почему вы ожидаете, что оно будет усечено для вас? Вы открываете существующий файл (например, размер 1000) для записи, записываете (например) 800 байт туда - размер по-прежнему 1000, только последние 200 теперь содержат мусор!

Попробуйте file.setLength (0) сразу после открытия, если хотите использовать файл с произвольным доступом.

В противном случае я бы предложил:

FileWriter fw = new FileWriter(name);
fw.write(text);
fw.close();
2
12.10.2009 23:04:44
Отлично. Это был своего рода ответ, который я надеялся получить. Мой инструктор нашел решение file.setLength (0) после того, как я опубликовал свою проблему. Я не забуду использовать file.setLength (0), если я буду использовать объект RandomAccessFile в будущем. Интересно, почему API для этого объекта ничего не говорит о необходимости этого делать, или я просто слеп в одном глазу и не вижу другого. Спасибо за вашу помощь.
user188721 13.10.2009 04:33:58
Комментарии API не говорят так, потому что они предполагают, что вы используете RandomAccessFile по причине. Потому что обычно это не первый выбор для записи файла.
Vladimir Dyuzhev 13.10.2009 12:18:04