文件是数据的一个容器(口袋),文件可以存放大量的数据。文件很大,注定Java只能以流形式依次处理,每次处理一点点。
1. 文本文件读写
- 写文件:输出文本字符到文件中。
-> 先创建文件,写入数据,关闭文件
FileOutputStream(节点类,负责写字节), OutputStreamWriter(转化类,负责写文件时字符到字节转化), BufferedWriter(装饰类,负责写字符到缓存区);
三者构建关系:BufferedWriter(OutputStreamWriter(FileOutputStream))
-> BufferWriter: write(写), newLine(换行)
-> try-resource语句,自动关闭资源。(一个文件被程序打开了,就处于锁定状态了,防止其他程序访问。如果程序最后退出,没有关闭文件资源,将导致其他程序不能访问该文件)
-> 关闭最外层的数据流,将会把其上所有的数据流关闭
- 读文件:从文件中读取文本字符串
-> 先打开文件,逐行读入数据,关闭文件
FileInputStream(节点类,负责读文件字节), InputStreamReader(转化类,负责读文件时字节转字符), BufferedReader(装饰类,负责从缓存区读字符)
-> BufferReader: readLine
-> try-resource语句,自动关闭资源
-> 关闭最外层的数据流,将会把其上所有的数据流关闭
public class Main {
public static String filePath = "/users/qjq/IdeaProjects/testFile/test.txt"; //已存在的目录路径
public static void main(String[] args) throws IOException {
// writeFile1();
writeFile2();
// readFile1();
readFile2();
}
public static void writeFile1() {
FileOutputStream fos = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
fos = new FileOutputStream(filePath); // 节点类,负责写字节
osw = new OutputStreamWriter(fos, "UTF-8"); // 转化类,负责字符转字节;此处采用UTF-8写,读的时候也要采用UTF-8
bw = new BufferedWriter(osw); // 装饰类,负责写字符到字符串
bw.write("我们是");
bw.newLine();
bw.write("Ecnus.^^");
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.close(); // 关闭最后一个类,会将所有的底层流都关闭
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void writeFile2() {
/**
* try-resource语句,自动关闭资源。
* try 后面可以加上一个括号,括号里面可以定义一个变量,这个变量将在try结束后,自动对变量进行释放,调用close方法。
* try-resource语句极大提高编程效率。
*/
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath)))) {
bw.write("我们是");
bw.newLine();
bw.write("Ecnuers.^^");
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readFile1() {
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
fis = new FileInputStream(filePath);
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) { // 每次读取一行
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void readFile2() {
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)))) {
String line;
// try-resource 语句,自动关闭资源
while ((line = br.readLine()) != null) { // 每次读取一行
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 二进制文件读写
二进制文件:
-> 狭义上说,二进制文件是采用字节编码,非字符编码的文件
-> 广义上说,一切文件都是二进制文件
-> 用记事本等无法打开/阅读
包括:
-> 一般二进制文件,如数据文件dat
-> 带特殊格式的文本文件,如xml等
-> 带特殊格式二进制文件,如doc,ppt等
二进制文件读写:
-> 输出数据到文件中
-> 从文件中读取数据
- 写文件:
- > 先创建文件,写入数据,关闭文件
FileOutputStream(节点类,负责写字节), BufferedOutputStream(装饰类,负责缓存字节流), DataOutputStream(装饰类,负责封装数据流,也即数据类型到字节转化)
-> DataOutputStream: flush(刷新缓存), write/writeBoolean/writeByte/writeChars/writeDouble/writeInt/writeUTF/...
-> try-resources语句,自动关闭资源。(一个文件被程序打开了,就处于锁定状态了,防止其他程序访问。如果程序最后退出,没有关闭文件资源,将导致其他程序不能访问该文件)
-> 关闭最外层的数据流,将会把其上所有的数据流关闭
- 读文件
-> 先打开文件,读入数据,关闭文件
-> FileInputStream(节点类,负责从文件系统读字节), BufferedInputStream(装饰类,负责从缓存区读取字节流), DataInputStream(装饰类,封装数据流,字节转为数据类型)
-> DataInputStream: read/readBoolean/readChar/readDouble/readFloat/readInt/readUTF/...
-> try-resource语句,自动关闭资源
-> 关闭最外层的数据流,将会把其上所有的数据流关闭
public class Main {
public static String filePath = "/users/qjq/IdeaProjects/testFile/test.txt"; //已存在的目录路径
public static void main(String[] args) throws IOException {
writeBinaryFile();
readBinaryFile();
}
public static void writeBinaryFile() {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
DataOutputStream dos = null;
try {
fos = new FileOutputStream(filePath); // 节点类,负责写字节
bos = new BufferedOutputStream(fos); // 装饰类,负责写字节数据到缓冲区
dos = new DataOutputStream(bos); // 装饰类,负责数据类型到字节转化
dos.writeUTF("a");
dos.writeInt(20);
dos.writeInt(180);
dos.writeUTF("b");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void readBinaryFile() {
// try-resource 语句,自动关闭资源
try (DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)))) {
String a, b;
int c, d;
a = dis.readUTF();
c = dis.readInt();
d = dis.readInt();
b = dis.readUTF();
System.out.println("a:" + a);
System.out.println("c:" + c);
System.out.println("b:" + d);
System.out.println("d:" + b);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. Zip文件读写
压缩包:zip, rar, gz, ...
Java zip包支持Zip和Gzip包的压缩和解压