4、IO流与文件
IO流:在Java API中,可以从其中读取一个字节序列的对象称作输入流,向其中写入一个字节序列的对象叫做输出流。
抽象类InputStream和OutputStream构成了输入/输出(I/O)的字节基础类,Reader和Writer抽象类构成字符的输入输出流。
文件:IO流对文件进行读取,但是文件本身的操作需要有自己的类,File和Path类就是文件操作的基本类。
4.1 IO流的划分
IO流基本划分如下图所示。
(1)InputStream类
InputStream类是字节输入流的基类,下面是该类的基本方法:
返回类型 | 方法 |
---|---|
int |
available() 返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。 |
void |
close() 关闭此输入流并释放与流相关联的任何系统资源。 |
void |
mark(int readlimit) 标记此输入流中的当前位置。 |
boolean |
markSupported() 测试这个输入流是否支持 |
abstract int |
read() 从输入流读取数据的下一个字节。 |
int |
read(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 |
int |
read(byte[] b, int off, int len) 从输入流读取最多 |
void |
reset() 将此流重新定位到上次在此输入流上调用 |
long |
skip(long n) 跳过并丢弃来自此输入流的 |
例如,FileInputStream继承InputStream,该流用于从文件读取数据,它的对象可以用关键字 new 来创建。有多种构造方法可用来创建对象。
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f = new FileInputStream("C:/java/hello");
(2)OutputStream类
这个抽象类是表示字节输出流的所有类的超类。 输出流接收输出字节并将其发送到某个接收器。
返回 | 方法名 |
---|---|
void |
close() 关闭此输出流并释放与此流相关联的任何系统资源。 |
void |
flush() 刷新此输出流并强制任何缓冲的输出字节被写出。 |
void |
write(byte[] b) 将 |
void |
write(byte[] b, int off, int len) 从指定的字节数组写入 |
abstract void |
write(int b) 将指定的字节写入此输出流。 |
(3)Writer类
用于写入字符流的抽象类。 子类必须实现的唯一方法是write(char [],int,int),flush()和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。
返回类型 | 方法名称 |
---|---|
Writer |
append(char c) 将指定的字符附加到此作者。 |
Writer |
append(CharSequence csq) 将指定的字符序列附加到此作者。 |
Writer |
append(CharSequence csq, int start, int end) 将指定字符序列的子序列附加到此作者。 |
abstract void |
close() 关闭流,先刷新。 |
abstract void |
flush() 刷新流。 |
void |
write(char[] cbuf) 写入一个字符数组。 |
abstract void |
write(char[] cbuf, int off, int len) 写入字符数组的一部分。 参数:
|
void |
write(int c) 写一个字符 |
void |
write(String str) 写一个字符串 |
void |
write(String str, int off, int len) 写一个字符串的一部分。 |
(4)Reader类
用于读取字符流的抽象类。 子类必须实现的唯一方法是read(char [],int,int)和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。
返回类型 | 方法名称 |
---|---|
abstract void |
close() 关闭流并释放与之相关联的任何系统资源。 |
void |
mark(int readAheadLimit) 标记流中的当前位置。 |
boolean |
markSupported() 告诉这个流是否支持mark()操作。 |
int |
read() 读一个字符 |
int |
read(char[] cbuf) 将字符读入数组。 |
abstract int |
read(char[] cbuf, int off, int len) 将字符读入数组的一部分。 |
int |
read(CharBuffer target) 尝试将字符读入指定的字符缓冲区。 |
boolean |
ready() 告诉这个流是否准备好被读取。 |
void |
reset() 重置流。 |
long |
skip(long n) 跳过字符 |
4.2 文件的操作类File
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。
创建File对象的方式:
通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。
File(File parent, String child);
通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
File(String pathname)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(String parent, String child)
通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。
File(URI uri)
创建File对象成功后,可以使用以下列表中的方法操作文件。
序号 | 方法描述 |
---|---|
1 | public String getName() 返回由此抽象路径名表示的文件或目录的名称。 |
2 | public String getParent() 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null 。 |
3 | public File getParentFile() 返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回 null 。 |
4 | public String getPath() 将此抽象路径名转换为一个路径名字符串。 |
5 | public boolean isAbsolute() 测试此抽象路径名是否为绝对路径名。 |
6 | public String getAbsolutePath() 返回抽象路径名的绝对路径名字符串。 |
7 | public boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 |
8 | public boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 |
9 | public boolean exists() 测试此抽象路径名表示的文件或目录是否存在。 |
10 | public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 |
11 | public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 |
12 | public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。 |
13 | public long length() 返回由此抽象路径名表示的文件的长度。 |
14 | public boolean createNewFile() throws IOException 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。 |
15 | public boolean delete() 删除此抽象路径名表示的文件或目录。 |
16 | public void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 |
17 | public String[] list() 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。 |
18 | public String[] list(FilenameFilter filter) 返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。 |
19 | public File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。 |
20 | public File[] listFiles(FileFilter filter) 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。 |
21 | public boolean mkdir() 创建此抽象路径名指定的目录。 |
22 | public boolean mkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。 |
23 | public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。 |
24 | public boolean setLastModified(long time) 设置由此抽象路径名所指定的文件或目录的最后一次修改时间。 |
25 | public boolean setReadOnly() 标记此抽象路径名指定的文件或目录,以便只可对其进行读操作。 |
26 | public static File createTempFile(String prefix, String suffix, File directory) throws IOException 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 |
27 | public static File createTempFile(String prefix, String suffix) throws IOException 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 |
28 | public int compareTo(File pathname) 按字母顺序比较两个抽象路径名。 |
29 | public int compareTo(Object o) 按字母顺序比较抽象路径名与给定对象。 |
30 | public boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等。 |
31 | public String toString() 返回此抽象路径名的路径名字符串。 |
以下是File文件操作的实例:
import java.io.*;
public class FileTest {
/**
* 复制文件
* @throws IOException
*/
public static void fileOperation()throws IOException {
String pathName="F:/Test";
if(!new File(pathName).isDirectory()){
new File(pathName).mkdirs();
}
File fileIn = new File(pathName,"test.txt");
File fileOut = new File(pathName,"test1.txt");
//文件不存在,创建
if(!fileIn.exists()){
fileIn.createNewFile();
}
if(!fileOut.exists()){
fileOut.createNewFile();
}
FileInputStream fileInputStream =new FileInputStream(fileIn);
FileOutputStream fileOutputStream = new FileOutputStream(fileOut);
//字节流转换成字符流---InputStreamReader
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
String temp =null;
while ((temp = bufferedReader.readLine()) != null) {
bufferedWriter.write(temp+"\r\n");
}
bufferedReader.close();
bufferedReader.close();
}
public static void main(String[] args) {
try {
fileOperation();
} catch (IOException e) {
e.printStackTrace();
}
}
}