1.1 IO流概述
1.1.1 流的分类
- 1.按操作数据单位:字节流、字符流
- 2.按数据的流向:输入流、输出流
- 3.按流的角色:节点流、处理流
1.1.2 流的体系结构
一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图:
1.2 输入、输出的标准化过程
1.2.1 输入过程
① 创建File类的对象,指明读取的数据的来源。(要求此文件一定要存在)
② 创建相应的输入流,将File类的对象作为参数,传入流的构造器中
③ 具体的读入过程:
创建相应的byte[] 或 char[]。
④ 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally处理。
1.2.2 输出过程
① 创建File类的对象,指明写出的数据的位置。(不要求此文件一定要存在)
② 创建相应的输出流,将File类的对象作为参数,传入流的构造器中
③ 具体的写出过程:
write(char[]/byte[] buffer,0,len)
④ 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally处理。
1.3 File类
1.3.1 File类理解
- File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)
- File类声明在java.io包下
- File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法, 并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
- 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点".
1.3.2 File的实例化
常用构造器
- File(String filePath)
- File(String parentPath,String childPath)
- File(File parentFile,String childPath)
路径的分类
- 相对路径:相较于某个路径下,指明的路径。
- 绝对路径:包含盘符在内的文件或文件目录的路径。
说明
IDEA中:
如果大家开发使用JUnit中的单元测试方法测试,相对路径即为当前Module下。
如果大家使用main()测试,相对路径即为当前的Project下。
Eclipse中:
不管使用单元测试方法还是使用main()测试,相对路径都是当前的Project下。
1.4 FileReader/FileWriter的使用
1.4.1 FileReader的使用
首先介紹两种流操作:
- public void close() throws IOException{}
关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 - public int read(byte[] r) throws IOException{}
这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。
例1:将review01下的hello.txt文件内容读入程序中,并输出到控制台
@Test
public void test002() {
FileReader fr = null;
try {
//1.File类的实例化
File file = new File("E:\\Review\\src\\review01\\hello.txt");
//2.FileReader流的实例化
fr = new FileReader(file);
//3.读入的操作
char[] cbuf = new char[5];
int len = 0;
//read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
while((len = fr.read(cbuf)) != -1){
String str = new String(cbuf, 0, len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.资源的关闭
if (fr != null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注:public String(byte[] bytes,int offset,int length)这个方法表示 将字符数组bytes从第offset个字符开始,长度为length的所有字符构建成一个字符串。
1.4.2 FileWriter的使用
涉及到的流操作:
- public void write(byte[] w)
把指定数组中w.length长度的字节写到OutputStream中。
说明:
- 输出操作,对应的File可以不存在的。并不会报异常
- File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
File对应的硬盘中的文件如果存在:
如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原文件的覆盖
如果流使用的构造器是:FileWriter(file,true):不会对原文件覆盖,而是在原文件基础上追加内容
例:从内存中写出数据到硬盘的文件里。
@Test
public void writeTest(){
FileWriter fw = null;
try {
//1.提供File类的对象,指明写出到的文件
File file = new File("hello1.txt");
//2.提供FileWriter的对象,用于数据的写出
fw = new FileWriter(file, false);
//3.写出的操作
fw.write("abcd\n");
fw.write("efg");
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.流资源的关闭
if (fw != null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
1.4.3 文本文件的复制
例:将Project下的hello1.txt复制为hello2.txt
@Test
public void test03(){
FileReader fr = null;
FileWriter fw = null;
try {
//1.创建File类的对象,指明读入和写出的文件
File file = new File("hello1.txt");//读入的文件
File destFile = new File("hello2.txt");//写出的文件
//2.创建输入流和输出流的对象
fr = new FileReader(file);
fw = new FileWriter(destFile);
、
//3.数据的读入和写出操作
char[] c = new char[5];
int len;
while ((len = fr.read(c)) != -1){
fw.write(c,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭流资源
if (fr != null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw != null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
1.5 FileInputStream / FileOutputStream的使用
- 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
- .对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,…),使用字节流处理
例:实现对图片的复制操作
@Test
public void test1(){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//1.创建File类的对象,指明读入和写出的文件
File file = new File("xx.jpg");
File descFile = new File("yy.jpg");
//2.创建输入流和输出流的对象
fis = new FileInputStream(file);
fos = new FileOutputStream(descFile);
//3.数据的读入和写出操作
byte[] bytes = new byte[5];
int len;
while ((len = fis.read(bytes)) != -1){
fos.write(bytes,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.资源关闭
if (fis !=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
文章参考:
b站尚硅谷宋红康老师Java教学视频;
菜鸟教程:https://www.runoob.com/java/java-files-io.html