转换流InputStreamReader & OutputStreamWriter

比如当使用FileReader读取文件时,可以读取IDE默认的UTF-8编码的文件,但是当有一个文件是GBK文件时,使用FileReader读取文件会出现乱码,因此需要转换流,将编码格式进行转换。

转换流原理:

比如GBK是使用2个字节存储一个中文,而UTF-8使用3个字节存储一个中文文字。文件字符输入流FileRead读取文件时,事实上是调用了文件字节输入流FileInputStream,FileReader在读取文件时会按照IDE的默认编码表UTF-8去解码,当文件本来就是按照UTF-8编码的时候,解码就当然不会出现问题;但是当文件本来是按照GBK编码时,编码解码的方式不一样就会出现乱码。但是当使用转换流InputStreamReader & OutputStreamWriter读取和写入文件而不是FileReader或者FileWriter时,这两个流可以指定编码解码方式,这就可以避免出现乱码现象。

1、OutputStreamWriter

java.util.OutputStreamWriter extends Writer

方法 作用
void write(int c) 写入单个字符
void write(char[] cbuf) 写入字符数组
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,索引off开始,len的长度
void write(String str) 写入字符串
void write(String str, int off, int len) 写入字符串的某个部分
void flush() 刷新该流的缓冲
void close() 关闭流,释放资源

构造方法

构造方法 作用
OutputStreamWriter(OutputStream out) 创建使用默认字符编码的OutputStreamWriter对象
OutputStreamWriter(OutputStream out, Sting charsetName) 创建使用指定字符编码的OutputStreamWriter对象

参数:

OutputStream out:字节输出流,可以使用FileOutputStream对象,用来写转换之后的字节到文件中

Sting charsetName:指定的编码方法,不区分大小写,可以是utf-8/UTF-8,gbk/GBK.......不指定就使用默认的UTF-8

使用步骤

  • 创建OutputStreamWriter对象,构造方法中传递字节输出流和编码方式
  • 使用OutputStreamWriter对象的write方法,把字符转换为字节存储到缓冲区中
  • 使用OutputStreamWriter兑现的flush方法,将缓冲区的字符数据刷新到文件中(这是一个使用OutputStream的过程)
  • 使用close方法释放资源
package cn.zhuobo.day15.aboutOutputStreamWriter;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter; public class Demo01OutputStreamWriter {
public static void main(String[] args) throws IOException { write_utf_8();
write_gbk();
} private static void write_gbk() throws IOException {// 指定编码格式
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day15-code/gbk.txt"), "gbk");
osw.write("我是GBK文件");
osw.flush();
osw.close();
} public static void write_utf_8() throws IOException {// 不指定编码格式,使用默认的Unicode-utf-8
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day15-code/utf-8.txt"));
osw.write("我是uft-8文件");
osw.flush();
osw.close();
}
}

2、InputStreamReader

java.io.InputStreamReader extends Reader

可以继承自使用过Reader的方法

方法 作用
int read() 读取单个字符并且返回
int read(char[] cbuf) 一次读取多个字符,存储进数组里
void close() 关闭该流,并释放所有与之关联的资源

构造方法

构造方法 作用
InputStreamReader(InputStream in) 创建一个使用默认字符编码的InputStreamReader对象
InputStreamReader(InputStream in, String charsetName) 创建一个使用指定字符编码集的InputStreamReader对象

参数

InputStream in:字节输入流,可以使用FileInputStream,用来读取保存在文件中的字节

String charsetName:指定的编码方法,不指定就默认使用UTF-8

使用步骤

  • 创建InputStreamReader对象,构造方法传递字节输入流,以及编码方式,要注意的是指定的编码方式要和文件本来的编码方式一致,构造就会乱码
  • 使用InputStreamReader对象的read方法读取字节
  • 使用close方法释放资源
package cn.zhuobo.day15.aboutInputStreamReader;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader; public class Demo01InoutStreamReader {
public static void main(String[] args) throws IOException {
read_utf_8();
read_gbk();
} private static void read_gbk() throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("day15-code/gbk.txt"), "gbk");
int len = 0;
while((len = isr.read()) != -1) {
System.out.print((char)len);
}
isr.close();
System.out.println();
} private static void read_utf_8() throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("day15-code/utf-8.txt"), "utf-8");
int len = 0;
while((len = isr.read()) != -1) {
System.out.print((char)len);
}
isr.close();
System.out.println(); }
}

转换流InputStreamReader & OutputStreamWriter的更多相关文章

  1. [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)

    一.概念 ------->1.BufferedReader/BufferedWriter [参考19.03.31文章] *Reader/Writer-------->2.InputStre ...

  2. Java IO 流 -- 转换流: InputStreamReader OutputStreamWriter

    java 中 转换流是以字符流的形式操作字节流,需要注意一下两点: 1.操作内容必须是纯文本 2.指定字符集避免乱码 操作控制台输入输出: try (BufferedReader br = new B ...

  3. (25)IO流之转换流InputStreamReader和OutputStreamWriter

    InputStreamReader:字节到字符的桥梁. OutputStreamWriter:字符到字节的桥梁. 它们有转换作用,而本身又是字符流.所以在构造的时候,需要传入字节流对象进来. 构造函数 ...

  4. Java API —— 编码 & IO流( InputStreamReader & OutputStreamWriter & FileReader & FileWriter & BufferedReader & BufferedWriter )

    1.编码     1)编码表概述         由字符及其对应的数值组成的一张表     2)常见编码表         · ASCII/Unicode 字符集:ASCII是美国标准信息交换码,用一 ...

  5. JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律

    JAVA之旅(二十七)--字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律 我们继续来聊聊I/O 一.字节流的缓冲区 这 ...

  6. 转换流--InputStreamReader ,OutputStreamWriter

    BufferedReader 字符流,只能装饰字符流,不能装饰字节流.有个重要且好用的方法是readLine()整行读取字符. 但是InputStream是字节流,没有resdLine方法,那么字节流 ...

  7. Java基础---Java---IO流-----读取键盘录入、InputStreamReader、转换流、OutputStreamWriter、InputStreamReader

    字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流: FileInputStream FileOutputStream Buffe ...

  8. Java IO流学习总结五:转换流-InputStreamReader、OutputStreamWriter

    类的继承关系 Reader |__ BufferedReader.StringReader.InputStreamReader |__ FileReader Writer |__ BufferedWr ...

  9. io流之转换流InputStreamReader、OutputStreamWriter

    例子程序: package io; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.File ...

随机推荐

  1. 【HDU4947】GCD Array (莫比乌斯反演+树状数组)

    BUPT2017 wintertraining(15) #5H HDU- 4947 题意 有一个长度为l的数组,现在有m个操作,第1种为1 n d v,给下标x 满足gcd(x,n)=d的\(a_x\ ...

  2. Summary (7Road)

    今天有幸参加了一次考试,碰到的一些考题如下: 很多东西,明明都是会的,可是就是写不出来.可见自己的Linux基础还是很薄弱,懒得去记这些有用的东西.既然自己不是老板,不是项目经理,就该努力记住这些基础 ...

  3. Android RadioGroup 学习

    Api 参考地址 博文地址 RadioGroup相关属性: //返回该单选按钮组中所选择的单选按钮的标识 ID,如果没有选中的单选按钮则返回 -1. RadioGroup.getCheckedRadi ...

  4. 【BZOJ3874】[AHOI&JSOI2014]宅男计划(贪心,三分)

    [BZOJ3874][AHOI&JSOI2014]宅男计划(贪心,三分) 题面 BZOJ 洛谷 题解 大力猜想一最长的天数和购买外卖的总次数是单峰的.感性理解一下就是买\(0\)次是\(0\) ...

  5. 【转】linux清屏的几种方法

    在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法. 1.clear命令.这个命令将会刷新屏幕,本质上只是 ...

  6. 20165223 Linux安装及命令入门

    预备作业3:Linux安装及命令入门 一.VirtualBox和Ubuntu的安装 通过学习实践基于VirtualBox虚拟机安装Ubuntu图文教程,我开始学习虚拟机的安装,根据教程一步步试着安装. ...

  7. JavaScript深入之词法作用域和动态作用域

    作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域,也就是静态作用域. 静态作用域与动态作用域 因 ...

  8. JS事件(一)事件流&事件处理程序

    1.事件流描述的是从页面接收事件的顺序 IE和Netscape提出了几乎完全相反的事件流概念 IE:事件冒泡(由内而外) Netscape:事件捕获(由外向内) DOM2级事件规定事件流包括三个阶段: ...

  9. Unity Shader基本例子

    Unity中,对于一个物体我们想要改变其的外观,就需要给其增加一个材质,即Matiral 一般的Matiral采用的是标准的Shader,而标准的Shader并不是最好的渲染物体表明的效果,那么我们就 ...

  10. apache安装及相应配置

    给公司装过环境,自己也装过自己的服务器环境.但是每次都是现谷歌,毕竟每个人遇到的问题都不一样,还是记录下,以防忘记 一.安装 Centos7默认已经安装httpd服务,只是没有启动.如果你需要全新安装 ...