Клиент / сервер Java - использование BufferedWriter вместо PrintWriter - PullRequest
4 голосов
/ 06 марта 2011

Во всех примерах клиент / сервер Java я видел BufferedReader, используемый для получения данных, как в

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

и PrintWriter для отправки данных, как в

PrintWriter writer = new PrintWriter(socket.getOutputStream());

Но я не могу просто использовать BufferedWriter вместо PrintWriter?Мне нужно только отправить неотформатированную строку между клиентом и сервером, поэтому BufferedWriter должен дать лучшую производительность (не то чтобы это проблема).

Ответы [ 3 ]

3 голосов
/ 06 марта 2011

PrintWriter по существу предоставляет удобные методы для Writer.Если вам не нужен этот удобный метод - но вам нужно просто написать символы - тогда функционально вы можете использовать любой вариант Writer, который вы выберете, включая «raw» OutputStreamWriter.

Если вы пишете символыпо одному, и ваш сокетный поток не буферизуется, тогда было бы целесообразно поместить некоторую буферизацию где-нибудь, либо с помощью BufferedWriter, либо обернув BufferedOuputStream вокруг вашего необработанного выходного потока.Примером того, где вам обычно не нужно этого делать, является сервлет, где потоки, передаваемые вашему сервлету, обычно уже буферизированы.

PrintWriter также имеет «особенность» проглатывания исключений в методах записикоторый вы должны затем явно проверить с помощью checkError () [передает, кто на самом деле это делает, а кто просто предполагает, что запись прошла успешно ...].Это может или не может быть желательным ...

2 голосов
/ 06 марта 2011

Что не так с PrintWriter? Соответствие сделано из-за удобного соответствия readLine / writeLine. У вас нет такого удобства в BufferedWriter. Также вы можете указать автоматическую очистку с помощью PrintWriter.
Если вам нужен буфер, вы можете обернуть BufferedWriter в PrintWriter

PrintWriter pw = new PrintWriter( new BufferedWriter( ... ) );
2 голосов
/ 06 марта 2011

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

Что касается производительности, см. Javadocs для BufferedWriter

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...