Обычная версия
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
Список форумов
 -> Файлы и потоки ввода/вывода


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru