一、什么是IO(Input/Output)
程序是运行在内存中的,IO就是JAVA程序它所运行的内存之外的节点互相传递数据的一种类似于管道的概念。
二、流
1、概念:JAVA与其他节点间互换数据使用的通道,其实的话就相当于一个水管接在两个节点之间进行数据的传输
2、分类:
1)、按照方向分:输入流、输出流
讲到这个输入和输出可能有些人就犯迷糊了,究竟什么情况下叫做输入,什么情况下又叫做输出呢?那我就举一个例子:JAVA会在我们的电脑内存中新建一块内存(JAVA内存),而另外一个节点比如说是我们硬盘中的一个文件(硬盘),当JAVA内存的数据输入到硬盘的时那就叫做输出,相反硬盘把数据读到JAVA内存中就叫输入。也就是说输入和输出是相对于JAVA内存在讲的,凡是往JAVA内存中添加数据就是输入(Input),反之就是输出(Output)
2)、按照内容分:
字节流:一个字节一个字节来传输 如果是要用来传输中文字符的话会把中文拆分成两个字节一个一个传输
字符流:一个字符一个字符传输(JAVA中一个字符是2个字节)
知识扩展:JAVA的流都是从四个抽象类中继承的:InputStream/OutputStream(字节流)Reader/Writer(字符流)并且InputStream和Reader,OutputStream和Writer的作用是相类似的
如上图比较详细和形象的描绘出了他们之间的关系
3)、按功能上来分:
节点流:流的两端直接接在节点上,功能负责两个节点间传输数据
下面这个小程序实现了文件之间的拷贝:
import java.io.*;
public class test{
public static void main(String[] args) throws Exception{
FileInputStream is = new FileInputStream("e:/123.txt");
FileOutputStream os = new FileOutputStream("e:/abc.txt");
int n = -1;
while((n = is.read()) != -1){
os.write((char)n);
}
is.close();
os.close();
}
}
注意:1、当JAVA往外面写数据的时候,如果流关闭再向文件写数据就会发生覆盖,如果关闭之前那么就会追加
2、只要是JAVA和别的内容建立连接(IO、数据库连接、socket连接)第一消耗时间,第二消耗资源,所以说用完务必关闭。
3、字节流中使用的是ISO-8859-1的编码;字符流使用的是unicode编码(UTF-8)所以说如果传输的数据当中是字符的话必须使用字符流,如上程序,只要把FileInputStream is = new FileInputStream("e:/123.txt");和FileOutputStream os = new FileOutputStream("e:/abc.txt");修改成:FileReader is = new FileReader ("e:/123.txt");和FileWriter os = new FileWriter ("e:/abc.txt");即可
处理流:不能直接接在节点上,只能套在节点流上。作用给节点流增加额外的功能。处理流不能单独使用(套在节点流的外面来增加功能)
缓冲流:给节点流增加缓冲区的功能
缓冲区:硬盘的损耗速度是跟硬盘的读写次数有关系的。在没有使用缓冲区的时候,往硬盘中写数据的时候是一个字节一个字节写的,如果使用缓冲区, 大小默认为8MB的话,会把数据先放到缓冲区中,当缓冲区中满后会自动写到硬盘当中,起到了保护硬盘的作用。
Flush()的两个作用:强制性的把缓冲区的数据写出到文件当中;刷新清空缓冲区
转换流:把字节流转换成字符流,所以只能套在字节流(基本上没有多大作用)
三、Date(数据流):
流里面传输的只能是字符和字节。不能传输JAVA的数据类型,但是数据流他就可以指定传输JAVA的数据类型,而且数据流他也是一个套在一个JAVA内存与硬盘之间的传输管道里面的。它可以写UTF或是Int类型的,并且这些都是属于JAVA自己本身认识的,在哦我们看来就是一些编码,但是对于JAVA来说它可以完全的认清楚他是什么数据类型。这个数据流会经常使用在我们以后用到的程序当中。
四、Object流:
作用:JAVA5.0的新特性序列化,他的作用就是用来读取对象的
序列化:把JAVA的对象写出去。它跟持久化差不多
反序列化:把读进来的数据封装成JAVA的对象
使用Object流来保存对象的时候必须在被保存对象的类中实现Serializable序列化接口。但是如果不想对对象中的某个属性序列化就在前面加上 transient关键字
如下程序描述了Object流的使用方法:
1 import java.io.*; 2 3 public class test{ 4 5 public static void main(String[] args) throws Exception{ 6 7 //ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/abc.txt")); 8 9 //oos.writeObject(new Person("jack","23","boy","student")); 10 11 //oos.close(); 12 13 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/abc.txt")); 14 15 Person p = (Person)ois.readObject(); 16 17 System.out.println(p.name); 18 19 System.out.println(p.age); 20 21 System.out.println(p.sex); 22 23 System.out.println(p.job); 24 } 25 } 26 27 class Person implements Serializable{ 28 29 String name; 30 31 String age; 32 33 transient String sex; 34 35 String job; 36 37 Person(String name,String age,String sex,String job){ 38 39 this.name = name; 40 41 this.age = age; 42 43 this.sex = sex; 44 45 this.job = job; 46 47 } 48 49 }