缓冲流
缓冲流是在字节流或字符流的基础上,添加了一个缓冲区。
缓冲流相对于字节流和字符流有一些优点:
- 效率高,需要读写的文件越大,那么缓冲流的优势越明显
- 缓冲流添加了一些方法可供使用
字节缓冲流
案例代码:
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source);BufferedOutputStream bos = new BufferedOutputStream(target))){
//实例化一个字节数组,来一次一次读取流中的数据
byte[] array = new byte[1024];
//声明一个整型变量,来记录每次读取多少字节数据
int length = 0;
//循环读写流中的数据
while((length = bis.read(array)) != -1){
bos.write(array, 0, length);
bos.flush();
}
}catch(IOException e){
e.printStackTrace();
}
字符缓冲流
案例代码:
字节输入流(一):
try(BufferedReader br = new BufferedReader(new FileReader("file\\a.txt"))){
char[] array = new char[20];
int length = 0;
while((length = br.read(array)) != -1){
String str = new String(array, 0, length);
System.out.print(str);
}
}catch (IOException e){
e.printStackTrace();
}
字节输入流(二):
try(BufferedReader br = new BufferedWriter(new FileReader("file\\a.txt"))){
while(true){
//一次读取一行内容
String result = br.readLine();
//当一行内容为空时,不再读取
if(result == null)
break;
System.out.println(result);
}
}catch(IOException e){
e.printStackTrace();
}
字节输出流:
try(BufferedWriter bw = new BufferedWriter(new FileWriter("file\\a.txt"))){
bw.write("hello world");
//文件内会出现行号,光标在下一行
bw.newLine();
}catch (IOException e){
e.printStackTrace();
}
转换流
字节字符转换流,主要针对文本文件进行操作,它既保留了字符流在操作文本的时候的便利性,同时也保留了字节流在数据传输时候的稳定性。
转换流相关的类:InputStreamReader,OutputStreamWriter
什么情况下使用转换流:
- 当需要以指定的字符集来读取某个文件的时候
- 当需要将数据以指定的字符集写入某个文件的时候
案例:
将一个采用utf8字符集的文本中的内容拷贝到一个采用gbk字符集的文本中,并在拷贝完成后,不能出现乱码。
try(InputStreamReader reader = new InputStreamReader(new FileInputStream("file\\utf8file"), "utf8");OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("file\\gbkfile", true), "gbk")){
char[] array = new char[1024];
int length = 0;
while((length = reader.read(array)) != -1) {
writer.write(new String(array, 0, length));
writer.flush();
}
} catch(IOException e) {
e.printStackTrace();
}
标准输入输出流
它是实现程序和控制台之间的链接:
输入流:将控制台中的内容读取到内存中
输出流:将内存中的一些数据写到控制台
案例:
使用Scanner完成对一个文件的读取(将读取到的内容,通过System.out.println输出到指定的文件中)
PrintStream ps = null;
try {
//设置从这个文件里输入(重定向输入)
System.setIn(new FileInputStream("file\\gbkfile"));
ps = new PrintStream(new FileOutputStream("file\\desFile", true));
}catch (FileNotFoundException e) {
e.printStackTrace();
}
//重定向前保存一份输出流,复原用
PrintStream original = System.out;
//System.in是系统标准输入流,本质来讲,就是一个InputStream
Scanner scan = new Scanner(System.in);
//设置输出到文件(重定向输出)
System.setOut(ps);
while(scan.hasNext()) {
System.out.println(scan.nextLine());
}
//还原输出流
System.setOut(original);