转换流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. 【原创】tyvj1038 忠诚 & 计蒜客 管家的忠诚 & 线段树(单点更新,区间查询)

    最简单的线段树之一,中文题目,不翻译.... 注释讲的比较少,这已经是最简单的线段树,如果看不懂真的说明最基础的理论没明白 推荐一篇文章http://www.cnblogs.com/liwenchi/ ...

  2. python学习day6 数据类型Ⅳ(集合)

    day6 数据类型-集合 内容补充: 列表功能: .reverse()反转 v = [1,2,3,4,5,6]v.reverse()print() #[6, 5, 4, 3, 2, 1] .sort( ...

  3. BZOJ 1143: [CTSC2008]祭祀river(最大独立集)

    题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1143 一句话题意:给一个DAG(有向无环图),求选出尽量多的点使这些点两两不可达,输出点个 ...

  4. golang语言并发与并行——goroutine和channel的详细理解(一)

    如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人. Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据. ...

  5. windows蜜汁调音

    哈,用的蜂鸣器,我静音了这东西还放. 只能调的很垃圾,但是很好玩. #include<cstdio> #include<windows.h> using namespace s ...

  6. [ZROJ110][假如战争今天爆发]

    题面 思路 先假设我们已经知道了操作顺序,考虑如何求出时间.用f[i][j]表示前i个物品,第i个加工完了第j台机器所需要的最少的时间.转移的时候就是f[i][j] = max(f[i-1][j],f ...

  7. SecureCRT或XShell软件

    SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. Xshell 是一个强大的安全终端模拟软件,它支持SSH1 ...

  8. 第十五篇-EditText做简单的登录框

    TextView和EditText的简单应用. MainActivity.java package com.example.aimee.edittexttest; import android.sup ...

  9. C++基础知识--DAY1

    1. C语言是面向过程的语言,C++是面向对象的语言,相对于C语言来说,C++语法规则更为严格,其存在类型增强的问题. 类型增强,顾名思义就是C++相对于C语言来说有更加严格的类型检查,很多C语言的语 ...

  10. AndroidS软件代码提示

    在用Eclipse时候,你可以进行设置,设置成不管你输入任何字母,都能进行代码的提示,在Android Studio中也可以 设置,而且比Eclipse设置来的简单.当然如果你觉得代码自动提示会降低你 ...