引言
在Java编程中,IO流是处理数据输入输出的核心机制。IO流分为字节流和字符流两大类。字节流以字节为单位处理数据,适用于所有文件类型;字符流以字符为单位处理数据,适用于文本文件。
Java IO流核心概念
字节流与字符流的区别
特性 | 字节流 | 字符流 |
数据单位 | 字节(8 bit)字符 | 字符(16 bit Unicode) |
处理场景 | 所有文件(图片,视频,文本文件等) | 文本文件(如.txt,.java.py等) |
核心类 | InputStream/OutputStream | Reader/Writer |
编码处理 | 不自动处理编码 | 自动处理编码 |
Demo.txt
1234567
Hello world
Hello Java
字符输入
FileReader示例
代码
public static void DemoFileReader(){
try {
FileReader fr = new FileReader("src\\DailyTest\\_250220\\Demo.txt");
int data;
while ((data = fr.read()) != -1) {
System.out.print((char)data);
}
fr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
解析
在这部分代码中,创建一个FileReade对象,然后读取数据,通过.read()函数读取一个字节,读取成功则返回他的ASCII码,如果没内容,则返回-1,然后输出通过强转成char类型。整段代码在try代码块中,可能会报文件找不到的错误。
输出
1234567
Hello world
Hello Java
BufferReader示例
代码
public static void DemoBufferReader(){
try {
BufferedReader br = new BufferedReader(new FileReader("src\\DailyTest\\_250220\\Demo.txt"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
解析
基本同上,创建的对象为BufferReader(),调用函数readLine()进行读取,然后返回的是字符串。
输出
1234567
Hello world
Hello Java
字节出输入
InputStreamReader示例
代码
public static void DemoFileInputStream(){
try {
FileInputStream fin = new FileInputStream("src\\DailyTest\\_250220\\Demo.txt");
InputStreamReader in = new InputStreamReader(fin, "UTF-8");
int data;
while((data = in.read()) != -1){
System.out.print((char)data);
}
}
catch (Exception e){
}
}
解析
类为InputStreamReader类,读取数据方式为.read()
输出
1234567
Hello world
Hello Java
字符输出
BufferWriter示例
代码
public static void DemoBufferWriter(){
try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("out1.txt"));) {
bufferedWriter.write("hello world\n");
} catch (Exception e) {
e.printStackTrace();
}
}
解析
打开文件,通过bufferWriter打开,写入通过函数.write()进行写入,在这部分代码中,将BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("out1.txt"));放如try中,这样可以不用考虑资源的释放,能够实现自动释放。
FileWriter示例
代码
public static void DemoFileWriter(){
try {
FileWriter fileWriter = new FileWriter("out.txt");
fileWriter.write('a');
fileWriter.write(new char[]{'b','b','b','b','b'});
fileWriter.write(new char[]{'d','d','d','c','c'},2,3);
fileWriter.write("hello world\n");
fileWriter.write("hello world\n",0,5);
fileWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
解析
在这段代码中需要注意的有两个点,1是try没有了小括号,这样需要手动释放资源,try代码块的最后一行.close(),2是write()的重载,能够根据不同的情形选择合适的方法。
字节输出
FileOutputStream示例
代码
public static void DemoFileOutputStream(){
try {
FileOutputStream fos = new FileOutputStream("src\\DailyTest\\_250220\\Demo.txt");
String data = "hello world";
byte[] bytes = data.getBytes();
fos.write(bytes);
fos.close();
}
catch (Exception e){
}
}
解析
这一段就一个注意点这个类的写入需要将字符型转为字节型,然后做参数进行写入。
复制文件
原理
同过字节读取的形式,然后再写入到另一个文件中,实现文件的复制
代码
public static void DemoCopyFile(String original,String newFile){
// 通过字节流复制一个文件
try {
FileInputStream fin = new FileInputStream(original);
FileOutputStream fos = new FileOutputStream(newFile);
byte[] bytes = new byte[1024];
int len;
while((len = fin.read(bytes)) != -1){
fos.write(bytes,0,len);
}
fin.close();
fos.close();
}
catch (Exception e){
e.printStackTrace();
}
}
解析
通过传入两个文件名,然后进行文件的复制,常见思维是读取一个字节写入一个字节,但是这样的效率太低,因此在这个示例中,创建了一个缓存数组,一次读一个数组的大小,写入同理,这样能够提高很多效率