一.流的概念:java
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。它的特性是进行数据传输;数组
通俗理解:例如从水源地长江把水导入自来水厂,而后又从自来水厂把水送到各家各户。从长江到自来水厂之间的管道咱们能够称之为输入流,从自来水厂把水送到各家各户的管道咱们称之为输出流,咱们大概能够这么理解。工具
二.流的分类:测试
根据数据类型分为:字符流和字节流,根据流的方向分为输入流和输出流。spa
三.字节流和字符流线程
字节流:InputStream和OutputStream是java中能够按照最小字节单位读取的流,即每次读写一个字节,字节流是直接链接到输入源的流。code
字符流:是以字符为单位进行数据处理的IO流。本质其实就是基于字节流读取时,去查找指定的码表。对象
字节流以字节为单位,字符流以字符为单位,一次可读2个字节,字节流可用于处理全部类型数据,而字符流只能处理字符类型的数据。
只要是处理纯文本就优先考虑使用字符流,除此以外都使用字节流blog
四.输入流和输出流ip
输入流是指程序从数据源中读取数据。只进行读操做;
输出流是指将数据从程序中写到指定的文件中;
五.IO流结构图
字节输入流InputStream:
InputStream 是全部的输入字节流的父类,它是一个抽象类。
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。
PipedInputStream 是从与其它线程共用的管道。
ObjectInputStream 和全部FilterInputStream 的子类都是装饰流。
字节输出流OutputStream:
OutputStream 是全部的输出字节流的父类,它是一个抽象类。
ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
PipedOutputStream 是向与其它线程共用的管道中写入数据。
ObjectOutputStream 和全部FilterOutputStream 的子类都是装饰流。
字符输入流Reader:
Reader 是全部的输入字符流的父类,它是一个抽象类。
CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。
PipedReader 是从与其它线程共用的管道中读取数据。
BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。
FilterReader 是全部自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增长一个行号。
InputStreamReader 是一个链接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 能够说是一个达到此功能、经常使用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。咱们能够从这个类中获得必定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。
字符输出流Writer:
Writer 是全部的输出字符流的父类,它是一个抽象类。
CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。
PipedWriter 是向与其它线程共用的管道中写入数据。
BufferedWriter 是一个装饰器为Writer 提供缓冲功能。PrintWriter 和PrintStream 极其相似,功能和使用也很是类似。
OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类。
九.经常使用例子
使用FileInputStream类读取文件内容
1. import java.io.FileInputStream; 2. import java.io.FileNotFoundException; 3. import java.io.IOException; 4. /** 5. * 数据输入流测试 7. * 8. */ 9. public class firstIO { 10. //程序的主方法 11. public static void main(String [] args) throws IOException{ 12. int i=0; 13. FileInputStream in=null; 14. try { 15. in=new FileInputStream("C:Users15080Desktopaaaa.txt");//从文件外读数据 16. } catch (FileNotFoundException e) { 17. // TODO: handle exception 18. System.out.println("找不到文件位置"); 19. System.exit(-1); 20. } 21. try { 22. int num=0;//用于字节个数的计数 23. while((i=in.read())!=-1){ 24. System.out.println((char)i);//将获得的ASCII码值转换成字符型 25. num++; 26. } 27. in.close(); 28. System.out.println("传输字节个数:"+num); 29. } catch (Exception e) { 30. // TODO: handle exception 31. System.out.println("读取文件错误"); 32. } 34. } 36. }
使用FileOutputStream写入文件
import java.io.FileInputStream; import java.io.FileOutputStream; /** * 输入输出流测试 * * */ public class outIO { //程序主方法 public static void main(String []args){ int i=0; FileInputStream in=null; FileOutputStream out=null; try { //实例化FileInputStream,FileOutputStream对象 in=new FileInputStream("C:\\Users\\15080\\Desktop\\aaaa.txt"); out=new FileOutputStream("C:\\Users\\15080\\Desktop\\bbbb.txt"); while((i=in.read())!=-1){ out.write(i); System.out.println((char)i); } in.close(); out.close(); System.out.println("文件已复制"); } catch (Exception e) { // TODO: handle exception System.out.println("文件复制错误"); System.exit(-1); } } }
使用FileRead、FileWriter复制文件
import java.io.FileReader; import java.io.FileWriter; public class TestFieldWriter1 { public static void main(String []args){ FileReader fr=null; FileWriter fw=null; try { fr=new FileReader("C:\\Users\\15080\\Desktop\\eeee.txt");//要读取的文件 fw=new FileWriter("C:\\Users\\15080\\Desktop\\ffff.txt");//要复制的目的文件 int i=0; while((i=fr.read())!=-1){ fw.write(i); System.out.println((char)i);//将获得的ASCII码值转换成字符型 } fr.close(); fw.close(); } catch (Exception e) { // TODO: handle exception } } }