####################字节缓冲流####################
BufferedInputStream以及BufferedOutputStream
1 缓冲流提升了性能
2 最底层一定是节点流
3 释放的时候只需要释放外层的数据流,内部会自动释放,如果想一个个释放,则从里到外依次释放
现在我们看一下API
A BufferedInputStream为另一个输入流添加了新功能,即缓冲输入并支持mark和reset方法的功能,创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。mark操作会记住输入流中的一个点,并且reset操作会导致从最近的mark操作读取的所有字节在从包含的输入流中取出新字节之前重新读取。
缓冲区默认为8K,可以自己指定;
BufferedInputStream(InputStream in,int size):创建具有缓冲区大小的BufferedInputStream,并保存其参数,输入流in供以后使用;
我们利用之前的的COPY代码进行改进以阐述字节缓冲流的作用;
关键就是这么一行代码:
InputStream is=new BufferedInputStream(new FileInputStream(src)); //不需要套很多层
OutputStream os=new BufferedOutputStream(new FileOutputStream(dest,true));
给源代码加上一个皮,就可以使效率大大提高;下面是完整代码:
package com.sxt.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 文件拷贝:文件字节输入、输出流
* @author 韩文韬
*
*/
public class copy {
public static void main(String[] args) {
long t1=System.currentTimeMillis();
copy("IO技术.mp4","IO-copy.mp4");
long t2=System.currentTimeMillis();
System.out.println(t2-t1);
}
/**
* 文件的拷贝
* 思考:利用递归进行文件夹的拷贝
* @param hanPath
* @param wenPath
*/
public static void copy(String hanPath,String wenPath) {
//1.创建源
File src=new File(hanPath); //源头
File dest=new File(wenPath); //目的地
//2.选择流
try (InputStream is=new BufferedInputStream(new FileInputStream(src)); //不需要套很多层
OutputStream os=new BufferedOutputStream(new FileOutputStream(dest,true));)
//3.操作(分段读取)
{
byte[] flush=new byte[1024]; //缓冲容器
int len=-1; //接受长度
while((len=is.read(flush))!=-1)
{
os.write(flush, 0, len); //分段写出
}
os.flush();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
}
输出结果为:12
不加BufferedInputStream/BufferedOutputStream之前输出结果为57,由此可见,大大提升了效率!
####################字符缓冲流####################
处理的是字符,也就是纯文本;
BufferedReader: 从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取;
String readLine() 读一行文字(内部自动找换行符);
BufferedWriter: 将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入;
void newLine() 写一行行分隔符;
1 向文件字符输入流中加入字符缓冲流
package com.sxt.io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
/**
* 四个步骤:分段读取 文件字符输入流 加入字符缓冲流
* 1.创建源 2.选择流 3.操作(写出内容) 4.释放资源
* @author 韩文韬
*
*/
public class BufferedTest03 {
public static void main(String[] args) {
//1.创建源
File src=new File("han.txt");
//2.选择流
try (BufferedReader reader=new BufferedReader(new FileReader(src));)
{
//3.操作(分段读取)
String line=null;
while((line=reader.readLine())!=null) //逐行读取
{
//字符数组--->字符串
System.out.println(line);
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果为:
hanwentao
加油华为
可见,读取操作时修改较大,应仔细观看
2 向文件字节输出流中加入字符缓冲流
package com.sxt.io;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
/**
* 文件字节输出流 加入字符缓冲流
* 1.创建源 2.选择流 3.操作(写出内容) 4.释放资源
* @author 韩文韬
*
*/
public class BufferedTest04 {
public static void main(String[] args) {
//1.创建源
File dest=new File("wen.txt");
//2.选择流
try(BufferedWriter writer=new BufferedWriter(new FileWriter(dest));) //后面的true或false表示追加文件
//操作(写出)
//写法一
// String msg="i love hanwentao\r\n我爱哈利路亚"; //换行
// char[] datas=msg.toCharArray(); //字符串--->字符数组
// writer.write(datas, 0, datas.length);
//写法二
// String msg="IO is so easy\r\n尚学堂欢迎你";
// writer.write(msg);
//写法三
{
writer.append("IO is so difficult\r\n");
writer.newLine();
writer.append("尚学堂讨厌你");
writer.flush();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
中间加入了
writer.newLine();
目的是为了换行而已;
现在来完成一个copy文本的办法:
package com.sxt.io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 文件拷贝:文件字节输入、输出流
* @author 韩文韬
*
*/
public class copyTxt {
public static void main(String[] args) {
copy("han.txt","han-copy.txt");
}
/**
* 文件的拷贝
* 思考:利用递归进行文件夹的拷贝
* @param hanPath
* @param wenPath
*/
public static void copy(String hanPath,String wenPath) {
//1.创建源
File src=new File(hanPath); //源头
File dest=new File(wenPath); //目的地
//2.选择流
try (BufferedReader br=new BufferedReader(new FileReader(src)); //不需要套很多层
BufferedWriter bw=new BufferedWriter(new FileWriter(dest));)
{
//3.操作(分段读取)
String line=null;
while((line=br.readLine())!=null)
{
bw.write(line);
bw.newLine();
}
bw.flush();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
}
该小节结束~