JAVA - BIO

本章内容

  BIO为java提供的阻塞式IO,在java.IO包中,里面提供了很多操作类,今天我们就来总结一下,主要分两块来写:字符流和字节流

1 概念

  BIO:同步阻塞式IO 服务器实现模式为 一个连接一个线程,即客户端有请求时服务器端就需要启动一个线程进行处理 (可以通过线程池机制来改善这种模式)

2 使用场景

  连接数量小,连接时间短,计算密集,代码编程直观,程序直观简单易理解

3 IO的作用

  人机交互,文件数据读取,数据持久化保存

4 IO流源和目的地

  控制台,磁盘文件,网络端点

5 IO的实现的流程

  打开流,检查数据,在流中数据传输,关闭流

6 字符流 操作的数据单元是16位字符  字节流 操作的数据单元是8位字节

字符流(Reader为输入流,Writer为输出流)

  1 FileReader和FileWriter  文件流:针对文件的操作

  2 BufferReader和BufferWriter 缓存:提供读写数据的缓存

  3 InputStreamReader和InputStreamWriter 字符流与字节流的转换

  4 StringReader 和 StringWriter 对字符串的操作

  5 PipeReader 和 PipeWriter 管道流:用于线程间的通信

  6 FilterReader和FilterWirter 过滤:抽象类,其具体实现对流进行过滤

  7 CharArrayReader和 CharArrayWriter 内存流:使用这些类用来读写内存,以数组的方式创建和实现读写序列

  7 其它字符流 ByteArrayReader,PrintWriter

 

字符流代码介绍(目前只做了最常用的前三种)

    

 1 package com.hpzhu.demo.socket;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.FileInputStream;
 6 import java.io.FileOutputStream;
 7 import java.io.FileReader;
 8 import java.io.FileWriter;
 9 import java.io.InputStreamReader;
10 import java.io.OutputStreamWriter;
11 
12 /**
13  * 注意:本示例中未对异常做处理,而是直接抛出Exception
14  * @author hpzhu
15  *
16  */
17 public class BioCharacter {
18 
19     private static final String MSG = "HELLO WORD";
20 
21     /**
22      * 对文件的读写操作
23      * 可能出现中文乱码,具体看系统的支持以及文件编码格式
24      * @param filePath
25      */
26     public void doFileOperate(String filePath) throws Exception {
27         FileReader fr = new FileReader(filePath);
28         char [] cbuf = new char[1024]; //
29         while (fr.read(cbuf) != -1) {
30             System.out.println(String.valueOf(cbuf));
31         }
32 
33         FileWriter writer = new FileWriter(filePath);
34         writer.write(MSG);
35         writer.flush();
36     }
37 
38     /**
39      * 缓存
40      * @param filePath
41      * @throws Exception
42      */
43     public void doFileBufferOperate(String filePath) throws Exception {
44         BufferedReader br = new BufferedReader(new FileReader(filePath));
45         StringBuffer all = new StringBuffer();
46         String res = null;
47         while ((res = br.readLine()) != null) {
48             all.append(res);
49         }
50         System.out.println(all.toString());
51 
52         BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));
53         writer.write(MSG);
54         writer.flush();
55     }    
56 
57     /**
58      * 将字节流转换成字符流输入
59      * 将字符转换成字节流输出
60      * @param filePath
61      * @throws Exception
62      */
63     public void doIOConvert(String filePath) throws Exception {
64         InputStreamReader br = new InputStreamReader(new FileInputStream(filePath));
65         char[] buf = new char[1024];
66         while (br.read(buf) != -1) {
67             System.out.println(new String(buf));
68         }
69         OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(filePath));
70         writer.write(MSG);
71         writer.flush();
72     }
73 }

字节流

  1 FileInputStream和FileOutputStream 文件流:针对文件的操作

  2 BufferedInputStream和BufferedOutputStream 缓存:提供读写数据的缓存

  2 FilterInputStream和FilterOutputStream 过滤:抽象类,其具体实现对流进行的过滤

  3 ObjectInputStream和ObjectOutputStream 对象序列化:用于对象序列化

  4 PipedInputStream和PipedOutputStream 管道流:用户线程间的通信

  5 ByteArrayInputStream和ByteArrayOutputStream 

  6 SequenceInputStream 串行流:建多个输入流连为一个输入流

  7 StringBufferInputStream 

字节流代码介绍(目前只做前两种常用的)

 1 package com.hpzhu.demo.socket;
 2 
 3 import java.io.BufferedInputStream;
 4 import java.io.FileInputStream;
 5 import java.io.FileOutputStream;
 6 
 7 public class BioByte {
 8 
 9     private static final String MSG = "HELLO WORD";
10 
11     public void doFileOperate(String filePath) throws Exception {
12         FileInputStream fis = new FileInputStream(filePath);
13         byte[] b=new byte[1024];
14         int  size = 0;
15         String content = null;
16         while((size=fis.read(b))!=-1){
17             content = new String(b, 0, size);
18             System.out.println(content);
19         }
20 
21         FileOutputStream fo = new FileOutputStream(filePath);
22         fo.write(MSG.getBytes());
23         fo.flush();
24 
25     }
26 
27 
28     public void doFileBufferOperate(String filePath) throws Exception{
29         BufferedInputStream bi = new BufferedInputStream(new FileInputStream(filePath));
30         byte[] b =new byte[1024];  
31 
32         int size = 0;
33         String content = null;
34         while( (size = bi.read( b ) )!= -1 ){
35             content = new String(b, 0, size);
36             System.out.println(content);
37         }
38 
39     }
40 }

确定选择流对象的步骤

  1 确定原始数据的格式

  2 确定是输入还是输出

  3 是否需要转换流

  4 数据的来源(去向)

  5 是否需要缓冲

  6 是否需要格式化输出 

 

猜你喜欢

转载自www.cnblogs.com/hpzhu/p/9365147.html