Day37 IO流的操作
文章目录
- Day37 IO流的操作
- Java的文件拷贝
- 利用 文件字节输出流 向文件写入数据
- 利用 文件字节输入流 读取文件里的数据
- 利用 带缓冲区的字节输出流 向文件写入数据
- 利用 带有缓冲区的字节输入流 读取文件里的数据
- 利用 字符输出转换流 向文件写入数据
- 利用 字符输入转换流 读取文件里的数据
Java的文件拷贝
1、概念: 在Java中,可以使用IO流来实现文件的拷贝操作。一种常见的方式是使用FileInputStream
和FileOutputStream
来逐字节读取和写入文件内容。
2、思路:读取源文件,写入目标文件
3、示例:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Copy {
public static void main(String[] args){
//注意:小括号里创建的流会在try...catch后自动关闭
try(FileInputStream fis = new FileInputStream("小雷.mp4");
FileOutputStream fos = new FileOutputStream("copy.mp4");) {
byte[] bs = new byte[1024];
int len;
while((len = fis.read(bs)) != -1){
fos.write(bs, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
利用 文件字节输出流 向文件写入数据
1、思路:
- 准备要写入文件的数据和文件路径。
- 创建一个 FileOutputStream 对象,指定要写入的文件路径。
- 将要写入的数据转换为字节数组。
- 使用 FileOutputStream 对象的 write 方法将字节数组写入文件。
- 关闭 FileOutputStream 对象,确保数据被写入文件并释放资源。
- 在必要的情况下处理可能出现的 IOException 异常。
2、注意情况:
-
- 不处理异常
-
- 当文件存在时
-
- 当文件不存在时
经验:所有的输出流,当文件不存在时都会创建该文件
-
- 在文件末尾追加内容
经验:在文件末尾追加考虑基础流的构造方法
-
- 处理异常
3、示例:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test03 {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
//1.创建流对象 + 设置在文件末尾追加
fos = new FileOutputStream("io.txt",true);
//2.写入数据
fos.write("123abc".getBytes());//写入byte数组
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.关闭资源
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
利用 文件字节输入流 读取文件里的数据
1、思路:
- 准备要读取的文件路径。
- 创建一个 FileInputStream 对象,指定要读取的文件路径。
- 创建一个字节数组来存储读取的数据。
- 使用 FileInputStream 对象的 read 方法读取文件中的数据到字节数组中。
- 关闭 FileInputStream 对象,确保文件资源被释放。
- 将字节数组中的数据转换为字符串或进行其他处理。
2、注意情况:
-
1) 不处理异常
-
2) 文件存在
-
- 文件不存在
经验:所有文件输入流,在文件不存在的情况下都会报错 – FileNotFoundException
-
4) 处理异常
3、示例:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test07 {
public static void main(String[] args){
FileInputStream fis = null;
try {
//1.创建流对象
fis = new FileInputStream("io.txt");
//2.读取数据
//read(bs):读取bs长度的数据,并把数据放入数组,返回读取到的有效字节数,如果读取到文件末尾则返回-1
byte[] bs = new byte[1024];
int len;
while((len = fis.read(bs)) != -1){
System.out.println(new String(bs, 0, len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.关闭资源
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
利用 带缓冲区的字节输出流 向文件写入数据
1、思路:
- 准备要写入文件的数据和文件路径。
- 创建一个 FileOutputStream 对象,用于向文件写入数据。
- 将 FileOutputStream 对象包装在一个 BufferedOutputStream 对象中,以提高写入性能。
- 将要写入的数据转换为字节数组。
- 使用 BufferedOutputStream 对象的 write 方法将字节数组写入缓冲区。
- 在适当的时机,调用 BufferedOutputStream 对象的 flush 方法将缓冲区中的数据刷新到文件中。
- 关闭 BufferedOutputStream 对象,确保数据被写入文件并释放资源。
- 在必要的情况下处理可能出现的 IOException 异常。
2、注意情况:
-
1)不处理异常的方式
-
2)文件存在的情况
-
3)文件不存在的情况
经验:所有的输出流,文件不存在的情况都会创建文件
-
4)在文件末尾追加内容
经验:在文件末尾追加考虑基础流的构造方法
-
5)处理异常的方式
3、示例:
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test03 {
public static void main(String[] args){
BufferedOutputStream bos = null;
try {
//1.创建流对象
bos = new BufferedOutputStream(new FileOutputStream("io.txt",true));
//2.写入数据
bos.write("123abc".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.关闭资源
if(bos != null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
利用 带有缓冲区的字节输入流 读取文件里的数据
1、思路:
- 准备要读取的文件路径。
- 创建一个 FileInputStream 对象,用于从文件读取数据。
- 将 FileInputStream 对象包装在一个 BufferedInputStream 对象中,以提高读取性能。
- 创建一个字节数组或 ByteBuffer 来存储读取的数据。
- 使用 BufferedInputStream 对象的 read 方法从文件中读取数据到缓冲区中。
- 在适当的时机,处理从缓冲区中读取的数据,例如转换为字符串或进行其他处理。
- 关闭 BufferedInputStream 对象,确保文件资源被释放。
- 在必要的情况下处理可能出现的 IOException 异常
2、注意情况:
-
1) 不处理异常
-
2) 文件存在
-
- 文件不存在
经验:所有输入流,当文件不存在都会报错
-
4) 处理异常
3、示例:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test06 {
public static void main(String[] args) {
BufferedInputStream bis = null;
try {
//1.创建流对象 (默认缓冲区大小:8192字节)
bis = new BufferedInputStream(new FileInputStream("io.txt"));
//2.读取数据
byte[] bs = new byte[1024];
int len;
while((len = bis.read(bs)) != -1){
System.out.println(new String(bs, 0, len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.关闭资源
if(bis != null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
利用 字符输出转换流 向文件写入数据
1、思路:
- 准备要写入文件的数据和文件路径。
- 创建一个 FileOutputStream 对象,用于向文件写入字节数据。
- 创建一个 OutputStreamWriter 对象,将 FileOutputStream 对象包装在其中,用于将字节流转换为字符流。
- 使用 BufferedWriter 对象包装 OutputStreamWriter 对象,以提高写入性能。
- 使用 BufferedWriter 对象的 write 方法将字符数据写入缓冲区。
- 在适当的时机,调用 BufferedWriter 对象的 flush 方法将缓冲区中的数据刷新到文件中。
- 关闭 BufferedWriter 对象和 OutputStreamWriter 对象,确保数据被写入文件并释放资源。
- 在必要的情况下处理可能出现的 IOException 异常。
2、注意情况
-
- 不处理异常
-
- 文件存在
-
- 文件不存在
经验:所有的输出流,当文件不存在时都会创建文件
- 文件不存在
-
- 文件末尾追加
经验:考虑基础流的构造方法
- 文件末尾追加
-
- 处理异常
注意:使用字符转换流最好加上编码格式!!!!!!!!!!!!!!!!!
3、示例:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Test03 {
public static void main(String[] args) {
OutputStreamWriter osw = null;
try {
//1.创建流对象(将文件字节输出流 转换为 字符输出转换流)
osw = new OutputStreamWriter(new FileOutputStream("io.txt",true),"UTF-8");
//2.写入数据
osw.write("123abc我爱你");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.关闭资源
if(osw != null){
try {
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
利用 字符输入转换流 读取文件里的数据
1、思路:
- 准备要读取的文件路径。
- 创建一个 FileInputStream 对象,用于从文件读取字节数据。
- 创建一个 InputStreamReader 对象,将 FileInputStream 对象包装在其中,用于将字节流转换为字符流。
- 使用 BufferedReader 对象包装 InputStreamReader 对象,以提高读取性能。
- 使用 BufferedReader 对象的 readLine 方法逐行读取文件中的字符数据。
- 在适当的时机,处理从 BufferedReader 中读取的字符数据,例如输出到控制台或进行其他处理。
- 关闭 BufferedReader 对象和 InputStreamReader 对象,确保文件资源被释放。
- 在必要的情况下处理可能出现的 IOException 异常。
2、注意情况:
-
- 不处理异常
-
- 文件存在
-
- 文件不存在
经验:所有的输入流,在文件不存在时都会报错
- 文件不存在
-
- 处理异常
注意:使用字符转换流最好加上编码格式!!!!!!!!!!!!!!!!!
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test07 {
public static void main(String[] args){
InputStreamReader isr = null;
try {
//1.创建流对象
isr = new InputStreamReader(new FileInputStream("io.txt"),"UTF-8");
//2.读取数据
//isr.read(cs):读入cs数组长度的字符,将字符数据存入到数组中,并返回读取到的有效字节数,如果读取到文件末尾,则返回-1
char[] cs = new char[1024];
int len;
while((len = isr.read(cs)) != -1){
System.out.println(new String(cs, 0, len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.关闭资源
if(isr != null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字节流继承图: