字节流一次读取一行数据?

字节流一次读取一行数据?

观察图可发现是可以实现字节流一次读取一行的。
在这里插入图片描述

测试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(); 服务器一般不需要关闭,如果关闭会产生一个异常,上面有讲解
        }
    }
}

测试结果必然是成功的:这是网页上显示的数据。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章