一、File类
File类是java.io包下代表与平台无关的文件或目录,你可以使用File类来新建、删除、重命名文件或目录,但是你不能使用File来访问文件的内容本身。如果想访问内容,必须使用输入/输出流。
File类为开发者提供了一堆创建、获取文件或目录基本信息、判断属性状态等的方法。
二、IO流
在Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream),通过流的方式运行Java程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接受(sink)的有序数据。
2.1 流的分类
由于从不同的角度对流进行分类,所以各种流的概念可能会有重叠
2.1.1 输入流与输出流
输入流:只能从中读数据,不能向其写数据;Java输入流主要以InputStream和Reader作为基类
输出流:只能向其写数据,不能从其读数据;Java输出流主要以OutputStream和Writer作为基类
2.1.2 字节流与字符流
字节流:操作的是8bit的单字节;Java中字节流主要以InputStream和OutputStream作为基类
字符流:操作的是16bit的双字节;Java中字符流主要以Reader和Writer作为基类
2.1.3 节点流和处理流
节点流:从/向一个特定IO设备(磁盘、网络)读写数据的流,也被称为低级流
处理流:对一个已存在的流进行连接或封装,通过封装后的流来实现数据读写功能,也被称为高级流或包装流
Java通过处理流来包装节点流是一种装饰者设计模式,这样既可以消除不同节点流的实现差异,也可以提供方便的方法来完成输入/输出功能。
三、字节流与字符流
3.1 InputStream和Reader
InputStream和Reader是所有输入流的抽象基类,本身并不能创建实例完成执行输入,但它们将成为所有输入流的模板,所以它们的方法是所有输入流都可以使用的方法。
这两个类如果单独读取一个字节或字符,都会将字节数据或字符数据直接转换成int类型返回。通常以int或byte[]来接收从流中读取出来的数据。
对于这两个抽象类它们分别有一个用于读取文件的输入流:FileInputStream和FileReader,它们都是节点流,会直接和指定文件关联。
四、Java IO流体系中常用的流分类
流分类 | 使用分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer | |
节点流 | 访问文件 | FileInputStream | FileOutStream | FileReader | FileWriter |
节点流 | 访问数值 | ByteArrayInputStream | ByteArrayOutStream | CharArrayReader | CharArrayWriter |
节点流 | 访问管道 | PipedInputStream | PipedOutStream | PipedReader | PipedWriter |
节点流 | 访问字符串 | StringReader | StringWriter | ||
处理流 | 缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
处理流 | 转换流 | InputStreamReader | OutputStreamWriter | ||
处理流 | 对象流 | ObjectInputStream | ObjectOutputStream | ||
处理流 | 抽象基类(过滤) | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
处理流 | 打印流 | PrintStream | PrintWriter | ||
处理流 | 推回输入流 | PushbackInputStream | PushbackReader | ||
处理流 | 特殊流 | DataInputStream | DataOutputStream |