转换流InputStreamReader & OutputStreamWriter
转换流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的更多相关文章
- [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)
一.概念 ------->1.BufferedReader/BufferedWriter [参考19.03.31文章] *Reader/Writer-------->2.InputStre ...
- Java IO 流 -- 转换流: InputStreamReader OutputStreamWriter
java 中 转换流是以字符流的形式操作字节流,需要注意一下两点: 1.操作内容必须是纯文本 2.指定字符集避免乱码 操作控制台输入输出: try (BufferedReader br = new B ...
- (25)IO流之转换流InputStreamReader和OutputStreamWriter
InputStreamReader:字节到字符的桥梁. OutputStreamWriter:字符到字节的桥梁. 它们有转换作用,而本身又是字符流.所以在构造的时候,需要传入字节流对象进来. 构造函数 ...
- Java API —— 编码 & IO流( InputStreamReader & OutputStreamWriter & FileReader & FileWriter & BufferedReader & BufferedWriter )
1.编码 1)编码表概述 由字符及其对应的数值组成的一张表 2)常见编码表 · ASCII/Unicode 字符集:ASCII是美国标准信息交换码,用一 ...
- JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律
JAVA之旅(二十七)--字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律 我们继续来聊聊I/O 一.字节流的缓冲区 这 ...
- 转换流--InputStreamReader ,OutputStreamWriter
BufferedReader 字符流,只能装饰字符流,不能装饰字节流.有个重要且好用的方法是readLine()整行读取字符. 但是InputStream是字节流,没有resdLine方法,那么字节流 ...
- Java基础---Java---IO流-----读取键盘录入、InputStreamReader、转换流、OutputStreamWriter、InputStreamReader
字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流: FileInputStream FileOutputStream Buffe ...
- Java IO流学习总结五:转换流-InputStreamReader、OutputStreamWriter
类的继承关系 Reader |__ BufferedReader.StringReader.InputStreamReader |__ FileReader Writer |__ BufferedWr ...
- io流之转换流InputStreamReader、OutputStreamWriter
例子程序: package io; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.File ...
随机推荐
- 【C++】实现一个简单的单例模式
- 记OI退役
前言 (这篇本来在联赛前写了一点,但是一直没有发布.现在退役了,还是把它发出来留作纪念吧!) 其实,这篇随笔早该在停课时就写,可是我却迟迟没有动笔. 可能是我真的太懒了,或许也是我想要逃避自己内心的真 ...
- Educational Codeforces Round 33 (Rated for Div. 2) F. Subtree Minimum Query(主席树合并)
题意 给定一棵 \(n\) 个点的带点权树,以 \(1\) 为根, \(m\) 次询问,每次询问给出两个值 \(p, k\) ,求以下值: \(p\) 的子树中距离 \(p \le k\) 的所有点权 ...
- open-falcon详解
先扔出一张官方的架构图, agent是用于采集机器的监控指标,然后每60秒就会push给transfer,agent与transfer是建立了长连接的,传输速度会比较快: transfer接受到数据后 ...
- 【BZOJ5294】[BJOI2018]二进制(线段树)
[BZOJ5294][BJOI2018]二进制(线段树) 题面 BZOJ 洛谷 题解 二进制串在模\(3\)意义下,每一位代表的余数显然是\(121212\)这样子交替出现的. 其实换种方法看,就是\ ...
- for循环是怎么工作的
for...in 是Python程序员使用最多的语句,for 循环用于迭代容器对象中的元素,这些对象可以是列表.元组.字典.集合.文件,甚至可以是自定义类或者函数,例如: 作用于列表 >> ...
- luogu4602 混合果汁 (主席树)
按照美味值从大到小排序,对于每个询问,我想二分找到一个前缀来满足条件 那么以单价为下标建主席树,维护区间的最大体积和 以及满足这个最大体积需要的价钱 然后二分答案,再在主席树上二分,找到恰好满足的那个 ...
- hdu4899 Hero meet devil
题目链接 题意 给出一个长度字符串\(T\),其中只包含四种字符\((A,C,G,T)\),需要找一个字符串\(S\),使得\(S\)的长度为\(m\),问\(S\)和\(T\)的\(lcs\)为\( ...
- python random使用方法
如果你对在Python生成随机数与random模块中最常用的几个函数的关系与不懂之处,下面的文章就是对Python生成随机数与random模块中最常用的几个函数的关系,希望你会有所收获,以下就是这篇文 ...
- 常用的git操作
(转)仅供自己学习,特此转发记录 链接:Git命令清单