25. BufferedReader的readLine()方法
今天复习到写一个文本转化器,客户端发一行字符,服务端转为大写后发回来。
前一天我写的时候,还是没问题的:
import java.net.*;
import java.io.*;public class TCP_Client {public static void main(String[] args) throws Exception {try {Socket tcpClientSocket = new Socket(InetAddress.getLocalHost(),10002);OutputStream out = tcpClientSocket.getOutputStream();InputStream in = tcpClientSocket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String s = null;byte[] buf = new byte[1024];int len = 0;while ((s = br.readLine()) != null) {if (s.equals("OVER")) {out.write(s.getBytes());System.out.println("...closing.");Thread.sleep(3000);break;}out.write(s.getBytes());len = in.read(buf);System.out.println("Convert : " + new String(buf, 0, len));}tcpClientSocket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
import java.net.*;
import java.io.*;public class TCP_Server {public static void main(String[] args) throws Exception {try {ServerSocket tcpServerSocket = new ServerSocket(10002);Socket tcpClientSocket = tcpServerSocket.accept();System.out.println(tcpClientSocket.getLocalAddress()+ "...connected.");OutputStream out = tcpClientSocket.getOutputStream();InputStream in = tcpClientSocket.getInputStream();byte[] buf = new byte[1024];int len = 0;while (true) {len = in.read(buf);String s = new String(buf, 0, len);if (s.equals("OVER")) {break;}System.out.println("Get : " + s);out.write((s.toUpperCase()).getBytes());}tcpServerSocket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
过了一天,我用缓冲区技术再做一次,就怎么都不行了,
每次都是客户端连接上后,输入一行字符就卡住了。
通过对比观察,才发现自己之前一直忽略的一个问题:
readLine() 读取一个文本行。
通过下列字符之一即可认为某行已终止:
换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
因此,上面的方法我是用read()方法来读取,能够读到换行符号,
改为BufferedReader后用readLine()就不行了。
修改后代码如下:
import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) throws UnknownHostException,IOException {Socket tcpClientSocket = new Socket(InetAddress.getByName("localhost"),10004);BufferedReader keyIn = new BufferedReader(new InputStreamReader(System.in));BufferedReader readIn = new BufferedReader(new InputStreamReader(tcpClientSocket.getInputStream()));BufferedWriter writeOut = new BufferedWriter(new OutputStreamWriter(tcpClientSocket.getOutputStream()));String convertStr = null;while ((convertStr = keyIn.readLine()) != null) {if (convertStr.equals("OVER")) {writeOut.write(convertStr);writeOut.newLine();writeOut.flush();break;}writeOut.write(convertStr);writeOut.newLine();writeOut.flush();System.out.println("After:" + readIn.readLine());}tcpClientSocket.close();}
}
import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) throws UnknownHostException,IOException {ServerSocket tcpServerSocket = new ServerSocket(10004);Socket tcpClientSocket = tcpServerSocket.accept();BufferedReader readIn = new BufferedReader(new InputStreamReader(tcpClientSocket.getInputStream()));BufferedWriter writeOut = new BufferedWriter(new OutputStreamWriter(tcpClientSocket.getOutputStream()));String convertStr = null;while (true) {convertStr = readIn.readLine();writeOut.write(convertStr.toUpperCase());writeOut.newLine();writeOut.flush();}}
}
主要看BufferedWriter和BufferedReader的配合使用,其他一些逻辑和操作缺少的请自动忽略。
感谢这个百度知道答案:Java的流中为什么BufferedReader要写入一个newLine()才能换行
25. BufferedReader的readLine()方法相关推荐
- BufferedReader的readLine方法
BufferedReader有一个方法叫readLine(),优点: 1.该方法的作用是每次都读一行,可以省略很多手动拼接buffer的步骤: 2.它比较高效,相对于一个字符/字节地读取.转换.返回来 ...
- 关于java中BufferedReader的read()及readLine()方法的使用心得
BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...
- java中br.readline_Java:java中BufferedReader的read()及readLine()方法的使用心得
BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...
- java readline 实现_基于自定义BufferedReader中的read和readLine方法
实例如下所示: package day0208; import java.io.FileReader; import java.io.IOException; /* * 自定义读取缓冲区,实现Buff ...
- java readline 超时_跳过Java中的BufferedReader readLine()方法
是否有一种简单的方法可以跳过java中的readLine()方法(如果它花费的时间超过2秒)? 这是我问这个问题的背景: public void run() { boolean looping = t ...
- java中readline函数_自定义BufferedReader中read和readLine方法
BufferedReader中read和readLine方法总结 实例如下所示: package day0208; import java.io.FileReader; import java.io. ...
- IO流-ReadLine方法的原理 自定义BufferedReader
package com.yyq; /** readLine 方法的原理* 无论是读一行,获取读取多个字符其实最终都是在硬盘上一个一个的读取,所以最终使用的都是* read方法一次读一个的发法* 缓冲区 ...
- 解决 java BufferedReader.readLine()方法按行读取文件内容中文乱码的问题
原来的代码如下所示,但是输出的内容都是乱码 public void readLine(String path) {InputStreamReader isr = null;BufferedReader ...
- 浅谈BufferedReader中的read()方法和readLine()方法
浅谈BufferedReader中的read方法和readLine方法 前言:本人比较菜啦,如果有错误,还请大佬指正. 1. read方法 查看API文档我们可以发现BufferedReader类中的 ...
最新文章
- LeetCode455 分发饼干(二分法)
- SQL Server 查询基础
- Android之安全退出应用程序的几种方式
- linux安装自带mysql吗_Linux下安装mysql
- HTML5应用程序网站视差模板下载
- 《Linux内核设计与实现》读书笔记(2)--- 进程管理
- python能做什么-Python到底能做什么?
- crackme003
- scara机器人用户坐标系标定与工具坐标(TCP)标定
- linux重装系统步骤 包含raid【主要针对服务器重装】
- 居民身份证号码每个数字代表什么
- 计算机系统概论备考,《计算机系统导论》复习题3.doc
- c1-02西班牙的语言,【图片】考试的同学看过来~DELE-C1两个月准备(实用经验+超详细流程)转【西班牙语吧】_百度贴吧...
- Android通用流行框架大全,零基础入门学习android
- Alpha阶段敏捷冲刺⑦
- RK3588 ssh Failed to start OpenBSD Secure Shell server 以及E: Sub-process /usr/bin/dpkg returned无法下载软件
- 用电脑自带的“画图”调整图片大小到100K以下
- Altium Designer 20 (5)——排针类元件创建
- supported for git 2.9+
- 磊科路由器信号按键_磊科无线路由操作手册