Java之IO(三)转换流:WriterReader接⼝1. 编码表
常见编码表:GBK,utf-8
编码:⽂字字串-》数字字节流:"string text".getBytes ----> byte[] bArr
解码:数字字节流-》⽂字字串:byte[] bArr ----> new String(bArr)
查看linux系统默认编码格式
2. FileWriter、FileReader类
2.1 FileWriter类
超类:java.io.Writer 接⼝,需要重写Writer中的抽象⽅法
局限:只能写⽂本⽂件,只能写字符流,且write()之后需要flush()字符缓冲
不能修改其编码格式,只能是默认的GBK编码⽅式
好处:提供了写⼊String的write()重载⽅法,写⼊中⽂⾮常⽅便write重载⽅法:
void write(int c)
void write(char[] charBuf)
void write(char[] cbuf, int off, int len)
void write(String str)
public static void fWriterDemo() throws IOException{
FileWriter fw = new FileWriter("/kluter/");
fw.write(110);
fw.write(0x0d);
fw.write(0x0a);
fw.flush();
char[] cArr = {'a', 'B', 'c', 'D', 'e', '\n'};
fw.write(cArr);
fw.flush();
fw.write(cArr, 2, 3);
fw.flush();
fw.write("Test String\n");
fw.flush();
fw.close();
}
特别注意,字符输出流写⼊⽂件需要做flush()
2.2 FileReader
超类:java.io.Reader 接⼝,需要重写Reader中的抽象⽅法
局限:只能读取⽂本⽂件,只能读字符流,且read()之后需要没有String的都区功能,对⽂本的字符读取⽆法界定
不能修改其编码格式,只能是默认的GBK编码⽅式
好处:读取中⽂⾮常⽅便
read()重载⽅法:
int read() 读⼀个字符
int read(char[] charBuf)
int read(char[] cbuf, int off, int len)
public static void fReaderDemo() throws IOException{
FileReader fr = new FileReader("/kluter/"); int ret = 0;
// while((ret = fr.read()) != -1){
// out.print((char)ret);
// }
// out.print("**************************");
//
// fr.reset();
ret = 0;
char[] cbuf = new char[10];
String s = null;
while((ret = fr.read(cbuf)) != -1){
s = new String(cbuf, 0, ret);
out.print(s);
}
fr.close();
}
2.3 ⽤FileWriter、FilerReader类实现⽂本⽂件拷贝
⽤buffer的形式拷贝效率⾼,也需要考虑IOexception
2.4 flush() 与 close()的区别
flush和close⽅法都有⽴即将字符写⼊⽂件的功能,区别是:
flush()之后还可以继续write(),⽽close则不⾏
java重写和重载的区别3. OutputStreamWriter、InputStreamReader
由于InputStream和OutputStream体系中的类,以及FileWriter和FileReader都是处理字符的
现在引⼊两个新的类来处理字符转换为字节,⽤于不同编码间的转换
3.1 OutputStreamWriter
转换流
java.io.OutputStreamWriter 继承Writer接⼝
就是⼀个字符输出流,写⽂本⽂件
write()重载⽅法,同样有字符参数、字符数组、以及字符串
字符流通向字节流的桥梁,可以将字符流转字节流:
(我试过可以⽤FileWriter写中⽂、韩语等也能成功,最开始不清楚为什么这⾥要做转换。最后发现FileWriter是OutputStreamWriter的⼦类,FileWriter更简单,但是不能改变编码表(只能⽤系统默认的),例如字符是中⽂的时候,编码表⽤GBK更节约空间,GBK是2个字节存储的,⽽FileWriter在英⽂linux上默认使⽤utf-8是3个字节存储的)
例如中⽂的“你好”转换为utf-8,“你好是字符”,需要转换为gbk的2x5字节。OutputStreamWriter的作⽤
就是将“你好”字符去查询编码表(例如可以查询utf8、GBK等等)转换成字节形式(utf8、GBK表⽰),之后再⽤字节输出流(⽬前只学过FileOutputStream)将转换后的字节写⼊⽂件
3.1.1 构造⽅法
OutputStreamWriter(OutputStream out)
//接⼝的多态应⽤,接收所有字节输出流
OutputStreamWriter(OutputStream out, Charset cs)
//不常⽤
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
//不常⽤
OutputStreamWriter(OutputStream out, String charsetName)
//charsetName常见有:GBK、utf-8,⼤⼩写不限
3.1.2 ⽤OutputStreamWriter写字符到⽂件
这⾥说明代码中三处地⽅:
①:构造⽅法如果不填编码格式,则为该系统的默认编码格式,在英⽂linux上默认是utf-8
如果填写了编码格式,⼤⼩写不敏感
②:写⼊的字符来决定采⽤哪种编码格式,如果只有中⽂,则⽤GBK(2个字节表⽰⼀个汉字)能节约更多空间
如果有多种语⾔,则utf-8能全部涵盖
③:这⾥只需要close外层的OutputStreamWriter的对象,内层的FileOutputStream也就⾃动关闭了
④:这段测试代码的含义是将字符“你好是字符”去查询gbk编码表后转换成字节表⽰,在⽤FileOutputStream以字
符流的形式⼀个字节⼀个字节写⼊⽂件
3.2 InputstreamReader
这个类的原理和使⽤⽅式和3.1中的OutputStreamWriter刚好是相反的
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论