|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
S.Dmitry : 40 Новичок
|
Янв 22, 2012 20:20 |
|
|
Доброго всем времени суток!
Столкнулся с тем фактом, что данный код работает только с методом flush(), хотя поток не буферизированный и по идее должно работать и без него. Или я чего-то не понимаю. Вроде для буферизированного потока только flush? Если я метод уберу, то я получаю просто путой лог файл и всё! Стоит добавить метод, как сразу картина меняется! Почему?
| Код: |
try {
FileOutputStream log = new FileOutputStream("log.txt");
Writer out = new OutputStreamWriter(log, "UTF8");
out.write("Тестовая строка");
out.flush();
log.close();
} catch (IOException file) {
System.out.println("Невозможно завести лог-файл. Проверьте права доступа к директории");
System.out.println(file);
System.exit(1);
} |
|
|
|
|
 |
Vantuz-Subhuman : 660 Постоянный посетитель Откуда: издиснейленда
|
Янв 22, 2012 21:20 |
|
|
| S.Dmitry писал(а): |
Доброго всем времени суток!
Столкнулся с тем фактом, что данный код работает только с методом flush(), хотя поток не буферизированный и по идее должно работать и без него. Или я чего-то не понимаю. Вроде для буферизированного потока только flush? Если я метод уберу, то я получаю просто путой лог файл и всё! Стоит добавить метод, как сразу картина меняется! Почему?
| Код: |
try {
FileOutputStream log = new FileOutputStream("log.txt");
Writer out = new OutputStreamWriter(log, "UTF8");
out.write("Тестовая строка");
out.flush();
log.close();
} catch (IOException file) {
System.out.println("Невозможно завести лог-файл. Проверьте права доступа к директории");
System.out.println(file);
System.exit(1);
} |
|
OutputStreamWriter сам буферизированный.
http://docs.oracle.com/javase/6/docs/api/java/io/OutputStreamWriter.html
| Цитата: |
| The resulting bytes are accumulated in a buffer before being written to the underlying output stream. The size of this buffer may be specified, but by default it is large enough for most purposes. Note that the characters passed to the write() methods are not buffered. |
_________________ «One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity» |
|
|
|
 |
S.Dmitry : 40 Новичок
|
Янв 22, 2012 21:22 |
|
|
| Цитата: |
| OutputStreamWriter сам буферизированный. |
Понял. То есть он физически пишет байты тогда, когда переполняется буфер или когда вызван flush?
То есть если его не вызывать, то строка так и останется в буфере, не попав на диск? |
|
|
|
 |
Vantuz-Subhuman : 660 Постоянный посетитель Откуда: издиснейленда
|
Янв 22, 2012 21:34 |
|
|
| S.Dmitry писал(а): |
| Цитата: |
| OutputStreamWriter сам буферизированный. |
Понял. То есть он физически пишет байты тогда, когда переполняется буфер или когда вызван flush?
То есть если его не вызывать, то строка так и останется в буфере, не попав на диск? |
Ну, при переполнении буфера скорее всего должен бы писать, не выкидывать же данные. А так да, не вызовете смыв, не получите выход.
UPD: Кстати, обязательно закрывайте все писатели. В порядке, обратном открытию. Все адекватные буферизированные классы из пакетов io/nio производят смыв при закрытии. _________________ «One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity»
Последний раз редактировалось: Vantuz-Subhuman (Янв 22, 2012 21:37), всего редактировалось 1 раз |
|
|
|
 |
S.Dmitry : 40 Новичок
|
Янв 22, 2012 21:35 |
|
|
А есть ли поток, который будет писать данный сразу при поступлении? Не буферизировать их?
И как вообще определить, какой лучше? |
|
|
|
 |
Vantuz-Subhuman : 660 Постоянный посетитель Откуда: издиснейленда
|
Янв 22, 2012 21:39 |
|
|
| S.Dmitry писал(а): |
| А есть ли поток, который будет писать данный сразу при поступлении? Не буферизировать их? |
Почему буферизация вас пугает? Это очень могучая и полезная штука.
| S.Dmitry писал(а): |
| И как вообще определить, какой лучше? |
По ситуации.
P.S. Обязательно закрывайте все писатели! (Это на случай, если вы предыдущее сообщение пропустили). _________________ «One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity»
Последний раз редактировалось: Vantuz-Subhuman (Янв 22, 2012 21:40), всего редактировалось 1 раз |
|
|
|
 |
S.Dmitry : 40 Новичок
|
Янв 22, 2012 21:39 |
|
|
| Меня она не пугает, она удобная и полезная. Я уже для интереса спрашиваю. |
|
|
|
 |
Vantuz-Subhuman : 660 Постоянный посетитель Откуда: издиснейленда
|
Янв 22, 2012 21:48 |
|
|
| S.Dmitry писал(а): |
| А есть ли поток, который будет писать данный сразу при поступлении? Не буферизировать их? |
| S.Dmitry писал(а): |
| Меня она не пугает, она удобная и полезная. Я уже для интереса спрашиваю. |
Можете попробовать использовать PrintStream, у него есть функция автосмыва:
| Цитата: |
| Optionally, a PrintStream can be created so as to flush automatically; this means that the flush method is automatically invoked after a byte array is written, one of the println methods is invoked, or a newline character or byte ('\n') is written. |
_________________ «One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity» |
|
|
|
 |
S.Dmitry : 40 Новичок
|
Янв 22, 2012 21:49 |
|
|
|
|
|
|
 |
Vantuz-Subhuman : 660 Постоянный посетитель Откуда: издиснейленда
|
Янв 22, 2012 21:54 |
|
|
| S.Dmitry писал(а): |
| Попробуем, спасибо! |
Можете сами форматить данные в нужную кодировку и совать напрямую в FileOutputStream, вся его работа упирается в нативные методы, т.ч. хз, происходит там буферизация или нет. Если и происходит, то вас она уже никак не коснётся. _________________ «One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity» |
|
|
|
 |
|
|
Страница 1 из 1
|
Список форумов
-> Файлы и потоки ввода/вывода |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|