Java字节缓冲流和字符缓冲流学习
1、字节缓冲流
首先要明确一个概念:对文件或其他目标频繁的读写操作,效率低,性能差。
使用缓冲流的好处是,能够高效的读写信息,原理是将数据先缓冲起来,然后一起写入或者读取出来。
BufferedInputStream:为另一个输入流添加一些功能,在创建BufferedInputStream时,会创建一个内部缓冲区数组,用于缓冲数据。
BufferedOutputStream:通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 缓存的目的:解决写入文件操作时,频繁的操作文件所带来的性能降低的问题
* BufferedOutputStream内部默认的缓存大小是8kb,每次写入时存储到缓存中的byte数组中, 会把数组中的数据写入文件,并且下标归零
*/
public class BufferedStreamDemo {
public static void main(String[] args) {
byteWriter();
byteReader();
}
private static void byteReader() {
File file = new File("F:/test.txt");
try {
InputStream in = new FileInputStream(file);
// 构造一个字节缓冲流
BufferedInputStream bis = new BufferedInputStream(in);
byte[] flush = new byte[1024];
int len = -1;
while ((len = bis.read(flush)) != -1) {
System.out.println(new String(flush, 0, len));
}
bis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}// byteReader
private static void byteWriter() {
File file = new File("F:/test.txt");
try {
OutputStream out = new FileOutputStream(file, true);
BufferedOutputStream bos = new BufferedOutputStream(out);
String info = "你爱Java吗?";
bos.write(info.getBytes());
bos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}// byteWriter
}
2、字符缓冲流
BufferedReader:从字符输入流中读取文本,缓冲各个字节,从而实现字符、数组和行的高效读取。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
private static void charWriter() {
File file = new File("F:/test.txt");
try {
Writer writer = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(writer);
bw.write("我爱Java SE");
bw.flush();
bw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}// charWriter
private static void charReader() {
File file = new File("F:/test.txt");
try {
Reader reader = new FileReader(file);
// 为字符流提供缓存,达到高效读取的目的
BufferedReader br = new BufferedReader(reader);
char[] buf = new char[1024];
int len = -1;
while ((len = br.read(buf)) != -1) {
System.out.println(new String(buf, 0, len));
}
br.close();// 不用关闭reader,是因为关闭br时内部已经帮我们关闭了reader
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}// charReader
为什么要用字符缓冲流
- 字符缓冲流: 加入字符缓冲流,增强读取功能,新增方法readLine() 更高效的读取
- FileReader:内部使用InputStreamReader,解码过程,byte->char,默认缓存大小是8k
- BufferedReader:默认缓存大小是8k,但是可以手动指定大小,把数据直接读取到缓存中,减少转换过程的次数,效率更高。所以虽然FileReader中已经加入了缓存,仍要加上BufferedReader的原因
Java字节缓冲流和字符缓冲流学习的更多相关文章
- Java—转换流、字符缓冲流
转换流 OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节.它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写 ...
- Java IO流之字符缓冲流
字符流: 1.加入字符缓存流,增强读取功能(readLine) 2.更高效的读取数据 BufferedReader 从字符输入流读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. FileRe ...
- java中关于编码的问题(字符转换流及字符缓冲流 )
上次我们使用的是字节流,还有一种方式就是字符流,上次说过如何分辨使用哪种流,如果记事本可以读懂则使用字符流,否则使用字节流.使用字符流就需要牵扯到编码的问题,下面给出一种转化流的格式. OutputS ...
- Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)
一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_6_BufferedReader_字符缓冲输入流
读取到的是第一行数据 读取多行数据 使用循环
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_5_BufferedWriter_字符缓冲输出流
使用newLine来换行 同样的效果 println的源码里面其实就用的就是newLine()
- IO流_PrintWriter(字符打印流)与PrintStream(字节打印流)
PrintStream: 1.提供了打印方法可以对多种数据类型值进行打印,并保持数据的表示形式 2.它不抛IOException 3.构造函数接受三种类型的值: 字符串路径 File对象 ...
- IO流(字节流,字符流,缓冲流)
一:IO流的分类(组织架构) 根据处理数据类型的不同分为:字节流和字符流 根据数据流向不同分为:输入流和输出流 这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图: 二:字符字节 ...
- 字符缓冲流 Day20
package com.sxt.prac; /* * 缓冲流之字符缓冲流 defaultCharBufferSize = 8192; * 1.读入到程序 * 2.程序写到文件 * 3.采用循环边读边写 ...
随机推荐
- 使用 localstorage 写入浏览器并获取
写入:以字符串的形式写入 localStorage.setItem('data', JSON.stringify(arr)); 获取: 注意:一定要使JSON.parse转为对象才能取出来,不然是空的 ...
- CSU 1554 SG Value (multiset/priority queue 思维题)
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1554 Description The SG value of a set (mult ...
- PHP-操作json
输出 json 文件中文处理 <?php $json_array = array(); // 1.转换为json字符串(不自动转换为unicode编码) if (version_compare( ...
- 为什么从pycharm中打开的html文件会显示404?
问题如图: 解决办法: 某次发现运行导入的html文件的时候,打开浏览器会报404错误:而运行自己写的html文件则正常显示:最后发现这是pycharm缓存问题,只需重启pycharm清除缓存就ok啦 ...
- jmeter之cookies登录
现在很多网站的登录都要验证码了,验证码的值是动态的,值不易获取.使用jmeter测试一个需要登录的接口就有困难,这时候,我们就可以使用cookies管理器来记住这个登录信息. 目录 1.jmeter的 ...
- DJango安装-windows
1.进入虚拟环境后启动 activate 2.查看当前虚拟环境是否存在Django环境 pip list 3.不存在则 安装Django环境 pip install django 4.查看Django ...
- 使用母版页的Web窗体不走Page_Load
原因:母版页--->属性--->生成--->输出路径,这里我将它的默认/bin路径更改了,所以才导致使用此母版页的其它页面也不走Page_Load方法 解决:改回默认的输出路径
- Robotframework使用DatabaseLibrary连接mysql数据库
Robotframework使用DatabaseLibrary连接mysql数据库 进行数据库操作,需要安装相应的操作库.DatabaseLibrary是常用的库之一,它能兼容MySQL.Oracle ...
- 《JAVA设计模式》之模板模式(Template)
在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...
- 基于Netty重构RPC框架
下面的这张图,大概很多小伙伴都见到过,这是Dubbo 官网中的一张图描述了项目架构的演进过程.随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在 ...