一、Java流概述
文件通常是由一连串的字节或字符构成,组成文件的字节序列称为字节流,组成文件的字符序列称为字符流。Java中根据流的方向可以分为输入流和输出流。输入流是将文件或其他输入设备的数据加载到内存的过程;输出流恰恰相反,是将内存中的数据保存到文件或其他输出设备。
大致关系如下图:
二、文件流
文件流主要包括:文件字节输入流,文件字节输出流,文件字符输入流,文件字符输出流。
1、FileInputStream(文件字节输入流)
FileInputStream主要按照字节方式读取文件,例如我们准备一个文件,该文件的名称为hhh01.txt
示例代码如下:
import java.io.*;
public class FileDemo01{
public static void main(String[] args){
InputStream fis = null;//父类引用指向子类
try {
fis = new FileInputStream("D:\\sp\\hhh01.txt");//实例化对象
int b=0;
while((b=fis.read())!=-1){
//循环输出字符
System.out.print((char)b);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
输出结果如下:
abcdefg
2、FileOutputStream(文件字节输出流)
FileOutputStream主要按照字节方式写文件,例如:我们做文件的复制,首先读取文件,读取后再将该文件另写一份保存到磁盘上,这就完成了备份。
示例代码如下:
import java.io.*;
public class FileDemo01{
public static void main(String[] args) {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream("D:\\sp\\hhh01.txt");//自己自定义路径
os = new FileOutputStream("D:\\sp\\hhh01.txt.bak");//也是自己自定义的
int b = 0;
while((b=is.read())!=-1){
os.write(b);
}
System.out.println("文件复制完毕!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
输出结果:
文件复制完毕!
3、FileReader(文件字符输入流)
FileReader以字符为单位读取文件,也就是一次读取两个字节,如:
示例代码如下:
import java.io.*;
public class FileDemo01{
public static void main(String[] args) {
Reader r = null;
try {
r = new FileReader("D:\\sp\\hhh02.txt");
int b = 0;
while((b=r.read())!=-1){
System.out.print((char)b);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(r!=null){
try {
r.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
输出结果:
我是一名算法竞赛爱好者
因为采用了字符输入流读取文本文件,所以汉字就不会发生乱码。
三、缓冲流
Java缓冲流本身不具有IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装。当对文件/其他目标频繁读写或操作效率低时,使用缓冲流能够高效地读写信息。因为缓冲流先将数据缓存起来,然后一起写入或读取出来。
用法如下:
//测试类中
InputStream is = null;
OutputStream os = null;
is = new BufferedInputStream(new FileInputStream("d:\\test.txt"));
os = new BufferedOutputStream(new FileOutputStream("d:\\test.txt.bak"));
(-------------------------------------------分割线-------------------------------------------)
//测试类中
BufferedReader r = null;
BufferedWriter w = null;
r = new BufferrdReader(new FileReader("d:\\test.txt"));
w = new BufferedWriter(new FileWriter("d:\\test.txt.bak"));