本章内容
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 是否需要格式化输出