Fluxo de entrada / saída com buffer
BufferedInputStrean 与 BufferedOutputStream 类
Cache é uma otimização de desempenho de E / S. O fluxo de cache adiciona uma área de buffer de memória ao fluxo de E / S. Com a área de cache, a eficiência operacional pode ser bastante melhorada.
Por exemplo, existem dois pontos A e B. Existem mercadorias do ponto A que precisam ser movidas para o ponto B. Se o manuseio manual for usado, apenas uma mercadoria pode ser movida por vez, o que é muito ineficiente.
Se mudarmos o caminho e dirigirmos um carro, se o carro for grande o suficiente, podemos carregar todas as mercadorias e transportá-las até o ponto B de uma vez, o que melhora muito a eficiência do trabalho.
A função da área tampão é equivalente a este carro. O uso de fluxos de entrada / saída em cache é muito semelhante ao uso de fluxos de entrada / saída de arquivos. Os fluxos de entrada / saída em cache são aninhados em fluxos de entrada / saída de arquivos.
Por exemplo, quero ler os dados da API Java em meu desktop. O
código é o seguinte:
public class Dome {
public static void main(String[] args) {
// 创建文件对象,文件为我位于桌面上的Java,api
File f = new File("C:\\Users\\逢青\\Desktop\\jdk api 1.8.CHM");
FileInputStream in = null;
long start = System.currentTimeMillis();// 程序开始时间
try {
in = new FileInputStream(f);// 创建FileInputStream对象
byte b[] = new byte[1024];// 创建byte数组储存读取的信息
while (in.read(b) != -1) {
// 循环遍历输出,读取信息
}
long end = System.currentTimeMillis();// 程序结束时间
System.out.println("运行经历毫秒值:" + (end - start));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
// 判断in是否为空值,如果不是则关闭流
try {
in.close();// 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Isso não está adicionando a área de cache, levou 143 milissegundos para
adicionar a área de cache
public class Dome {
public static void main(String[] args) {
// 创建文件对象,文件为我位于桌面上的Java,api
File f = new File("C:\\Users\\逢青\\Desktop\\jdk api 1.8.CHM");
FileInputStream in = null;
BufferedInputStream bi = null;
long start = System.currentTimeMillis();// 程序开始时间
try {
in = new FileInputStream(f);// 创建FileInputStream对象
bi = new BufferedInputStream(in);//创建BufferedInputStream对象
byte b[] = new byte[1024];// 创建byte数组储存读取的信息
while (bi.read(b) != -1) {
// 循环遍历输出,读取信息
}
long end = System.currentTimeMillis();// 程序结束时间
System.out.println("运行经历毫秒值:" + (end - start));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bi != null) {
// 判断bi是否为空值,如果不是则关闭流
try {
bi.close();// 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
if (in != null) {
// 判断in是否为空值,如果不是则关闭流
try {
in.close();// 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Mais da metade da melhoria da eficiência, levou 35 milissegundos
BufferedReader 与 BufferedWriter 类
A maior característica dos fluxos de caracteres em buffer BufferedReader e BufferedWriter é que eles podem ter entrada / saída em unidades de comportamento
método | efeito |
---|---|
Leia a linha() | Leia uma linha de texto |
nova linha() | Crie uma nova linha ao escrever |
Escreva um exemplo:
public class Study2 {
public static void main(String[] args) {
File f = new File("word.txt");// 创建文件对象
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter(f);// 创建FileWriter对象
bw = new BufferedWriter(fw);// 将文件字符流包装成缓存字符流
String str1 = "抽刀断水水更流";
String str2 = "举杯消愁愁更愁";
bw.write(str1);// 写入第一句话
bw.newLine();// 创建新行,也就是换行
bw.write(str2);// 写入第二句话
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bw != null) {
// 判断bw是否为空值,如果不是则关闭流
try {
bw.close();// 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw != null) {
// 判断fw是否为空值,如果不是则关闭流
try {
fw.close();// 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Perceba a quebra de linha ao escrever. O
inverso também é possível. Escreva algumas linhas no arquivo txt.
código mostrado abaixo:
public class Study2 {
public static void main(String[] args) {
File f = new File("word.txt");// 创建文件对象
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(f);// 创建FileReader对象
br = new BufferedReader(fr);// 包装FileReader对象
String tmp = null;
int i = 1;// 计数器
while ((tmp = br.readLine()) != null) {
// 循环读取文件中的信息
System.out.println("第" + i + "行:" + tmp);
i++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
// 判断br是否为空值,如果不是则关闭流
try {
br.close();// 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
if (fr != null) {
// 判断fr是否为空值,如果不是则关闭流
try {
fr.close();// 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Captura de tela do efeito de corrida: