2014-01-05 4 views
0

я следующий метод:BufferedWriter преимущества

public void writeToFile(
    String id, 
    String no, 
    int systol, 
    int diastol, 
    int pulsDiff, 
    double speedAvg, 
    double spread 
) { 
    String line = 
    id + "\t" + no + "\t" + systol + "/" + diastol + "\t" + pulsDiff 
    + "\t" + speedAvg + "\t" + spread + "\r\n"; 

    File fil = new File("resultat.txt"); 
    BufferedWriter writer = null; 
    try { 
     writer = new BufferedWriter(new FileWriter(fil, true)); 
     writer.write(line); 
     writer.close(); 
    } catch (Exception e) { 
     System.err.println("Fejl: " + e.getMessage()); 
    } 

Может ли это было сделано по-разному? С помощью разных методов? И в чем преимущества этого?

Im пытается понять преимущество наличия bufferedWriter. Я все еще нахожусь в начале, и я пытаюсь понять это предложение: «

В общем, Writer немедленно отправляет свой вывод на базовый символ или поток байтов. Если приглашение не требуется, рекомендуется обернуть BufferedWriter вокруг любого писателя, чьи записи() операции может быть дорогостоящим, такими как FileWriters и OutputStreamWriters. Например,

PrintWriter out = new PrintWriter(new BufferedWriter(new 
    FileWriter("foo.out"))); 

буферизует выход PrintWriter в к файлу. Без буферизации, каждый вызов принта() метод приведет к преобразованию символов в байты, которые затем будут немедленно записаны в файл, что может быть очень неэффективным.

В частности, «В целом, Writer немедленно отправляет свой результат на базовый символ или байтовый поток».

ответ

-1

Если вы используете конкатенацию операторами +, вы можете создать множество строк, пока не получите окончательный результат: «a» + «b» + «c» + «d» означает, что вы сначала имеете «ab», то вы хотите добавить еще один символ, чтобы получить «abc», и в итоге у вас есть еще одно дополнение, чтобы получить «abcd».

Второй вариант - это ваш способ преодолеть эту неэффективность.

EDIT

Мой ответ переговоры вообще о конкатенации. Как упоминалось в ссылке, приведенной в boxed__l в его комментарии, в некоторых случаях могут быть оптимизации, а затем конкатенация выполняется StringBuilder (даже если это не сделано явно). Однако бывают случаи (например, когда конкатенация выполняется в цикле), когда это имеет значение, и оптимизация компилятором невозможна.

+1

Это неправда. –

+0

@JBNizet Почему бы и нет? Я имею в виду - используя потоки, более эффективно объединять многие строки - нет? –

+1

Сочетание таких строк не создает много строк. Он использует один StringBuilder, добавляет все, а затем вызывает toString(). –

1

Преимущество использования BufferedReader или BufferedWriter является то, что уменьшает количество физической чтение и запись на диск. Он использует систему буферизации и одновременно выполняет чтение/запись. Следовательно, есть большая эффективность. Вы можете попробовать прочитать/записать большой файл с использованием BufferedReader/BufferedWriter и без него и увидеть разницу.

+0

Так можно сказать, что эффективнее время? Я имею в виду, если у меня есть большой файл, он будет быстрее с BufferedReader? И если мне нужно много писать в файле .txt, это будет намного быстрее с BufferedWriter? – user3161344

+0

Ну, из моего личного опыта я могу сказать, что он может ** как минимум ** в два раза быстрее. Я скопировал и вложил файл размером ~ 80 мб с и без него. Результат: С => 9 секунд; Без => 21 секунд. – Astrobleme

+0

@ user3161344 Я думаю, что это должно быть быстрее, потому что вы делаете только один вызов вместо вызовов xxx в управление вашей памятью. Так что это должно быть быстрее. – solvator

4

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

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

И писатель должен быть закрыт в блоке finally или использовать конструкцию try-with-resources, чтобы убедиться, что он всегда закрыт.

+0

Я не совсем уверен, что вы имеете в виду. Im записывает 7 строк в каждую строку в документе .txt. Как предупредить вызывающего абонента и какая разница? Я не совсем уверен, что такое блок finally, и почему автор должен быть закрыт в одном. Разве это не закрыто, когда я только пишу: «writer.close();»? – user3161344

+0

Существует один вызов записи писателю: 'writer.write (line);'. После этого вызова автор немедленно закрывается. Таким образом, буферизация бесполезна. Вы можете напрямую написать эту строку непосредственно в базовом FileWriter. Вызывающий вызов должен быть предупрежден, создавая метод throw IOException, а не поймав его. Reac учебник об исключениях. Разница в том, что вызывающий абонент знал, что возникла проблема, и может рассказать конечному пользователю (путем отображения диалогового окна, печати сообщения или чего-то еще). –

+0

Поэтому мне не нужно использовать writer.close(); поскольку он уже закрыт после writer.write (строка); ? Но он должен уже печатать сообщение об ошибке для конечного пользователя System.err.println? Или я ошибаюсь? – user3161344

1

Представьте, что вы являетесь инструкцией Java, которая ведет переговоры с операционной системой.Без буферизации, ситуация как (сильно упрощены):

Java -> OS: Hello, operating system, I'd like to write character c to file F 
OS -> HDD : Hello, disk, please append character c to file F 
HDD -> OS after a few milliseconds : I'm done. 
OS -> Java : Done 

Если вы пишете много символов в файле, это сообщение не нужно - они все еще говорим о том же, что пустая трата времени! Вот почему мы используем буферы. См. Изменение ситуации:

Java -> OS: Hello, operating system, I'd like to write bunch of characters c[] to file F 
OS -> HDD : Hello, disk, please append characters c[] to file F 
HDD -> OS after a few tens of milliseconds : I'm done. 
OS -> Java : Done 

Период. Весь механизм, весь диск ищет и так далее, вызывается только один раз.

+0

Так что же делают exatcly буферы? Он пропускает все операции с шаблоном и использует только однократную операцию? – solvator

+0

Должен сказать, мне очень понравилось это объяснение :) Но скажем, что ситуация такая же, как и в части 2, где я хочу написать много символов в файл, но на этот раз у меня нет буфера. Будет ли HDD принимать каждый отдельный символ вместо целого массива? – user3161344

+0

@ user3161344 Да, точно. И он повторяется все время одной и той же операции. – solvator

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