字节缓冲流
- 缓冲流可以提高效率,基本原理是在创建对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统的IO次数,从而提高读写效率
缓冲输出流:BufferedOutputStream
-
java.io 类 BufferedOutputStream
继承者 java.io.OutputStream
继承者 java.io.FilterOutputStream
继承者 java.io.BufferedOutputStream -
构造方法:
-
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
OutputStream:可以传递一个FileOutputStream,有个默认区数组大小 -
BufferedOutputStream(OutputStream out, int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
-
-
使用步骤
- 创建FileOutputStream对象,其构造方法绑定输出文件位置
- 创建BufferedOutputStream对象,构造方法中传入OutputStream对象,使用多态,传入1的参数。
- 使用BufferedOutputStream方法write,把数据写入到内部缓冲区,不是写入文件中
- 使用BufferedOutputStream的方法flush由数据缓冲区刷新到文件中
- 释放资源,close方法会先调用flush方法
package bufferStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class bufferStream {
public static void main(String[] args) throws IOException {
//1.创建一个输出流对象,绑定输出文件
FileOutputStream out = new FileOutputStream("b.txt");
//2.创建一个输出缓冲流对象,
BufferedOutputStream bufferOut = new BufferedOutputStream(out);
//3.从内存读入多个数据到默认长度的缓冲区数组
bufferOut.write("nihaoya".getBytes());
//4.将输入缓冲区的数据数组写入文件
bufferOut.flush();
//5.释放资源,包含flush方法
bufferOut.close();
}
}
字节缓冲输入流:BufferedInputStream
import java.io.*;
public class bufferStream {
public static void main(String[] args) throws IOException {
//1.创建一个输入流对象,绑定输入文件
FileInputStream fileInputStream = new FileInputStream("b.txt");
//2.创建一个输入缓冲流对象,
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream,1024);
/*************************************************
//3.记录每次读到的字节值,这里还是一个字节一个字节的读
int len = bufferedInputStream.read();
while((len=bufferedInputStream.read()) != -1){
System.out.println(len);
}
189
160
229
165
189
229
145
128
utf-8编码中,每个中文字符占三个字节
*******************************************/
//3.创建字节数组,存储读入的数据
byte[] bytes = new byte[1024];
//记录每次读的有效字符长度
int len1 = 0;
//当读取的有效字符数为结束位时,返回-1
while ((len1 = bufferedInputStream.read(bytes)) != -1){
System.out.println(new String(bytes,0,len1));
}
//4.释放缓冲流的同时释放了字节输入流
bufferedInputStream.close();
}
}
文件复制 - 提高效率,牺牲内存
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
//绑定复制对象,输入内存
FileInputStream filein = new FileInputStream("C:\Users\Administrator\Pictures\1.jpg");
BufferedInputStream bufin = new BufferedInputStream(filein);
//绑定输出的文件位置,若没有,则自动生成该文件
FileOutputStream fileout=new FileOutputStream("2.jpg");
BufferedOutputStream bufout=new BufferedOutputStream(fileout);
long start=System.currentTimeMillis();
/******************************************************************
//先读后写,len为读取字节值,先读入字节输入缓冲区,若读取长度超过缓冲数组长度,则会刷新缓冲数组,写入文件
int len = 0;
while ((len = bufin.read()) != -1) {
bufout.write(len);
}
//释放流,同时释放构造方法中对象的流
bufin.close();
bufout.close();
long end =System.currentTimeMillis();
System.out.println("该复制花费:"+(end-start)+"ms"); //复制2MB左右,花费79ms
********************************************************************/
//提高效率,将读取的字节放入字节数组
byte[] bytes=new byte[1024];
int len = 0;
while ((len = bufin.read(bytes)) != -1) {
bufout.write(bytes);
}
//释放流,同时释放构造方法中对象的流
bufin.close();
bufout.close();
long end =System.currentTimeMillis();
System.out.println("该复制花费:"+(end-start)+"ms"); //复制2MB左右,花费27ms
}
}
字符缓冲输出流:BufferedWriter
-
java.lang.Object
继承者 java.io.Writer
继承者 java.io.BufferedWriter -
构造方法:
- BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流。 - BufferedWriter(Writer out, int sz)
创建一个使用给定大小输出缓冲区的新缓冲字符输出流
- BufferedWriter(Writer out)
-
特有的成员方法:
- void newLine()
会根据不同的操作系统,获取不同的行分隔符
- void newLine()
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class CharBuffered {
public static void main(String[] args) throws IOException {
//1.创建字符缓冲输出流对象
BufferedWriter bufwr = new BufferedWriter(new FileWriter("b.txt"));
//2.会将读取的字符放入内存,一个字符缓冲数组
bufwr.write("大大大大大大爷");
//根据系统进行换行
bufwr.newLine();
//追加内容
bufwr.write("你好");
bufwr.write("好吗");
bufwr.flush();
bufwr.close();
}
}
字符缓冲输入流:BufferedReader
-
java.lang.Object
继承者 java.io.Reader
继承者 java.io.BufferedReader -
构造方法:
- BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。 - BufferedReader(Reader in, int sz)
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
- BufferedReader(Reader in)
-
特有的成员方法:
- String readLine()
读取一个文本行,行的终止符号,通过以下字符认为某行终止换行换行( )、回车( )或回车后直接跟着换行。但返回值不包含终止符号
- String readLine()
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReader01 {
public static void main(String[] args) throws IOException {
//1.创建字符缓冲输入流对象,构造方法由字符输入流绑定输入地址
BufferedReader bufre = new BufferedReader(new FileReader("b.txt"));
//2.使用read/readLine读取文本,readLine读取一行,返回的是字符串
String str = null;
while((str = bufre.readLine()) != null){
System.out.println(str);
}
/********
大大大大大大爷
你好好吗
********/
}
}
练习:文本内容排序
- 文本段落编号后用双列集合,根据key进行排序
import java.io.*;
import java.util.HashMap;
import java.util.Set;
public class Practice {
public static void main(String[] args) throws IOException {
//1.字符缓冲输入流绑定文件位置
BufferedReader bufre = new BufferedReader(new FileReader("b.txt"));
//2.字符缓冲输出流绑定输出文件位置
BufferedWriter bufwr = new BufferedWriter(new FileWriter("a.txt"));
//3.双列集合放入循环外,便于在作用域外使用
HashMap<String,String> temp= new HashMap<>();
//4.读入到内存中,写入双列集合中
String str = null;
while((str = bufre.readLine()) != null){
//看看文件内容
System.out.println(str);
//切割成两部分
String[] spli = str.split("\.");
//HashMap存储元素,利用HashMap自动升序排序
temp.put(spli[0],spli[1]);
}
System.out.println("
=====================================
");
//遍历下双列集合,同时写入另一个文件
for (String key:temp.keySet()) {
String value = temp.get(key);
System.out.println(key + "."+value);
bufwr.write(value);
//加newLine方法换行
bufwr.newLine();
//注:刷新写入
bufwr.flush();
}
//释放资源,先关输出流
bufwr.close();
bufre.close();
}
}