输入/输出流
- read和write方法在执行时都将阻塞,直至字节确实被读入或写出。
- 完成操作后要通过close方法将资源关闭,输出流在关闭时会冲刷缓冲区。
完整的流家族
任何实现了Closeable接口的类都可以使用try-with-resource来自动关闭资源
组合输入/输出流过滤器
- FileInputStream和FileOutputStream可以向构造器提供一个文件名或玩增路径名来获取对应文件的流。
- 所有在java.io中的类都将相对路径名解释为以用户工作目录开始。可以通过System.getProterty("user.dir")来获取工作目录
- windows和linux的文件分隔符是不一样的,对于可移植的程序来说应该用常量字符串java.io.File.separator来获取它
- System.getPrority("line.separator")获取当前主机恰当的结束符
- 各种不同功能的流过滤器可以非常灵活的组合在一起,来达到想要的功能
文本输入与输出
- 在保存数据时,可以选择二进制格式或文本格式(字符串)。二进制格式I/O高速且高效,但不适合阅读。
- java内部使用的编码方式是UTF-16,每个码元用两个字节表示。
- 互联网上常用UTF-8来编码,在获取输入输出流时应该指定我们的编码方式,不然就是用主机系统默认的,不同平台的不同,会出现跨平台错误
PrintWriter
此类可以用于文本输出,能以打印字符串和数字的方法。
字符编码方式
- Java针对字符使用的时Unicode标准,每个字符或编码点都具有一个21位的整数。
- 最常见的utf-8会将每个unicode编码点编码位1-4个字节序列。是动态的
- UTF-16是将每个Unicode编码点编码为1个或2个16位值,要么2个字节,要么4个字节
读写二进制数据
随机访问文件
zip文档
对象输入输出
操作文件
java.nio.file.Path
java.nio.file.Files
Files处理中等长度的文件可以很方便,大文件还是应该使用输入流输出流、读入器写出器
-
读写文件
-
创建文件和目录
-
移动、复制、删除文件
-
获取文件信息
-
访问目录中的项
- Files.list(Path) -- Stream
不会进入子目录 - Files.walk(Path) -- Stream
处理所有子目录 - Files.walk<Path) -- Stream<Path,depth> 限制访问子目录深度
-
使用目录流
DirectorStream不是java.util.stream.Stream的子接口,二十Iterable的子接口,可以for循环
-
zip文件系统
内存映射文件
大多数操作系统可以利用虚拟内存实现将一个文件或一部分映射到内存中,然后像内存数组一样访问,会快得多
-
缓冲区数据结构
-
文件加锁机制