Java—缓冲流
一、缓冲流
高效流,一般指默认声明了一个byte空间(容器)作为缓冲区,比我们一般申请的空间64k大;所以较为高效。
若我们要使FileInputStream流高效,把空间申请得最大即可实现。
二、字节缓冲流
2.1 字节缓冲输出流BufferedOutputStream
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
// 写操作
write();
}
public static void write() throws IOException {
// 创建流
OutputStream os = new FileOutputStream("e:/text.txt");
BufferedOutputStream bos = new BufferedOutputStream(os);
// 写数据
bos.write("hello".getBytes());
// 关闭流
bos.close();
os.close();
}
}
2.2 字节缓冲输入流BufferedInputStream
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
// 读操作
read();
}
public static void read() throws IOException {
// 创建流
InputStream is = new FileInputStream("e:/text.txt");
BufferedInputStream bis = new BufferedInputStream(is);
// 读取数据
int ch = -1;
while( (ch = bis.read()) != -1 ){
System.out.println((char) ch);
}
// 关闭流
bis.close();
is.close();
}
}
2.3 不同流复制文件的写法
public class CopyAVI {
/*
* 采用四种方式复制
* 方式一:采用基本的流,一次一个字节的方式复制 no4
* 方式二:采用基本的流,一次多个字节的方式复制 no2
* 方式三:采用高效的流,一次一个字节的方式复制 no3
* 方式四:采用高效的流,一次多个字节的方式复制 no1
*/
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
// 方式一:
//method1("E:/test.avi");
// 方式二:
//method2("E:/test.avi");
// 方式三:
//method3("E:/test.avi");
// 方式四:
method4("E:/test.avi");
long end = System.currentTimeMillis();
// 输入计算用时
System.out.println(end - start);
}
/*
* 方式四:采用高效的流,一次多个字节的方式复制
*/
public static void method4(String file) throws IOException {
// 创建缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
// 创建缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("e:/copy4.avi"));
byte[] b = new byte[1024 * 8 * 8];
int len;
while( (len = bis.read(b)) != -1 ){
bos.write(b, 0, len);
}
// 关闭流
bis.close();
bos.close();
}
/*
* 方式三:采用高效的流,一次一个字节的方式复制
*/
private static void method3(String file) throws IOException {
// 创建缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
// 创建缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("e:/copy2.avi"));
int ch = -1;
while( (ch = bis.read()) != -1 ){
bos.write(ch);
}
// 关闭流
bis.close();
bos.close();
}
/*
* 方式二:采用基本的流,一次多个字节的方式复制
*/
private static void method2(String file) throws IOException {
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream("e:/copy2.avi");
byte[] b = new byte[1024 * 8 * 8];
int len;
while( (len = is.read(b)) != -1 ){
os.write(b, 0, len);
}
is.close();
os.close();
}
/*
* 方式一:采用基本的流,一次一个字节的方式复制
*/
public static void method1(String file) throws IOException {
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream("e:/copy1.avi");
int ch = -1;
while( (ch = is.read()) != -1 ){
os.write(ch);
}
is.close();
os.close();
}
}
三、字符缓冲流
字符输出流:BufferedWriter
字符输入流:BufferedReader
3.1 BufferedWriter类
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
// 创建流
Writer writer = new FileWriter("e:/text.txt");
BufferedWriter bw = new BufferedWriter(writer);
// 写数据
for(int i = 0; i < 5; i++){
bw.write("hello");
bw.newLine(); //写入一个分隔符
}
// 关闭流
bw.close();
writer.close();
}
}
3.2 BufferedReader类
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
// 创建流
BufferedReader br = new BufferedReader(new FileReader("e:/text.txt"));
// 读取数据
//一次一个字符
//一次一个字符数组
//一次读取文本中一行的字符串内容
String line;
while( (line = br.readLine()) != null ){
System.out.println(line);
}
// 关闭流
br.close();
}
}
3.3 使用缓冲流复制文件
public class CopyFileByBuffered {
public static void main(String[] args) throws IOException {
// 创建流
BufferedReader br = new BufferedReader(new FileReader("e:/text.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("e:/text-副本.txt"));
// 读取
// 复制 —— 写入
String line;
while( (line = br.readLine()) != null ){
bw.write(line);
// 换行
bw.newLine();
}
// 关闭流
br.close();
bw.close();
}
}