输入/输出流
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问管道 | PipedInputStream | PipeOutputStream | PipedReader | PipedWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter | ||
对象流 | ObjectInputStream | ObjectOutputStream | ||
抽象基类 | FileInputStream | FileOutputStream | FileReader | FileWriter |
打印流 | PrintStream | PrintWriter | ||
推回输出流 | PushbackInputStream | PushbackReader | ||
特殊流 | DataInputStream ZipInputStream | DataOutputStream ZipOutputStream |
DataInputStream
和 DataOutputStream
可以以二进制格式读写所有的基本java类型; ZipInputStream
和 ZipOutputStream
可以以常见的zip压缩格式读写文件。
4个附加接口
注:
java.io.Closeable接口扩展了java.lang.AutoCloseable接口,Closeable接口的close方法之抛出IOException,而AutoCloseablie接口可抛出任何异常
常用封装类
方法 | 描述 |
---|---|
PrintWriter | 以文本格式打印对象 |
DataInput/DataOutput | 以二进制格式写数组、字符、boolean值和字符串的接口 |
RandomAccessFile | 同时实现了DataInput与DataOutput 接口,可以在文件中的任何位置查找或写入数据 |
ZipInputStream/ZipOutputStream | 读/写普通压缩文件 |
ObjectInputStream/ObjectOutputStream | 对象输入/输出流,用来保存回复对象数据(对象类需要序列化) |
操作文件
Paths:
表示一个目录序列,其后还可以跟着文件名
Paths 常用方法 |
描述 |
---|---|
get | 通过给定字符串创建一个路径 |
resolve(other) | 如果other是绝对路径,则返回other,否则返回通过连接this 和other获得的路径 |
resoleveSibling(other) | 如果other是绝对路径,则返回other,否则返回通过连接this的父路径 和other获得的路径 |
relativize(other) | 返回用this进行解析,相对于other的绝对路径,即如果p.resolve(q)产生r, 则p.relativize(r)产生路径q |
normalize | 移除路径中的所有冗余的”. ”和”.. ” |
Files:
封装文件的一般操作方法,使得普通文件操作变得敏捷
Files 常用方法 |
描述 |
---|---|
readAllByBytes | 以字节方式读取文件所有内容 |
readAllLines | 将文件当做行序列读入 |
writer | 写字符串到文件中 |
当然,以上发Files工具类的方法适用于处理中等长度的文本文件,如果要处理的文本文件长度比较大或者处理的是二进制文件,那么应该是用输入流/输出流或读入器/写出器
入 | 出 |
---|---|
InputStream in = Files.newInputStream(path) | OutputStream out = Files.newOutputStream(path) |
Reader in = Files.newBufferedReader (path,charset) | Writer out = Files.newBufferedWriter(path,charset) |
Files–常用方法
Files工具类包含的方法大致分为如下几种
1.创建文件或目录
2.复制、移动和删除文件
3.获取文件信息
4.访问目录中的项
方法 | 描述 |
---|---|
createDirectory(path) | 创建新目录 |
createFile(path) | 创建空文件(如果文件存在,会抛出异常) |
createTempFile(path) | 创建临时文件 |
copy | 复制文件 |
move | 移动文件 |
delete/deleteIfExists | 删除给定文件或空目录,第一个方法在文件不存在时会抛出异常,第二个方法则会在这种情况下返回false |
exists | 文件是否存在 |
isHidden | 文件是否隐藏 |
size(path) | 返回文件大小 |
isReadable/isWritable/isSymbolicLink … | … … … |
list(path) | 返回一个可以读取目录中各项的stream<path> 对象,不会进入子目录 |
walk(path) | 产生一个可以遍历目录中所有子孙目录的stream<path> 对象,如果需要对遍历过程进行更加细粒度的控制,应该是用Files.newDirectoryStream对象 |
try(DirectoryStream<path> entries = Files.newDirectoryStream(dir)){
for(Path entry : entries){
//do some thing
}
}
注:
Files.newDirectoryStream(dir)
产生的DirectoryStream不是java.util.stream.Stream的子接口,而是专门用于目录遍历的接口
ZIP文件系统
以下代码将建立一个文件系统,它包含ZIP文档的所有文件。
FileSystem fs = FileSystems.newFileSystem(Paths.get(zipName),null);
fs.getPath(String...) //与Paths.get类似
内存映射文件
java.nio包是用内存映射变得十分简单。
首先,从文件获取一个通道,通道是磁盘文件的一种抽象,它使我们可以访问诸如内存映射、文件枷锁机制以及文件间快速数据传递等操作系统特性
FileChannel channel = FileChannel.open(path,options);
上面代码中option是打开通道的三种模式之一。
分别是
FileChannel.MapMode.READ_ONLY:只读
FileChannel.MapMode.READ_WRITE:可写,任何修改都会在某个时刻写回到文件中
FileChannel.MapMode.PRIVATE:可写,但是修改对这个缓冲区是私有的,不会传播到文件中
缓存区数据结构
0 <= 标记 <= 位置 <= 界限 <= 容量文件枷锁机制
方法 | 描述 |
---|---|
lock | 在整个文件上获得一个独占的锁 |
lock(position,sizi,shared) | 在文件的一定区域获得锁,如果shared为false,则锁定文件的目的是读写,而如果未true,则这是一个共享锁,它允许多个进程从文件中读入,并组织任何进程获得独占锁 |
tryLock | 尝试获得独占锁,如果没有获得则返回null |
注意:
如果锁定了文件的尾部,而这个文件的长度随后如果超出了锁定部分,那么增长出来的区域是未锁定的,想要锁定所有的字节,可以使用Long.MAX_VALUE来表示尺寸