java中关于“输入输出”小结

输入/输出流

分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 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

DataInputStreamDataOutputStream 可以以二进制格式读写所有的基本java类型; ZipInputStreamZipOutputStream 可以以常见的zip压缩格式读写文件。

4个附加接口

与流相关的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来表示尺寸

猜你喜欢

转载自blog.csdn.net/qq_31898845/article/details/80700055
今日推荐