分类:IO流的分类
- 字节输入输出流:FileInputStream / FileOutputStream
- 字符输入输出流:FileReader / FileWriter
区别:
1.字节输入输出流:
- 读入外部文件的时候是按字节单位读取的
- 写出外部文件的时候是按字节直接写入文件中,无需经过缓存,直接修改文件
2.字符输入输出流:
- 读入外部文件的时候是按字符单位读取的
- 先写出到缓存中,然后刷新后写入文件,如果写二进制文件的话会出现文件损坏而无法打开的情况。
什么是二进制文件呢?
通俗易懂的说就是:Windows自带的记事本不能读懂的文件(打开乱码),如:图片,Word文件等
如果你还是分不清什么是二进制文件,没关系,我们都用字节流去读写文件就行了。
实例:在相对路径里复制 源文件(1.pptx) 到 目标文件(xieqibiao.pptx) 中
代码如下:
//复制Word二进制文件,二进制文件就是Windows的记事本读不懂的文件,打开乱码的那种
//1.创建字节输入流
FileInputStream fis = new FileInputStream("1.pptx");
//2.创建字节输出流
FileOutputStream foStream = new FileOutputStream("xieqibiao.pptx");
//3.复制文件
int len = 0;//用来接收读出来的字符长度
byte[] bys = new byte[1024];//一般长度设置为1024的整数倍
while((len = fis.read(bys)) != -1) {//当读到还有字节的时候,写文件输出
foStream.write(bys,0,len);//读到多少写多少
}
//4.关闭资源
fis.close();
foStream.close();
进阶:高效输入输出 -- 字符缓冲流
实例:
代码如下:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/*
* BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
* BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
*/
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
//创建输出缓冲流对象
/*
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
bw.write("hello");
//bw.flush();
bw.close();
*/
//创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java"));
/*
//一次读写一个字符
int ch;
while((ch=br.read())!=-1){
System.out.print((char)ch);
}
*/
//一次读写一个字符数组
char[] chs = new char[1024];
int len;
while((len=br.read(chs))!=-1) {
System.out.print(new String(chs,0,len));
}
//释放资源
br.close();
}
}