IO(Input/Output)是计算机输出/输出的接口。Java的核心库java.io提供了全面的IO接口,包括:文件读写,标准设备输出等等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。此外,Java也对块传输提供支持。
由于JDK的发展过程是一个逐步完善和升级的过程,因此不同版本的JDK对IO的支持也是不同的,从最初的简单IO支持到现在的多种资源类型支持,各个版本JDK在IO上的主要更新内容如下表所示:
| JDK版本 | 增加的内容 | 对应的APIs |
| 1.0.2 | | - BufferedInputStream, BufferedOutputStream 带缓存的I/O
- ByteArrayInputStream ByteArrayOutputStream 面向字节数组的I/O
- DataInputStream,DataOutputStream 面向数据(值与对象)的I/O
- File,FileDescriptor,FileInputStream,FileOutputStream 文件相关
- FilterInputStream,PushbackInputStream, FilterOutputStream 带过滤功能的I/O
- InputStream,LineNumberInputStream,PipedInputStream 常见输入流(InputStream是抽象超类)
- OutputStream, PipedOutputStream, PrintStream 常见输出流(OutputStream是抽象超类)
- RandomAccessFile 随机读写文件(可以自由地seek)
- SequenceInputStream 把多个输入流串起来当一个输入流看待
- StreamTokenizer 依赖分隔符将字符分隔成token方便读取的输入流
- StringBufferInputStream 此输入流的结果是得到一个String。
|
| 1.1 | | - BufferedReader 带缓存的字符输入流,并可逐行读取,对以的字节流类为: BufferedInputStream
- LineNumberReader 记录行号的字符输入流, 对以的字节流类为: LineNumberInputStream
- CharArrayReader 数组字符输入流,对以的字节流类为: ByteArrayInputStream
- InputStreamReader 将普通字节输入流封装成字符输入流的类
- FileReader 以字符流的方式读取文件, 对以的字节流类为: FileInputStream
- FilterReader 提供过滤功能的字符输入流的抽象类,对以的字节流类为: FilterInputStream
- PushbackReader FilterReader的之类,能提供追加字符的功能,对以的字节流类为: PushbackInputStream
- PipedReader 从PipedWriter中输出结果中读取信息的字符输入流, 对以的字节流类为:PipedInputStream
- StringReader 此字符输入流的结果是得到一个String,对以的字节流类为: StringBufferInputStream
- BufferedWriter 带缓存的字符输出流,并可逐行读取,对以的字节流类为: BufferedOutputStream
- CharArrayWriter 数组字符输出流,对以的字节流类为: ByteArrayOutputStream
- FilterWriter 提供过滤功能的字符输出流的抽象类,对以的字节流类为: FilterOutputStream
- OutputStreamWriter 将普通字节输出流封装成字符输出流的类
- FileWriter 以字符流的方式写文件, 对以的字节流类为: FileOutputStream
- PrintWriter 将值或对象打印到给定的输出流的类, 对以的字节流类为: PrintStream
- PipedWriter 向PipedReader输出信息的字符输出流, 对以的字节流类为: PipedOutputStream
- StringWriter 将信息输出到一个缓存串的字符输出流。
|
| 1.2 | - 增强了对非unix系统的支持,
- 添加了便利的文件创建删除和属性访问操作
| - File.createNewFile 创建文件
- File.createTempFile 创建临时文件
- File.deleteOnExit JVM退出时候删除文件
- File.listRoots获得文件系统的根路径列表
- File.isHidden是否隐藏文件,File.setLastModified设置最后修改时间戳,File.setReadOnly设置为只读
- File.getParentFile获得上层文件, File.getAbsoluteFile获得绝对路径, File.getCanonicalFile获得相对路径, File.listFiles列出目录下所有文件
- 新添接口FileFilter
|
| 1.4 | - java.nio的引入
- 原io包相关类对nio中channel的获取
- 原来reader和writer的子类构造函数增加支持charset的设置
| - java.nio 定义了buffer和内存块的操作。可以创建操作系统层面的direct buffer, 能提高在系统资源交换上的性能.
- java.nio.channels 定义了 channel这样一个实现I/O操作的抽象类型; 定义了用来做多路传输以及非堵塞I/O的selectors
- java.nio.channels.spi 提供channel的各种实现
- java.nio.charset 定了用作字符编码的编码器和解码器,用于byte和Unicode之间的转换。
- java.nio.charset.spi 定义了charset的实现。
- FileInputStream.getChannel, FileOutputStream.getChannel
- InputStreamReader.getChannel, OutputStreamWriter.getChannel
- RandomAccessFile.getChannel
|
| 1.5/5.0 | | - javax.net.ssl.SSLEngine 提供SSL/TLS层的功能封装
|
| 1.6/6.0 | - io包上增加了对控制台编程、磁盘空间查询以及读/写/执行权限的支持
- nio包上:
- linux平台上增加对kernel 2.6的 epoll的支持,提高了网络层selector的效率
- 增加系统级文件锁定的功能
| - System.console() 获得JVM唯一的控制台设备,在javaw运行时返回null
- Console.printf(String format, Object... args) 类似与c风格的打印功能
- Console.readLine()读入一行用户在控制台上的输入
- Console.readPassword从控制台读取密码(密码不回显)
- getTotalSpace() 本分区总空间
- getFreeSpace() 本分区空闲空间
- getUsableSpace() 本分区不可使用的空间
- setWritable, setWritable,setReadable,setExecutable 设置文件的读/写/执行权限
- IOException 添加了两个新的构造函数: IOException(String, Throwable)和 IOException(Throwable)
- nio包epoll的支持,文件全局锁定的支持,均相对透明
|
| 7.0 | - File相关类增加了很多根据便利的操作,nio.channels API支持File I/O操作
- NIO.2提供了多播和异步I/O的功能
| - AsynchronousByteChannel -读写字节的异步的channel接口.
- AsynchronousChannel - 支持异步操作的channel接口.
- CompletionHandler - 一个handler接口(类似与windows c的回调函数句柄),用来处理异步I/O的结果数据.
- MulticastChannel - 一个支持IP多播的channel接口.
- NetworkChannel -一个网络socket的channel接口.
- AsynchronousChannelGroup - 一个为了资源共享而建立的异步channel group
- AsynchronousDatagramChannel - 面向数据报文的异步socket channel
- AsynchronousFileChannel - 读写、管理文件的异步file channel
- AsynchronousServerSocketChannel - 面向流的server端监听异步的socket channel
- AsynchronousSocketChannel - 面向流的socket连接异步的channel
- MembershipKey - 一个描述IP多播成员关系的令牌
- java.nio.file提供诸多便利管理文件的类(以下仅仅给出个别方法)
- Path.copyTo, moveTo复制移动文件
- Path.register(WatchService watcher, WatchEvent.Kind<?>... events) 监视文件的修改事件
- PathMatcher.matches使用glob syntax对文件进行匹配
| PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.{java,class}"); Path filename = ...; if (matcher.matches(filename)) { System.out.println(filename); } | |