文章目录

一、字符流

1、FileReader文件字符写入流

把磁盘中的数据以字符的形式读入到内存中

构造器

解释

​public FileReader(File file)​

创建字符输入流管道与源文件对象接通

​public FileReader(String pathname)​

创建字符输入流管道与源文件路径接通

方法名

解释

​public int read()​

每次读取一个字符,没有字符返回-1

​public int read(char[] buffer)​

每次读取一个字符数组,没有字符返回-1

Java 进阶IO流(二)_数据

import java.io.FileReader;
import java.io.IOException;

public class ClassStructure {
public static void main(String[] args) throws IOException {
int read = 0;
//创建一个读入数据的相对路径的流
FileReader fileReader = new FileReader("data/access.log");
//直接读取字符输出
// while((read = fileReader.read()) != -1){
// System.out.printf("%c",read);
// }

//根据数组存储要求输出
char[] by = new char[8];
while((read = fileReader.read(by)) != -1){
System.out.println(by);
}
//关闭读入流
fileReader.close();
}
}

2、FIleWriter文件字符输出流

把内存中的数据以字符的形式写出到磁盘中

  • 构造器

构造器

解释

​public FileWriter(File file)​

创建字符输出流管道与源文件对象接通

​public FileWriter(File file,boolean append)​

创建字符输出流管道与源文件对象接通,

可追加数据


​public FileWriter(String filepath)​

创建字符输出流管道与源文件路径接通

​public FileWriter(String filepath,boolean append)​

创建字符输出流管道与源文件路径接通,

可追加数据


  • 常用方法

方法名

解释

​void write(int c)​

写一个字符

​void write(char[] cbuf)​

写入一个字符数组

​void write(char[] cbuf, int off, int len)​

写入字符数组的一部分

​void write(String str)​

写一个字符串

​void write(String str, int off, int len)​

写一个字符串的一部分

​flush()​

刷新流,可以继续写数据

​close()​

关闭流,释放资源,但是在关闭之前会先刷新流;

一旦关闭,就不能再写数据


[图片上传失败...(image-b266f3-1662427703591)]

import java.io.*;

public class ClassStructure {
public static void main(String[] args) throws IOException {
int read = 0;
//创建一个读入数据的相对路径的流
FileReader fileReader = new FileReader("data/access.log");
FileWriter fileWriter = new FileWriter("data/access1.log");
//直接读取字符输出
while((read = fileReader.read()) != -1){
fileWriter.write(read);
}

//根据数组存储要求输出
char[] ch = new char[8];
while ((read = fileReader.read(ch)) != -1) {
fileWriter.write(new String(ch, 0, read));
}

System.out.println("复制OK");

fileWriter.flush();
//关闭读入流
fileReader.close();
//关闭写出
fileWriter.close();
}
}
  • 场景

字节流适合做文件数据的拷贝(音视频,文本)

字节流不适合读取中文内容输出

字符流适合做文本文件的操作(读,写)

二、缓冲流

缓冲流是高效流或者高级流,前面学习的字节流算原始流

作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写性能

2、优化原理

字节缓冲输入流默认有8KB缓冲池,直接从缓冲池读取数据,性能较好。

字节缓冲输入流默认有8KB缓冲池,数据直接写入缓冲池中,提高写数据性能

3、体系图

Java 进阶IO流(二)_输出流_02

4、字节缓冲流

1)BufferedInputStream字节缓冲输入流

提高字节输入流读取数据的性能

2)BufferedOutputStream字节缓存输出流

提高字节输出流读取数据的性能

构造器

解释

​public BufferedInputStream(InputStream is)​

创建一个新的缓冲输入流

​public BufferedOutputStream(OutputStream os)​

创建一个新的缓冲输出流

Java 进阶IO流(二)_字符输入_03

import java.io.*;
import java.nio.charset.StandardCharsets;

public class ClassStructure {
public static void main(String[] args) throws IOException {
int read = 0;
//创建一个读入数据的相对路径的流
InputStream inputStream = new FileInputStream("data/access.log");
//创建带有缓存的输入流
BufferedInputStream bis = new BufferedInputStream(inputStream);
//创建一个数组
byte[] by = new byte[1024];
//判断是否还有数据
while ((read = bis.read(by)) != -1) {
//转换字符串
String str = new String(by, 0, read);
System.out.println(str);
}
//关闭写出
bis.close();
//关闭读入流
inputStream.close();

//创建一个输出数据的相对路径的流
OutputStream outputStream = new FileOutputStream("data/access1.log");
//创建带有缓存的输出流
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
//直接写入内容,设置编码格式
bos.write("helloworld".getBytes(StandardCharsets.UTF_8));
bos.close();
outputStream.close();
}
}

5、字符缓冲流

1)BufferedReader字符缓冲输入流

提高字符输入流读取数据的性能,可以按行读取数据

构造器

解释

​public BufferedReader(Reader r)​

创建一个新的字符缓冲输入流

方法

解释

​public String readLine()​

读取一行数据,没有数据返回null

2)BufferedWriter字符缓冲输出流

提高字符输出流写取数据的性能,可以换行

构造器

解释

​public BufferedWriter(Writer w)​

写入一行数据

方法

解释

​public void newLine()​

换行

[图片上传失败...(image-a40dc7-1662427703590)]

import java.io.*;

public class ClassStructure {
public static void main(String[] args) throws IOException {
String msg = null;
//创建一个字符输入流
FileReader fr = new FileReader("data/access.log");
//创建一个字符输入缓冲流
BufferedReader br = new BufferedReader(fr);
//判断是不是最后一行
while ((msg = br.readLine()) != null) {
System.out.println(msg);
}
//关闭输入缓冲流
br.close();

//创建一个字符输出流
FileWriter fw = new FileWriter("data/access1.log");
//创建一个字符输出缓冲流
BufferedWriter bw = new BufferedWriter(fw);
//字符写入的内容
bw.write("china");
//关闭字符缓冲流
bw.close();
}
}

三、转换流

文件和代码编码不一致,会出现乱码

1、InputStreamReader字符输入转换流

把原始的字节流按照指定编码转换成字符输入流

构造器

解释

​public InputStreamReader(InputStream is)​

字节流按照代码默认编码转换成字符输入流

​public InputStreamReader(InputStream is ,String charset)​

原始的字节流按照指定编码转换成字符输入流,不会出现乱码

Java 进阶IO流(二)_字符输入_04

import java.io.*;

public class ClassStructure {
public static void main(String[] args) throws IOException {
int len = 0;
//创建一个InputStreamReader对象,FileInputStream构造一个原始的字节流按照指定编码转换成字符输入流
InputStreamReader gbk = new InputStreamReader(new FileInputStream("data/access1.log"),"GBK");

//判断是不是最后一行
while ((len = gbk.read()) != -1) {
System.out.print((char)len);
}
System.out.println();
//释放资源
gbk.close();
InputStreamReader utf = new InputStreamReader(new FileInputStream("data/access1.log"),"utf8");
while ((len = utf.read()) != -1) {
System.out.print((char)len);
}
utf.close();
}
}

2、OutputStreamWriter字符输出转换流

把字节输出流按照指定编码转换成字符输出流

构造器

解释

​public OutputStreamWriter(OutputStream os)​

原始的字节输出流按照代码默认编码转换成字符输出流

​public OutputStreamWriter(OutputStream os,String charset)​

原始的字节输出流按照指定编码转换成字符输出流,不会出现乱码

Java 进阶IO流(二)_字符输入_05

import java.io.*;

public class ClassStructure {
public static void main(String[] args) throws IOException {

//字节输出流指定编码格式
OutputStreamWriter gbk = new OutputStreamWriter(new FileOutputStream("data/access1.log"), "GBK");
//写入内容
gbk.write("china,我爱你!!!");
//释放资源
gbk.close();
OutputStreamWriter gbk1 = new OutputStreamWriter(new FileOutputStream("data/access2.log"), "utf-8");
gbk1.write("china,我爱你!!!");
gbk1.close();
}
}