一、流概述
流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流两种。I/O(Input/Output,输入/输出)流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。虽然 I/O 流通常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存和显示器窗口等。
Java 由数据流处理输入/输出模式,程序从指向源的输入流中读取源中的数据。源可以是文件、网络、压缩包或其他数据源。
输出流的指向是数据要到达的目的地,程序通过向输出流写入数据把信息传递到目的地。输出流的目标可以是文件、网络、压缩包、控制台和其他数据输出目标。
二、输入/输出流
Java 语言定义了许多类专门负责各种方式的输入/输出,这些类都被放在 java.io 包中。其中,所有输入流类都是抽象类 InputStream(字节输入流)或抽象类 Reader(字符输入流)的子类;而所有输出流都是抽象类 OutputStream(字节输出流)或抽象类 Writer(字符输出流)的子类。
2.1 输入流
InputStream 类是字节输入流的抽象类,是所有字节输入流的父类。 InputStream 类的具体层次结构如下图 :
该类中所有方法遇到错误时都会引发 IOException 异常。类中的常用方法 :
( 1 ) : read() 方法 :从输入流中读取数据的下一个字节。返回 0~255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1 。
( 2 ) :read(byte[] b) :从输入流中读入一定长度的字节,并以整数的形式返回字节数。
( 3 ) :mark(int readlimit) 方法 :在输入流的当前位置放置一个标记,readlimit 参数告知此输入流在标记位置失效之前允许读取的字节数。
( 4 ) :reset() 方法 :将输入指针返回到当前所做的标记处。
( 5 ) :skip(long n) 方法 :跳过输入流上的 n 个字节并返回实际跳过的字节数。
( 6 ) :markSupported() 方法 :如果当前流支持 mark() / reset() 操作就返回 True 。
( 7 ) :close() 方法 :关闭此输入流并是方法与该流关联的所有系统资源。
ps :并不是所有的 InputStream 类的子类都支持 InputStream 中定义的所有方法,如 skip() 、mark() 、reset() 等方法只对某些子类有用。
Java 中的字符是 Unicode 编码,是双字节的。InputStream 是用来处理字节的,并不适合处理字符文本。Java 为字符文本的输入专门提供了一套单独的类 Reader ,但 Reader 类并不是 InputStream 类的替换着,只是在处理字符串是简化了编程。Reader 类是字符输入流的抽象类,所有字符输入流的实现都是它的子类。Reader 类的层次结构如下图 :
2.2 输出流
OutputStream 类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类。OutputStream 类的层次结构如下图 :
OutputStream 类中的所有方法均返回 void ,在遇到错误时会引发 IOException 异常。OutputStream 常用的方法 :
( 1 ) :write(int b) 方法 :将指定的字节写入此输出流 。
( 2 ) :write(byte[] b) 方法 :将 b 个字节从指定的 byte 数组写入此输出流 。
( 3 ) :write(byte[] b , int off , int len) 方法 :将指定 byte 数组从偏移量 off 开始的 len 个字节写入此输出流 。
( 4 ) :flush() 方法 :彻底完成输出并清空缓存区 。
( 5 ) :close() 方法 :关闭输出流 。
Write 类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。Write 类的层次结构如下图 :
三、File 类
File 类是 java.io 包中唯一代表磁盘文件本身的对象。File 类定义了一些与平台无关的方法来操作文件,可以用过调用 File 类中的方法,实现创建、删除、重命名文件等操作。File 类的对象主要用来获取文件本身的一些信息,如文件所在的目录、文件的长度、文件读写权限等。数据流可以将数据写入到文件中,文件也是数据流最常用的数据媒体。
3.1 文件的创建与删除
可以使用 File 类创建一个文件对象。通常使用以下 3 种构造方法来创建文件对象 :
( 1 ) File(String pathname) :该构造方法通过将给定路径名字字符串转换为抽象路径名来创建一个新 File 实例。
语法 :
New File(String pathname) //pathname 指路径名称(也包含文件名)
eg : File file = new File("d:/1.txt");
( 2 ) File(String parent , String child) :该构造方法根据定义的父路径和子路径字符串(包含文件名)创建一个新的 File 对象。
语法 :
new File(String parent , String child)
//parent :父路劲字符串。例如:D: 或 D:/doc
//child :子路径字符串。例如 :letter.txt
( 3 ) File(File f , String child) :该构造方法根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
语法 :
new File(File f , String child)
// f :父路径对象。例如 :D:/doc/ 。
// child : 子路径字符串 。 例如 :letter.txt
当使用 File 类创建一个文件对象后。例如 :
File file = new File("word.txt");
如果当前目录中不存在名称为 word 的文件, File 类对象可通过调用 createNewFile() 方法创建一个名称为 word.txt 的文件;如果存在 word.txt 文件,可以通过文件对象的 delete() 方法将其删除。
eg3.1 :在项目中创建类 FileTest ,在主方法中判断 D 盘的 myword 文件夹是否存在 word.txt 文件,如果该文件将其删除,不存在则创建该文件。
package com.IODemo;
import java.io.File;
import java.io.IOException;
public class FileTest {
public static void main(String[] args) {
File file = new File("word.txt");// 创建文件对象
if (file.exists()) {// 如果该文件存在
file.delete();// 将该文件删除
System.out.println("文件已删除");
} else {// 如果文件不存在
try {// try 语句块捕捉可能出现的异常
file.createNewFile();// 创建该文件
System.out.println("文件已创建");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果为 :
文件已创建
3.2 获取文件信息
File 类提供了很多方法用于获取一些文件本身信息。
方法 | 返回值 | 说明 |
getName() | String | 获取文件的名称 |
canRead() | boolean | 判断文件是否是可读的 |
canWrite() | boolean | 判断文件是否可被写入 |
exits() | boolean | 判断文件是否存在 |
length() | long | 获取文件的长度(以字节为单位) |
getAbsolutePath() | String | 获取文件的绝对路径 |
getParent() | String | 获取文件的父路径 |
isFile() | boolean | 判断文件是否存在 |
isDirectory() | boolean | 判断文件是否是一个目录 |
isHidden() | boolean | 判断文件是否是隐藏文件 |
lastModified() | long | 获取文件最后修改时间 |
eg3.2 :获取当前文件夹下的 word.txt 文件的文件名、文件长度并判断该文件是否是隐藏文件。
package com.IODemo;
import java.io.File;
public class getFileInfoTest {
public static void main(String[] args) {
File file = new File("D:myword/word.txt");// 创建文件对象
if (file.exists()) {// 如果该文件存在
String name = file.getName();// 获取文件名称
long length = file.length();// 获取文件长度
boolean hidden = file.isHidden();// 判断文件是否是隐藏文件
System.out.println("文件名称:" + name);
System.out.println("文件长度是:" + length);
System.out.println("该文件是隐藏文件吗?" + hidden);
} else {// 如果文件不存在
System.out.println("该文件不存在");
}
}
}
运行结果为 :
文件名称:word.txt
文件长度是:0
该文件是隐藏文件吗?false