数据在计算机内存储转换必须要用到IO操作,了解IO操作机制,对我们编码时针对文件操作,提高系统性能,磁盘存储,数据网络传输等都有很大的帮助。
(1) java的IO流的概念是数据从源头到达目的存储地的有序数列,正是这些输入输出流实现了java的输入输出。
分类:我们最熟悉的要数字节流和字符流了,按照计算机的二进制存储规则,字节流是操作8位二进制位,字符流操作的基本单位则是16位二级制位单位。例如能够被计算机能够直接执行的是字节流,以二进制的形式存在于计算机上;txt文件则以字符的形式存在。
单纯针对字节流进行读写操作,流程较为复杂,所以提出了更加高级的处理流的概念。它主要的作用为:增加缓冲的方式来提高性能;提高易操作性。
操作对比:
使用文件字节流将文件内容读入到内存代码
try(FileInputStream stream =new FileInputStream("example.java")){
byte[] buff=new byte[1024];
int hasRead=0;
while((hasRead==stream.read(buff))>0){
System.out.println(new String(buff,0,hasRead));
}
stream.close();
}
使用包装类对IO流进行操作
try(FileInputStream stream=new FileInputStream("inputStream.java");
PrintStream ps=new PrintStream(stream)){
System.out.println(new 外部类);
}
此外,为将二进制字节流编码为易于人所理解的字符流,java的IO操作提供了转换流的概念。最常使用的是InputStream和OutputStream.
(2)java的IO操作提到另外一个重要的概念便是序列化,将对象转化为字节序列便于存储在磁盘或在网络上进行传输。我们要实现跨平台操作,必须将传递的参数,返回值进行序列化。
java提供的对象流对javaBean实现序列化,该javaBean必须实现java.io.serializable,举例:
try(ObjectOutputStream oos=new ObjectOutputStream(new FileInputStream("example.java"))){
Person per=new Person();
per.setName("张三");
oos.writeObject(per);
}
(3)NIO的改进
java 1.4首次提出NIO的概念,改进的直接方式是将磁盘数据直接映射如内存,这样代码在执行时就可以像访问内存数据一样了,在NIO包中添加了Channel和buffer相关类。
java 7则在NIO的基础上又一次做出巨大改进,使用Paths和Files两个核心类使得文件访问更加全面,灵活。通过WatchService启动后台线程来监听文件变化避免无线循环访问。