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()才能换行

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值