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

Java IO流和文件

2014-03-29 20:57 260 查看

流的定义:流是对内存中一组有序数据从起点到终点传输的抽象概念。

当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接;类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。这时候你就可以想象数据好像在这其中“流”动一样,如下图:



输入流



输出流
综合上图,人站在程序的角度来看:如果数据从外界传输程序中,则为输入流,例如从键盘输入数据到程序中;如果数据从程序中传到外界,则为输出流,例如程序中的数据输出到显示器中,或者输出到文件中。我们把这些不同源和目标的数据都统一抽象为I/O流。

Java I/O流的分类

按流向分:

输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。

按数据传输单位分:

字节流: 以字节为单位传输数据的流(一次读入或读出是8位二进制)
字符流: 以字符为单位传输数据的流(一次读入或读出是16位二进制)

按功能分:

节点流: 直接与数据源(source)或者目标(destination)相连接的流
处理流(过滤流): 是对一个已存在的节点流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。

综上所述,可以将Java流分类总结为如下图:



注意:

字节流到字符流转换:可以通过InputStreamReader(继承自Reader)或者OutputStreamWriter(继承自Writer)实现。
字符流到字节流转换:可以从字符流中获取char[]数组,转换为String,然后调用String的API函数getBytes() 获取到byte[],最后通过ByteArrayInputStream或者ByteArrayOutputStream来实现到字节流的转换。


处理流用来封装节点流,从而给节点流增加功能,不能独立存在。在关闭流时如果使用了处理流,只需关闭最外层的流就可以了。
区分节点流和处理流的小方法:看流的构造器参数,节点流参数为操作数据,而处理流参数为其他流。

Java I/O流选择策略

从Java I/O流的分类中,我们可以总结出I/O流的使用选择策略:

先考虑是字节流还是字符流
再考虑是输入流还是输出流
最后考虑是节点流还是处理流

Java I/O流常用类

JDK所提供的所有I/O流类位于java.io包中,都分别继承自以下四种抽象流类。(1char = 2byte = 16bit,1字=2字节=16位)

InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。
OutputStream:继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。
Reader:继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。
Writer:继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。

Java I/O流类图结构如下图所示:




Java I/O一般使用原则

一、按数据格式分:

二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有子类
纯文本格式(含纯英文与汉字或其他编码方式):Reader, Writer及其所有带Reader,

二、按输入输出分:

输入:Reader, InputStream类型的子类
输出:Writer, OutputStream类型的子类

三、按数据来源(去向)分:

文件: FileInputStream, FileOutputStream, FileReader, FileWriter
byte[]:ByteArrayInputStream, ByteArrayOutputStream
Char[]: CharArrayReader, CharArrayWriter
String: StringBufferInputStream, StringReader, StringWriter
网络数据流:InputStream, OutputStream, Reader, Writer

四、按是否要缓冲分:

缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter

五、按是否格式化输出分:

格式化输出:PrintStream, PrintWriter

六、特殊需要:

从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
对象输入输出:ObjectInputStream, ObjectOutputStream
进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
合并输入:SequenceInputStream
更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

文件

File类

File是对文件系统中文件以及文件夹进行封装的类,可以通过对象的思想来操作文件和文件夹。File对象保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。

RandomAccessFile类

RandomAccessFile并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区(字符数组),通过内部的指针来操作字符数组中的数据。它的特点是:

只能操作文件,不能操作文件夹,所以构造函数接收两种类型的参数:a.字符串文件路径;b.File对象。
既可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式(r,rw)

注意:RandomAccessFile在实例化:如果要操作的文件不存在,会自动创建;如果文件存在,写操作未指定写入位置,会从头开始写,即覆盖原有的内容。 可以用于多线程下载或多个线程同时写数据到文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: