您的位置:首页 > 编程语言 > Java开发

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,且尽量存储通用的数据结构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: