Странное поведение объекта RandomAccessFile - PullRequest
0 голосов
/ 13 октября 2009

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

    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 текстовых примера.

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

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

Изменено на.

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

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

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

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

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

1 Ответ

2 голосов
/ 13 октября 2009

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

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

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

FileWriter fw = new FileWriter(name);
fw.write(text);
fw.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...