转换流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. KVM改NAT为Bridge

    kvm 改nat为桥接在安装一个拥有虚拟化功能的Linux操作系统(此处以CentOS为例),一般我们有两种方法:1.在光盘安装的时候安装好虚拟化包或者PXE服务器上配置好虚拟化包2.手动在没有安装虚 ...

  2. 通俗讲解MOSFET

    一位工程师曾经对我讲,他从来不看MOSFET数据表的第一页,因为“实用”的信息只在第二页以后才出现.事实上,MOSFET数据表上的每一页都包含有对设计者非常有价值的信息.但人们不是总能搞得清楚该如何解 ...

  3. poj 2356 (抽屉原理)

    题目链接:http://poj.org/problem?id=2356 题目大意:给你n个数,要你从n个数选出若干个数,要求这若干个数的和是n的倍数,输出选择数的个数,以及相应的数. 解题思路: 以下 ...

  4. Centos 6.5 安装和使用docker

    基于本人一贯的习惯,关于“某某某是什么”这样的问题,请百度吧,会有更专业的人士,会比我说的更详细更深,这里我只给出本人亲历的安装和使用过程. 1.安装 先检查服务器环境,docker要求操作系统Cen ...

  5. A1106. Lowest Price in Supply Chain

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  6. iconv: iconv_open(pToCharset, pFromCharset); 的附加参数//IGNORE

    今天在转换一个文件时iconv() 老是返回 -1, 提示编码转换失败. 一共 30 多个文件, 原编码都是一样的,为什么有的转换会失败,返回 -1呢? 网上搜索了一下, 找到一个随加参数: //IG ...

  7. 数据库之sql语句汇总20180616

    /*******************************************************************************************/ 一.SQL简 ...

  8. Ubuntu: Windows Help Tools For Ubuntu

    Virtual Box https://www.virtualbox.org/wiki/Linux_Downloads 装不上Wine时直接装虚拟机吧.RTX真是个坑爹的东西,找不到替代的客户端 迅雷 ...

  9. appium desktop 1.7 的swipe功能不能用,重写。

    rt // @Override public void swipe(int startx,int starty,int endx,int endy,int ms){ Duration duration ...

  10. POJ 1743 Musical Theme (Hash)

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 33820   Accepted: 11259 D ...