BufferedInputStream \ BufferedOutputStream 缓冲流
- 基础IO流的框架
抽象基类 | 4个节点流(也称作文件流,之前学过的) | 4个缓冲流(处理流的一种) |
---|---|---|
InputStream | FileInputStream | BufferedInputStream |
OutputStream | FileOutputStream | BufferedOutputStream |
Reader | FileReader | BufferedReader |
Writer | FileWriter | BufferedWriter |
-
缓冲流的作用
提升文件读写的效率。很多字节byte读入内存后,形成一个大信息块才整体向内存储空间传输,这样节省内存和存储空间交互的次数。
4个缓冲流 之 单一文字类 | 使用的方法 |
---|---|
处理文处理文本文件的字符流: | ↓ |
BufferedReader | read(char[] cBuffer) / 也可以读一行 String readLine() |
BufferedWriter | write(char[] cBuffer,0,len) / write(String)/flush()及时刷新内存读来的data,显示在屏幕上 |
4个缓冲流 之 不规则文件类 | 使用的方法 |
---|---|
处理非文本文件的字节流(音频图像之类的): | ↓ |
BufferedInputStream | read(byte[] buffer) |
BufferedOutputStream | write(byte[] buffer,0,len) / flush() |
- 实现的步骤
第1步:创建File的对象,流的对象(包括文件流,缓冲流)
第2步:使用缓冲流实现 读取数据 或 写出数据的过程(重点)
读取:int read(char[] cbuf/byte[] buffer) : 每次将数据读入到cbuf/buffer数组中,并返回读入到数组中
写出:void write(String str)/write(char[] cbuf):将str或cbuf写出到文件中
void write(byte[] buffer) 将byte[] 写出到文件中
第3步:关闭资源。
举例:使用BufferedInputStream \ BufferedOutputStream复制一个图片
程序示例如下:
package IOTest;
import org.junit.Test;
import java.io.*;
public class BufferedStreamTest {
/*
* 需要:使用BufferedInputStream \ BufferedOutputStream复制一个图片
* test_photo1.jpeg
* */
public static void main(String[] args) throws IOException {
File f1 = new File("test_photo1.jpeg");
File f2 = new File("666cpy2_test_photo1.jpeg");
FileInputStream fs_in = new FileInputStream(f1);
FileOutputStream fs_out = new FileOutputStream(f2);
BufferedInputStream bfs1 = new BufferedInputStream(fs_in);
BufferedOutputStream bfs2 = new BufferedOutputStream(fs_out);
byte [] cart =new byte[1024];
int len = 0;
/*
* while((len=fs_in.read(cart))!=-1){
fs_out.write(cart, 0, len);
}
*
* */
while((len = bfs1.read(cart))!=-1){
bfs2.write(cart,0,len);
}
System.out.println("job done");
//关闭流资源
bfs2.close();
bfs1.close();
// 由于外层流的关闭会自动关闭内层流,
// 所以下面这两句内存流关闭也可以不写
fs_out.close();
fs_in.close();
}
}
运行结果:
job done
Process finished with exit code 0
示例2:尝试使用BufferedInputStream和FileInputStream读入并且分别复制一个视频(或者audio),比较一下他们的复制速度哪个更快。
package IOTest;
import java.io.*;
import java.sql.Timestamp;
import java.util.Date;
public class VideoCopyTimeTest {
/*
* 需要:使用BufferedInputStream \ BufferedOutputStream复制一个图片
* test_photo1.jpeg
* 用之前学习的FileInputStream和BufferedInputStream比较下下copy时间上的差异
* */
public static void main(String[] args) throws IOException {
File f1 = new File("test_photo1.jpeg");
File f2 = new File("12344_test_photo1.jpeg");
FileInputStream fin = new FileInputStream(f1);
FileOutputStream fout = new FileOutputStream(f2);
int len = 0;
byte[] cart = new byte[10];
Date d1 = new Date();
long str1= d1.getTime();
while((len=fin.read(cart)) != -1){
fout.write(cart,0,len);
}
Date d2 = new Date();
long done1 = d2.getTime();
System.out.println("job done"+(done1-str1));
fin.close();
fout.close();
File f11 = new File("test_photo1.jpeg");
File f21 = new File("stream_12344_test_photo1.jpeg");
FileInputStream fin1 = new FileInputStream(f11);
FileOutputStream fout1 = new FileOutputStream(f21);
BufferedInputStream buffin= new BufferedInputStream(fin1);
BufferedOutputStream buffout= new BufferedOutputStream(fout1);
int bufflen = 0;
byte[] buffcart = new byte[10];
Date d11 = new Date();
long str11= d11.getTime();
while((bufflen=buffin.read(buffcart)) != -1){
buffout.write(buffcart,0,bufflen);
}
Date d21 = new Date();
long done11 = d21.getTime();
System.out.println("job done"+(done11-str11));
buffin.close();
buffout.close();
}
}
运行结果
可以观察到,用了 BufferedOutputStream 确实速度要快一些。
job done1463
job done92
Process finished with exit code 0
BufferedReader(读取文字使用)
举例:使用BufferedReader将sample1.txt中的内容复制在控制台上。
package IOTest;
import org.junit.Test;
import java.io.*;
public class BufferedReaderWriterTest {
/*
*
* 使用BufferedReader将sample1.txt中的内容复制在控制台上。
*
* */
public static void main(String[] args) throws IOException {
//如果想省事儿也可以写成一行 BufferedReader bf1 = new BufferedReader(new FileReader(new File("sample1.txt")));
File f1 = new File("sample1.txt");
//FileReader fr1 = new FileReader(f1);
//BufferedReader bf1 = new BufferedReader(fr1);
BufferedReader bf1 = new BufferedReader(new FileReader(f1));
char [] cart = new char[10];
int len = 0;
//方法1:
/*
while((len = bf1.read(cart))!= -1){
for (int i = 0; i < len; i++) {
System.out.print(cart[i]);
}
}
*/
//方法2:
/*
while((len = bf1.read(cart))!= -1){
System.out.print(cart);
}
*/
//方法3:
/*
*
while((len = bf1.read(cart))!= -1){
String st1 = new String(cart,0,len);
System.out.print(st1);
}
*/
//方式4:使用readLine,每次读取一行,不带回车。注意readLine方法返回值为null说明全部读完了。
// readLine不读取换行,每读到换行就认为这一行结束了。
// 所以在下面使用System.out.println而不是System.out.print来输出data
String data;
while ((data=bf1.readLine())!=null){
System.out.println(data);
//System.out.print(data+"\n"); 当然,也可以这么写。
}
bf1.close();
}
}
运行结果(为txt文件内的内容):
Utilitatis causa amicitia est quaesita.
/*
*
* 使用BufferedReader将sample1.txt中的内容复制在控制台上。
*
* */
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Collatio igitur ista te nihil iuvat. Honesta oratio, Socratica, Platonis etiam. Primum in nostrane potestate est, quid meminerimus? Duo Reges: constructio interrete. Quid, si etiam iucunda memoria est praeteritorum malorum? Si quidem, inquit, tollerem, sed relinquo. An nisi populari fama?
Quamquam id quidem licebit iis existimare, qui legerint. Summum a vobis bonum voluptas dicitur. At hoc in eo M. Refert tamen, quo modo. Quid sequatur, quid repugnet, vident. Iam id ipsum absurdum, maximum malum neglegi.
Process finished with exit code 0
BufferedWriter(向文件写入文字类数据使用)
举例:使用BufferedReader将sample1.txt中的内容复制给一个新的文件。
package IOTest;
import org.junit.Test;
import java.io.*;
public class BufferedReaderWriterTest {
/*
*
* 使用BufferedReader将sample1.txt中的内容建立并且复制给一个新文件。
*
* */
public static void main(String[] args) throws IOException {
//如果想省事儿也可以写成一行 BufferedReader bf1 = new BufferedReader(new FileReader(new File("sample1.txt")));
File f1 = new File("sample1.txt");
File fout = new File("mycopy_sample1.txt");
//FileReader fr1 = new FileReader(f1);
//BufferedReader bf1 = new BufferedReader(fr1);
BufferedReader bf1 = new BufferedReader(new FileReader(f1));
BufferedWriter bfout = new BufferedWriter(new FileWriter(fout));
char [] cart = new char[10];
int len = 0;
/* 读取方式也可使用:
*
while((len = bf1.read(cart))!= -1){
String st1 = new String(cart,0,len);
System.out.print(st1);
}
*/
/readLine/方式:使用readLine,每次读取一行,不带回车。注意readLine方法返回值为null说明全部读完了。
// readLine不读取换行,每读到换行就认为这一行结束了。
// 所以在下面使用System.out.println而不是System.out.print来输出data
String data;
while ((data=bf1.readLine())!=null){
//因为readLine最后不会读取换行符,所以缺失了"\n"用户可以自己补上
// bfout.write(data+"\n"); 这种写法的功能等于下面两行
bfout.write(data);
bfout.newLine();
bfout.flush();//这句话的意思就是输出的文件会实时更新内容
// 如果这句不写,最后有close关闭资源也行;
// 但是如果flush close两个都没写,那最后的文件是看不到内容的
// 那是因为系统内存的data并没有及时更新到txt文件去
}
System.out.println("复制成功");
bf1.close();
bfout.close();
}
}
输出:
复制成功
Process finished with exit code 0