01--Java IO基础
2017-01-11 09:50
357 查看
一、java.io包概览
Java IO包主要可以分为如下4类:基于字节操作的I/O接口:InputStream和OutputStream。
基于字符操作的I/O接口:Writer和Reader
基于磁盘操作的I/O接口:File。
基于网络操作的I/O接口:Socket(没在IO包下)。
前2种区分I/O操作中数据的格式,后2种主要是数据传输的方式。
二、基于字节的I/O操作
1、 InputStream介绍
InputStream是所有基于字节格式处理读数据的父类,其类层次结构如及大致介绍下:String data = "你好周杰伦\n快来快来\n顶顶顶顶"; Writer writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream("output_stream_writer.txt",true),"UTF-8")); writer.write(data); System.out.println("write over"); writer.close();
View Code
3. 字节与字符的转化接口
数据持久化或网络传输都是以字节进行的,所以必须有从字符到字节或字节到字符的转化接口,从字符到字节需要转化,其过程为:InputStreamReader类是从字节到字符的转化的桥梁,从InputStream到Reader要制定编码字符集,否则会用系统某人字符集,很可能出现乱码问题。StreamDecoder是完成从字节到字符解码功能实现类。
FileReader类就是按上述方式读取文件内容的,FileReader继承自InputStreamReader类,实际上是读取文件,然后通过StreamDecoder解码成char,此处用的默认字符编码集。
写入过程类似,
通过OutputStreamWriter类 完成从字符到字节的编码过程,有StreamEncoder完成编码过程。
四、磁盘I/O机制分析
读取和写入文件需调用操作系统接口,分别对应read和write2个系统调用,而只要是系统调用,就可能存在内核地址空间和用户地址空间转换的问题,因为操作系统需保护自身运行的安全性。但内核调用时存在数据从内核复制到用户空间的问题,若遇到非常耗时的I/O操作,性能会很差。
因此,操作系统在内核使用缓存机制,以减少I/O相应时间。下面是常见的文件访问方式。
1. 标准文件访问方式
read时,OS检查内核缓存是否有,有则返回缓存,无则从磁盘读取,并缓存。write时,OS将用户空间数据复制到内核地址缓存,这是对用户程序来说,write已经完成,但写入磁盘的时机由OS决定,除非显示调用sync命令。
2. 直接I/O方式
直接I/O方式指应用程序直接访问磁盘数据,而不经过OS内核缓冲区,目的是为了减少从内核缓冲区到用户空间数据复制的时间,此种方式常用于数据库。因为数据库明确知道应该缓存哪些数据,且可对热点数据提前预加载到内存,负面影响是若数据不在应用缓存中,则会直接去磁盘操作,此时耗时较多。
因此,直接I/O通常会跟异步I/O结合使用。
3. 同步访问文件的方式
数据写入和读取都是同步的,只有数据成功写到磁盘时才返回写成功,性能较差,用于对数据安全性要求较高的场合,且硬件通常是定制的。4. 异步访问方式
发出访问数据请求后,线程会接着处理其他事情,而不是堵塞等待,请求数据返回后才处理下面的操作。此方式明显提高应用程序的效率,但不会改变访问文件的效率。
5. 内存映射方式
将内存和硬盘映射,当访问内存时,转化到访问磁盘,目的是减少内核到用户空间的数据复制,因为此时这2个空间的数据是共享的。五、 File和FileDescriptor类
1. File类
Java中的File类并不代表一个真实存在的文件对象,当创建一个File对象时,返回代表这个路径的虚拟对象该路径本身可能是个文件或文件夹,不会检查改路径是否存在。
2. FileDescriptor类
当真正访问文件时,会创建一个关联真实存在的磁盘文件的文件描述符FileDescriptor,通过这个对象可以直接控制磁盘文件。File对象可以通过getFD方法获取FileDescriptor对象,FileDescriptor.sync()方法将OS缓存数据强制刷新到磁盘中。
六、Java序列化技术
一般会用通用技术存储,如JSON或XML,且尽量存储通用的数据结构。相关文章推荐
- [零基础学JAVA]Java SE应用部分-27.Java IO操作(01) 推荐
- 黑马程序员 14 Java基础教学 - 14 - IO体系总结01
- Java IO学习基础之读写文本文件
- Java IO学习基础之读写文本文件
- Java IO学习基础之读写文本文件
- [零基础学JAVA]Java SE应用部分-23.多线程(01) 推荐
- Java IO学习基础之读写文本文件
- [零基础学JAVA]Java SE应用部分-31.Java IO操作(05)IO操作实例讲解之实现简单MIS 推荐
- Java基础学习之感悟01
- [零基础学JAVA]Java SE面向对象部分-13.面向对象高级(01) 推荐
- java基础应用01(应用题:走梅花桩)
- Java IO学习基础之读写文本文件
- JAVA基础IO介绍
- JAVA基础:使用缓冲IO提高Java程序性能
- [零基础学JAVA]Java SE基础部分-01. Java发展及JDK配置
- Java IO学习基础之读写文本文件
- Java 基础复习 01
- Java IO学习基础之读写文本文-Java基础-Java-编程开发
- [零基础学JAVA]Java SE应用部分-29.Java IO操作(03) 推荐
- [零基础学JAVA]Java SE应用部分-30.Java IO操作(04) 推荐