转换流

摘要:

InputStreamReader和OutputStreamWriter他们分别是FileReader和FileWriter的父类

当只是单纯的读写文件而不改变文件的编码格式时,就分别用他们的子类就可以

而当要改变编码格式不用系统默认编码格式(GBK)时,就需要用他们的父类来处理,父类提供了改变编码格式的方法。

OutputStreamWriter类

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。

它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。

public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("e:\\test\\utf8.txt",true);
OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");
osw.write("这是utf-8编码haha");
osw.close();
}

当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。

然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。

InputStreamReader类

public static void main(String[] args) throws IOException {
//明确数据源
FileInputStream fis=new FileInputStream("e:\\test\\utf8.txt");
InputStreamReader isr=new InputStreamReader(fis,"utf-8");
char[] ch=new char[1024];
int len=0;
while((len=isr.read(ch))!=-1){
System.out.println(new String(ch,0,len));
}
isr.close();
}

总结:

字节--->字符 : 看不懂的--->看的懂的。  需要读。输入流。 InputStreamReader

字符--->字节 : 看的懂的--->看不懂的。  需要写。输出流。 OutputStreamWriter

缓冲流

字节缓冲流

①写入数据到流中,字节缓冲输出流 BufferedOutputStream

②读取流中的数据,字节缓冲输入流 BufferedInputStream

它们的内部都包含了一个缓冲区,通过缓冲区读写,就可以提高了IO流的读写速度

字节缓冲输出流BufferedOutputStream

构造方法:

public BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

//缓冲字节输出流
public static void method1() throws IOException{
FileOutputStream fos=new FileOutputStream("e:\\test\\haha",true);
BufferedOutputStream bos=new BufferedOutputStream(fos);
//bos.write(100);
bos.write("你好啊".getBytes());
bos.close();
}

字节缓冲输入流 BufferedInputStream

构造方法:

public BufferedInputStream(InputStream in)

//缓冲字节输入流
public static void method2() throws IOException{
FileInputStream fis=new FileInputStream("e:\\test\\haha");
BufferedInputStream bis=new BufferedInputStream(fis);
int len=0;
while((len=bis.read())!=-1){
System.out.print((char)len);
}
bis.close();
}

实例:

对比字节流read(),字节流read(byte []),缓冲字节流read(),缓冲字节流read(byte [])它们的速度

//字节流read()
public static void method1() throws IOException{
long time1=System.currentTimeMillis();
FileInputStream fis=new FileInputStream("d:\\DW\\jdk\\javafx-src.zip");
FileOutputStream fos=new FileOutputStream("e:\\test\\text\\haha1.zip");
int len=0;
while((len=fis.read())!=-1){
fos.write(len);
}
long time2=System.currentTimeMillis();
System.out.println(time2-time1);
fis.close();
fos.close();
}
//字节流read(byte [])
public static void method2() throws IOException{
long time1=System.currentTimeMillis();
FileInputStream fis=new FileInputStream("d:\\DW\\jdk\\javafx-src.zip");
FileOutputStream fos=new FileOutputStream("e:\\test\\text\\haha2.zip");
int len=0;
byte[] bytes=new byte[1024];
while((len=fis.read(bytes))!=-1){
fos.write(bytes, 0, len);
}
long time2=System.currentTimeMillis();
System.out.println(time2-time1);
fis.close();
fos.close();
}
//缓冲字节流read()
public static void method3() throws IOException{
long time1=System.currentTimeMillis();
FileInputStream fis=new FileInputStream("d:\\DW\\jdk\\javafx-src.zip");
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos=new FileOutputStream("e:\\test\\text\\haha3.zip");
BufferedOutputStream bos=new BufferedOutputStream(fos);
int len=0;
while((len=bis.read())!=-1){
bos.write(len);
}
long time2=System.currentTimeMillis();
System.out.println(time2-time1);
fis.close();
fos.close();
}
//缓冲字节流read(byte [])
public static void method4() throws IOException{
long time1=System.currentTimeMillis();
FileInputStream fis=new FileInputStream("d:\\DW\\jdk\\javafx-src.zip");
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos=new FileOutputStream("e:\\test\\text\\haha4.zip");
BufferedOutputStream bos=new BufferedOutputStream(fos);
int len=0;
byte[] bytes=new byte[1024];
while((len=bis.read(bytes))!=-1){
bos.write(bytes, 0, len);
}
long time2=System.currentTimeMillis();
System.out.println(time2-time1);
fis.close();
fos.close();
}

结果:

文件大小:4m

字节流read() VS 字节流read(byte [])
150296毫秒 200毫秒
字节流read(byte [])完胜

缓冲字节流read() VS缓冲字节流read(byte [])
410毫秒 60毫秒
缓冲字节流read(byte [])完胜

速度总结:(慢——>快)

字节流read(),缓冲字节流read() ,字节流read(byte []),缓冲字节流read(byte [])

IO—》转换流和缓冲流的更多相关文章

  1. IO流----转换流、缓冲流

    打开一个文本文件,另存为: Ansi就是系统默认编码(就是gbk) 建一个编码是utf-8的txt文件, 例: import java.io.FileWriter; import java.io.IO ...

  2. IO(转换流、缓冲流)

    第1章 转换流 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者Output ...

  3. java:IO流(处理流(缓冲流,转换流,数据流),对象的序列化,Properties)

    字节缓冲流:(BufferedInputStream,BufferedOutStream) *按照流的功能来分:节点流和处理流 *节点流可以直接操作数据源: *InputStream *--FileI ...

  4. Java转换流、缓冲流、流操作规律整理

    转换流 1.1                OutputStreamWriter类 OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字 ...

  5. Java_转换流和缓冲流

    今日内容介绍 转换流 缓冲流 1 转换流 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamR ...

  6. java基础(24):转换流、缓冲流

    1. 转换流 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputS ...

  7. java的 IO流之缓冲流(转载)

    java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装.当对文件或其他目标频繁读写或操作效率低,效能差.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来 ...

  8. IO流之缓冲流

    缓冲流 Java中提高了一套缓冲流,它的存在,可提高IO流的读写速度 缓冲流,根据流的分类字节缓冲流与字符缓冲流. 字节缓冲流 字节缓冲流根据流的方向,共有2个 l  写入数据到流中,字节缓冲输出流 ...

  9. java - >IO流_缓冲流(高效流)

    缓冲流(高效流) 在我们学习字节流与字符流的时候,大家都进行过读取文件中数据的操作,读取数据量大的文件时,读取的速度会很慢,很影响我们程序的效率,那么,我想提高速度,怎么办? Java中提高了一套缓冲 ...

随机推荐

  1. JsPlumb在react的使用方法及介绍

    JsPlumb在react的使用方法及介绍 一.相关资料来源: 1.https://bitqiang.gitbooks.io/jsplumb/content/Chapter1_IMPORTS_AND_ ...

  2. python用类的方式创建线程---自创建类

    用类的方式创建线程---自创建类 import threadingimport time class MyThread(threading.Thread):#自建MyThread类继承threadin ...

  3. 基本 Docker 命令列表

    docker build -t friendlyname .# 使用此目录的 Dockerfile 创建镜像 docker run -p 4000:80 friendlyname # 运行端口 400 ...

  4. .netcore 网站启动后 502.5

    网站启动后,报错 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure 请检查安装的.netcore runtime版本和hosting版本是否 ...

  5. suprious weakup

    线程wait情况下,有可能没有中断,没有唤醒,而返回, 称为spurious wakeup. wait在循环中,通过对condition的判断来决定是否继续wait. 概率比较低.

  6. Kafka 可视化监控和管理 UI工具评估

    以下内容,来自网络资料整理和个人安装使用结果.后续会持续更新

  7. 每日一题 - 剑指 Offer 41. 数据流中的中位数

    题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 大根堆 小根堆 难易程度:中等 题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有 ...

  8. css实现div多边框_box-shadow模拟多边框、outline描边实现

    在css3中我们知道可以使用box-shadow属性轻松的为元素添加阴影效果,并且可以设置多组效果,每组参数值用逗号隔开.如果把box-shadow特性的两个偏移量 h-shadow .v-shado ...

  9. 在页面制作的时候常用的html页面滚动加载,可视区域判断方法

    演示图 考虑2个情况一种情况初始状态下 滚动到在中间区域的时候,这时上半部分看不见的元素就不给字体添加红色一种情况是,从头向下看的. 代码 .ss li { margin: 40px; } <d ...

  10. ShuffleNetV1/V2简述 | 轻量级网络

    ShuffleNet系列是轻量级网络中很重要的一个系列,ShuffleNetV1提出了channel shuffle操作,使得网络可以尽情地使用分组卷积来加速,而ShuffleNetV2则推倒V1的大 ...