字节流一次读取一行数据?
观察图可发现是可以实现字节流一次读取一行的。
测试1:无中文
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("G:\\a.txt")));
String str = null;
while ((str = br.readLine()) != null){
System.out.println(str);
}
/*
结果:一共读了3次,每次读取一行
Hello World!
Hello Java!
Hello CSDN!
*/
测试2:有中文
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("G:\\a.txt"),"GBK"));
String str = null;
while ((str = br.readLine()) != null){
System.out.println(str);
}
/*
结果:使用了转换流的特征,对编码进行转换
Hello World!
Hello 程序猿!
Hello Java!
Hello CSDN!
*/
多个流结合,可以使用不同流的特性来解决问题。
例子:写一个服务端,使用网页进行访问服务端,服务端实现会写数据。
分析:GET /Demo/web/index.html HTTP/1.1
请求头是我们最关注的信息,我们来获取请求头信息,用于锁定页面在本地的位置,因为ServerSocket服务端里面的getInputStream();方法返回的是一个字节流,所以我们使用上面说到的,字节流一次读取一行的方式,只读取第一行请求头信息即可。
/*
注意:如果是B/S交互的话,不要关闭服务器,以为浏览器还会随之带着一些其他的请求
如果你关闭了,会报一个异常,因为还有其他请求,但是你已经关闭了服务器,所以就会报异常。
需求:请编写模拟B/S服务器案例。
*/
//HTML代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>测试成功!</h1>
<img src="imgs/a.png">
</body>
</html>
//java服务端代码
public class BS {
public static void main(String[] args)throws Exception {
ServerSocket ss = new ServerSocket(8080);
while (true){
//等待客户端发送请求
Socket accept = ss.accept();
//创建服务器字符输入流对象
InputStream is = accept.getInputStream();
//创建BufferedReader对象并传入转换流将inputStream丢进去
// 这样就能够达到一次读取一行的效果
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s = br.readLine();
//GET /Demo/web/index.html HTTP/1.1这是原有的路径名
//根据" "切割字符串刚好可以得到 /Demo/web/index.html
//处理字符串,得到路径名
String[] split = s.split(" ");
String str = split[1];
//然后在去掉前面的正斜杠就行了
String path = str.substring(1);
//创建FileInputStream对象读取本地页面
FileInputStream fis = new FileInputStream(path);
//调用getOutputStream,往客户端响应页面
OutputStream os = accept.getOutputStream();
//写协议信息
os.write("HTTP/1.1 200 OK\r\n".getBytes());//响应行
os.write("Content-Type:text/html\r\n".getBytes());//响应头
os.write("\r\n".getBytes());
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1){
//读一次网页内容,往客户端写一次网页内容
os.write(bytes,0,len);
}
//关流
os.close();
fis.close();
br.close();
is.close();
accept.close();
//ss.close(); 服务器一般不需要关闭,如果关闭会产生一个异常,上面有讲解
}
}
}
测试结果必然是成功的:这是网页上显示的数据。