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

输入/输出流

分类字节输入流字节输出流字符输入流字符输出流
抽象基类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderFileWriter
访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
访问管道PipedInputStreamPipeOutputStreamPipedReaderPipedWriter
访问字符串StringReaderStringWriter
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamWriter
对象流ObjectInputStreamObjectOutputStream
抽象基类FileInputStreamFileOutputStreamFileReaderFileWriter
打印流PrintStreamPrintWriter
推回输出流PushbackInputStreamPushbackReader
特殊流DataInputStream   ZipInputStreamDataOutputStream   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来表示尺寸

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值