Запись в файл

 
 
 
Сообщения:102
Начал изучение потоков ввода-вывода по книге Хорстманна. Возникло пару вопросов.

1. Как лучше записывать строки или символы, числа в файл?

так:
        //Запись в файл способом №1
        try (FileWriter out = new FileWriter("C:/str.txt")) {
            out.write(str1);
        }


или так:
        //Запись в файл способом №3
        try (PrintWriter out2 = new PrintWriter("str2.txt")) {
            out2.println(str1);
        }


И еще я правильно понимаю что когда данные записываются в файл надо использовать блок try так как классы PrintWriter, FileWriter и другие классы потоков ввода/вывода содержат метод run(), который может выбрасывать исключения типа InterruptedException?
 
 
Сообщения:102
Подскажите еще есть ли способ проще скопировать данные из одного файла другой чем этот

        //Получаем путь к файлу, в который будем записывать строку str2
        String str2Path = "C:" + separator + "files" + separator + "file2.txt";

        //Получаем путь к файлу, в который будем записывать данные из одного файла в другой
        String str3Path = "C:" + separator + "files" + separator + "file3.txt";

        //Поток чтения данных из файла
        BufferedReader in3 = new BufferedReader(new InputStreamReader(new FileInputStream(str2Path)));
        //Поток записи в другой файл
        PrintWriter out3 = new PrintWriter(new FileWriter(str3Path), true);

        String newStr3;
        while ((newStr3 = in3.readLine()) != null) {
            try {
                out3.println(newStr3);
            } catch (Exception e) {

            }
        }
 
 
Сообщения:888
http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#copy(java.nio.file.Path,%20java.nio.file.Path,%20java.nio.file.CopyOption...)
 
 
Сообщения:315
kolhoz:
Как лучше записывать строки или символы, числа в файл?

Зависит от условий. Если "надежно" - первым способом. Если "и так сойдет" - вторым. Варианты отличаются обработкой ошибок. Например, на диске закончилось место. В первом случае будет IOException, во втором - код выполнится успешно, но данные будут потеряны.
В большинстве случаев используется первый вариант. Исключение будет перехвачено и записано в лог/выведено на консоль и т.п. Потом будет проще разобраться, почему же в файле нет нужных данных.

kolhoz:
И еще я правильно понимаю что когда данные записываются в файл надо использовать блок try так как классы PrintWriter, FileWriter и другие классы потоков ввода/вывода содержат метод run(), который может выбрасывать исключения типа InterruptedException?

Нет. Они не содержат run. И метод run не выбрасывает обычно InterruptedException. Это откуда-то из другой главы :)

В вашем примере try (это try-with-resources) нужен, чтобы файл был закрыт после завершения блока (вне зависимости от успешности этого завершения). Если файл не закрыть, системные ресурсы не будут освобождены некоторое время. В частности, данные могут быть не сброшены на диск. А при активной работе можно достигнуть предела открытых файлов и все попытки приложения открыть еще один файл будут приводить к IOException.

kolhoz:
Подскажите еще есть ли способ проще скопировать данные из одного файла другой чем этот

Роман очень хороший вариант привел. А если по старинке (и произвольных потоков, где нет готовых методов копирования) это делается без лишних конвертаций в строки (там и данные можно потерять):

final byte[] buffer = new byte[65536];
int size;
try (
    final InputStream source = new FileInputStream(srcFile),
    final OutputStream destination = new BufferedOutputStream(new FileOutputStream(dstFile))) {
  while ((size = source.read(buffer) > 0) {
    destination.write(buffer, 0, size)
  }
}
 
 
Сообщения:102
Спасибо. Я пока простыми методами хочу посмотреть получается или нет. Написал по вашему примеру такой метод, но он почему-то не копирует данные в файл. Не подскажете почему?

    public static void copyFileData(String fileSource, String fileDestination) throws IOException {
        final byte[] buffer = new byte[4096];
        int size = 0;
        try {
            final InputStream source = new FileInputStream(fileSource);
            final OutputStream destination = new BufferedOutputStream(new FileOutputStream(fileDestination));
            while ((size = source.read(buffer)) != -1) {
                destination.write(buffer, 0, size);
            }
        } catch (Exception e) {

        }
    }
Изменен:17 дек 2015 06:31
 
 
Сообщения:1701
Почему не закрываете в потоке? Почему ничего не пишете в блоке catch (Exception e) {?
 
 
Сообщения:102
прописал в try destination.close(); записывает. В catch что писать?
Изменен:17 дек 2015 07:23
 
 
Сообщения:1701
Пишите ошибку. Есть же например метод e.printStackTrace() или e.getMessage() если вам лень, ещё можно что-нибудь от себя добавить.
 
 
Сообщения:102
понял, спасибо
 
 
Сообщения:948
kolhoz:
прописал в try destination.close(); записывает. В catch что писать?

destination.close(); в finaly.
и почитай про try with resources.
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет