Java-IO流(一)
java的IO通过java.io
包下的类和接口来支持,在该包下主要有输入、输出两种IO流,每种输出、输入流又可分为字节流和字符流。此外,Java的IO流使用了一种装饰器设计模式,将IO流分成底层节点流和上层处理流,其中节点流用于和物理储存节点直接关联,不同物理节点获取节点流的方式可能有差异,但程序可以把不同物理节点流包装成统一的处理流,从而允许程序使用统一的输入输出代码来读取不同的物理存储节点的资源。java.nio
及其子包提供了一系列API
,是对原IO的升级。
File类
访问文件和目录
File类是java.io
包下代表与平台无关的文件和目录,也就是说它并不能访问文件,需要时使用IO流。File
可以使用文件路径字符串来创建File
实例,通过调用实例方法来访问,如下:
访问文件名相关
- String getName():返回此
File
对象所表示的文件名或路径名。 - String
getPath()
:返回此File
对象所对应的路径名。 - File
getAbsoluteFile()
:返回此File
对象的绝对路径。 - String
getAbsolutePath()
:返回File
对象对应的绝对路径名。 - String
getParent()
:返回File
对象对应目录的父目录名。 - boolean
renameTo(File newName)
:重命名文件或目录,成功返回true。
还有文件检测方法、获取常规文件、文件操作相关和目录操作相关的方法等。注意文件路径用斜杠/
表示!
文件过滤器
在File
类的list()
方法中可以接收一个FilenameFilter
参数,通过该参数可以列出符合条件的文件,这里的FilenameFilter
接口和javax.swing.filechooser
包下的FileFilter
抽象类的功能非常相似,可以把FileFilter
当成FilenameFilter
实现类,但实际上没有实现该接口。
FilenameFilter
接口包含一个accept(File dir,String name)
方法,该方法对File
所指定的目录或文件进行迭代,如果返回true,则list()
方法会列出该子目录或文件。FilenameFilter
接口内只有一个抽象方法,因此该接口也是一个函数式接口,则可使用Lambda
表达式创建该接口对象。
1 | File file = new File("."); |
Java的IO流
Java输入/输出源抽象表述为“流”stream
,然后通过流的方法访问不同的输入/输出源。stream
是从起源到接收sink
的有序数据。所有的传统流的类都在java.io
包下,以实现输入/输出功能。
输入输出流
- 输入流:只能从中读取数据,而不能写入数据
- 输出流:只能向其写入数据,不能读数据。
Java的输入流主要由InputStream
和Reader
作为基类,输出流由OutputStream
和Writer
作为基类。
字节流和字符流
两者区别在于所操作的数据单元不同,字节流操作的数据单元是8位字节,而字符是16位的字符。字节流主要由InputStream
和OutputStream
作为基类,字符流由Reader
和Writer
作为基类。
节点流和处理流
可以向一个特定的IO
设备读写数据的流称为节点流low level stream
;处理流则对一个已存在的流进行连接或封装,通过封装后的流来实现数据读写功能,不会连接到实际的数据源,同时它被称作高级流
。Java使用处理流来包装节点流是一种典型的装饰器设计模式,通过来包装不同的节点流来消除节点间的差异,以通过更多方法完成输入输出,也叫包装流
。
IO流涉及40多个类,这些类非常有规则,它们都是从以下4个抽象基类派生而成。
IuputStream/Reader
:所有输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer
:所有输出流的基类,前者是字节输出流,后者是字符输出流。
此外,处理流的功能体现在以下两个方面:
- 性能提高:增加缓冲的方式提高IO效率。
- 操作便捷:处理流提供大量方法输入输出大批内容。
字节流和字符流
InputStream
和Reader
InputStream
包含如下三个方法:
int read()
:从输入流读取单个字节,并返回数据int read(byte[] b)
:从输入流中最多读取b.length
个字节并存储在数组中,返回实际读取的字节数。int read(byte[] b,int off,int len)
:从off开始读,最多读取len
个字节数据,放入b中,返回实际读取字节。
Reader
也有三个类似方法,但是读取字符数据。最后要显式关闭IO流,回收资源。
OutputStream
和Writer
void witer(int c)
:将指定字节/字符输出到输出流中,c可以是字节或字符。void writer(byte[]/char[] buf)
:将字节或字符数据输出到指定输出流中void writer(byte[]/char[] buf,int off,int len)
:从off开始,将长度为len的数据输出到输出流。
Writer
还包含void writer(String str)
,void writer(String str,int off,int len)
方法,用字符串代替字符数组。