----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
一、java中为什么要有IO流,它是用来做什么的?
IO流:主要用来操作设备上的数据。比如用java程序复制文件、用程序将数据录入到文件中都用到了IO流。
二、IO流具体的分类
1.按操作数据来分:
<1>字符流:
字符流的由来:
因为文件的编码不同,从而有了对字符进行高效操作的字符流对象。
原理:其实就是基于字节流读取字节时,去查了指定的编码表:也就是:字符流 = 字节流 +编码表
<2>字节流:
字节流在读取的时候,读到一个字节返回一个字节。它可以操作任何类型的数据。比如“mp3文件、音频文件、视频文件、文本文件。”
2.按流向分:
<1>输入流:
<2>输出流:
3.字符流与字节流的区别:
<1>字节流只能读取一个字节,而字符流可以读取一个字符或多个字符。
<2>字节流可以操作任何文件,字符流只能操作文本文件。
三、IO的体系:
IO所具备最基本的功能就是"读和写"。
1.字符流
Reader<读> Writer<写>
2.字节流
InputStream<读> OutPutStream<写>
注意:在操作IO流数据的时候,分清2个明确就可以。
A: 明确操作数据源和目的地体系
1、明确数据源
从数据源是读取数据
InPutStream
Reader
2、明确目的地
把数据写入目的地
OutPutStream
Writer
B: 明确具体的数据源和目的地是否是文本文件
1、明确数据源
是文件: 用Reader
不是文件: InputStream
2、明确目的地
写入的目的地是否是文件,如果是: 用Wrtier
如果不是文件: 用OutPutStream
四:IO流的使用步骤:
1.先明确数据源和目的地
2.封装数据源和目的地
3.调用流对象的方法
4.释放资源。
五:在操作IO流遇到的一些问题:
1.什么时候需要用到转换流?
在操作字节流数据的时候,为了使用高效字符流的一些方法需要把字节流进行转换,这个时候java就提供了转换流。
(InputStreamReader:字节流转换成字符流
OutPutStreamWriter:字符流转换成字节流)
2.在创建字符输出流对象做了几件事?
三件事:1.创建文件对象 2.创建输出流对 3.输出流指向文件对象。
3.为什么一定要释放资源?
1.让对象变成垃圾 2.通知操作系统释放被占用的资源。
4.flush方法和close方法的区别?
flush方法:刷新缓冲区后,还可以继续使用流对象
close方法:是在关闭流之前先进行的刷新动作,关闭流后,对象不能使用,变成垃圾了。
六:IO流的一些实例:
字符流实例1:
/* * 把d盘目录下的a.txt复制到e盘下的b.txt中,并加入异常处理。 */ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyTest { public static void main(String[] args) { FileReader fr = null; FileWriter fw = null; try { // 字符输入流封装数据源 fr = new FileReader("d:\\a.txt"); // 字符输出流封装目的地 fw = new FileWriter("e:\\b.txt"); // 基本读写 int ch = 0; while ((ch = fr.read()) != -1) { fw.write(ch); // fw.flush(); } } catch (IOException ie) { ie.printStackTrace(); } finally { // 释放资源 if (fw != null) { try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } if (fr != null) { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
字节流实例2:
/** *测试字节流的复制mp3所用的时间: * */ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyMP3 { public static void main(String[] args) throws IOException { long start = System.currentTimeMillis(); method(); long end = System.currentTimeMillis(); System.out.println("共耗时:" + (end - start) + "毫秒"); } // 高效的一次读写一个字节 private static void method() throws IOException { //创建字节输入流对象 BufferedInputStream bis = new BufferedInputStream(new FileInputStream( "zxmzf.mp3")); //创建字节输出流对象 BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("method4.mp3")); //定义缓冲区 byte[] bys = new byte[1024]; int len = 0; //调用输入流方法 while((len=bis.read(bys))!=-1){ bos.write(bys,0,len); } //释放资源 bos.close(); bis.close(); } }
转换流实例3:
/** *把键盘录入的数据,转成大写通过标准流显示在控制台。 * */ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class SystemOutDemo2 { public static void main(String[] args) throws IOException { // 封装数据源和目的地 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //基本读写操作 String line= null; while((line=br.readLine())!=null){ //数据源是键盘录入的时候,一定要自定义结束标记 if("886".equals(line)){ //== break; } bw.write(line.toUpperCase()); bw.newLine(); bw.flush(); } //释放资源 bw.close(); br.close(); } }
上述总结:
实例1:当数据源和目的地的操作的数据是文本文件的时候,用字符流是最高效。
实例2:高效字节流,之所以高效是因为每次读取字节的时候,都将数据存在了缓冲区。在写入的时候从缓冲区写入,提高了效率
实例3:当从键盘录入和控制台结束的时候,需要定义标记。因为控制台录入的都是字节和字符,所以需要用到了转换流,转换成字符流,并使用它的高效方法。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------