IO流
用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中
按操作数据分为:字节流和字符流;按流向分为:输入流和输出流。
程序从输入流中读取数据,向输出流中写入数据。
字节流的抽象基类:Inputstream 和 OutputStream;字符流的抽象基类:Reader 和 Writer
其他流均是继承这4个抽象类而来的。转换流
转换流也是一种包装流,其中OutputStreamWriter是Writer的子类,可以将一个字节流输出流包装成字符输出流,方便直接写入字符,而InputStreamReader是Reader的子类,它可以将一个字节输入流包装成字符输入流,方便直接读取字符。InputStreamReader读取转换流--------字节流通向字符流的桥梁步骤 :
1.获取键盘录入对象
Inputstream in=System.in
2.将字节流对象转换成字符流对象,使用转换流InputStreamReader
InputStreamReader isr=new InputStreamReader(in);
3.提高效率使用字符流缓冲区 BufferedReader进行读取
BufferedReader bf=new BufferedReader(isr);
String line=null; while((line=bf.readLine())!=null) { if("over".equals(line)) break; sop(line); } bufr.close;OutputStreamReader写入转换流----------字符流通向字节流的桥梁 步骤 :1.获取输出对象
Outputstream out=System.out
2.将字符流对象转换成字节流对象,使用转换流OutputstreamWriter
OutputstreamWriter osw=new OutputstreamWriter(out);
3.提高效率使用字符流缓冲区 BufferedWriter进行写入
BufferedWriter bw=new BufferedWriter(osw);
String line=null; while((line=bf.readLine())!=null) { if("over".equals(line)) break; bw.write(line); bufw.newLine(); } bufr.close;常用流
字节流 InputStream int read() int read(byte[]) int read(byte[], int, int) FileInputStream AudioInputStream ByteArrayInputStream ObjectInputStream PipedInputStream int available() void close() OutputStream write(int) write(byte[]) write(byte[], int, int) FileOutputStream ByteArrayOutputStream ObjectOutputStream PipedOutputStream flush() close()字符流 Reader FileReader节点流 BufferedReader过滤流(处理流) InputStreamReader转换流 Writer FileWriter节点流 BufferedWriter过滤流(处理流) OutputStreamWriter转换流 读取键盘录入 System.out:对应的是标准输出设备,控制台 System.in:对应的标准输入设备,键盘 InputStream in=System.in; int by=in.read(); sop(by); in.close(); //结束录入流操作规律
基本规律
1.明确源和目的
源:输入流。InputStream字节流 Reader 字符流
目的:输出流 OutPutStream 字节流 Writer 字符流
2.操作的数据是否是纯文本
是就是字符流,如果设备是键盘 就将字节流转换为字符流不是就是字节流
3.当体系明确后,在明确要是用那个具体的对象
通过设备来区分:
源设备 内存 硬盘 键盘
目的设备 内存 硬盘 控制台
4.是否需要提高效率
是 BufferedReader BufferedInputStream否 BuffreredWriter BufferedOutputStream
案例分析
1.将一个文本文件中的数据存储到另一个文件中,复制文件
源:InputStream字节流 Reader 字符流 是否是纯文本 是 Reader 设备: 文件 操作文件的对象 就是FileReader 是否需要高效 是 BufferedReader FileReader fr=new FileReader("a.txt"); BufferedReader bufr=new BufferedReader(fr); 目的:OutPutStream 字节流 Writer 字符流 是否是纯文本 :是 Writer 设备: 文件 写入文件的对象 就是 FileWriter 是否需要高效 是 BufferedWriter FileWriter fw=new FileWriter("b.txt"); BufferedWriter bufw=new BufferedWriter(fw); 2.将一个图片文件数据存储到另一个文件中,复制文件。 源:是否是纯文本 : 不是 InputStream 设备 文件 就是 FileInputStream 是否高效 是 BufferedInputStream FileInputStream isr=new FileInputStream("a.jpg"); BufferedInputStream bufis=new BufferedInputStream(isr); 目的:是否纯文本 :不是 OutPutStream 设备:文件 FileOutPutStream 是否高效 是 BufferedOutputStream FileOutPutStream osw=new FileOutPutStream("b.jpg"); BufferedOutputStream bufos=new BufferedOutputStream(osw);3.需求将键盘录入的数据保存到一个文件中 。
源:键盘 字节流是否纯文本 Reader
设备 :键盘 ,对应的对象时 System.in 对应的是字节流 ,为了操作方便 转成字符流既然明确了Reader 就将System.in 转换成字符流 InputStreamReader
InputStreamReader isr=new InputStreamReader(System.in);需要高效吗 ?
BufferedReader bufr=new BufferedReader(isr);目的: 文件
是否纯文本 是 Writer 设备:文件 FileWriter需要高效吗?
是 BufferedWriter4.扩展 :想要把录入的数据按照指定的编码表(utf-8)将数据存到文件中
目的:OutPutStream 字节流 Writer 字符流
是否是存文本:是 Writer
设备 :文件 fileWriter默认编码表是 gbk
编码标只有转换流可以指定。所以要使用的对象是写入转换流 OutputStreamWriter
转换流需要接受一个自己输出流,操作字节输出流的是FileOutputStream
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8");BufferedWriter bufw=new BufferedWriter (osw);
通常涉及到字符编码转换的时候,就需要用到转换流。字符编码
字符码表
字符码表是一种可以方便计算机识别的特定字符集,它是将每一个字符和一个唯一的数字对应而形成的一张表。ASCII、ISO8859-1、GB2312、GBK、Unicode、UTF-8
字符编码和解码把字符串转换成计算机识别的字节序列称为编码
把字节序列转换为普通人能看懂的明文字符串称为解码字符传输
通过构造方法InputStreamReader(InputStream in,String charsetName)和OutputStreamReader(OutputStream in,String charsetName)创建流对象时,可以对需要读写的数据指定编码格式
两种设计模式
适配器模式
将字节流适配成可以用字符的方式操作的字符流
适配:把不兼容的(接口)变成兼容的(接口)
InputStreamReaderOutuptStreamWriter装潢模式
处理流(过滤流)基本上都是用了装潢模式
BufferedReader / BufferedWriterPrintStream / PrintWriterDataInputStream / DataOutputStream