62,621
社区成员
发帖
与我相关
我的任务
分享
数据归根到底写入文件都是用的字节流,字符流只是为了方便操作而产生的
import java.io.*;
public class OutputStreamWriterTest
{
public static void main(String[] args)
{
try(
Writer w
= new OutputStreamWriter(new FileOutputStream("1.txt"));
)
{
w.write("hello kitty");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
这段能看懂吧?
最后产生一个1.txt,里面写的hello Kitty 而且使用GBK编码。
1、FileOutputStream 是一个byte streams (父类是OutputStream)
2、w.write(“hello kitty”);写入的是啥? 字符串对吧? 不是写的byte[] 对吧?
3、结论,源文档API说的是 “字符流与字节流之间的桥梁” 没有说啥转换。 真实情况是:
writer方法字符串将写入了到字符流。
OutputstreamWriter 将字符流进行编码(encodee 默认用系统平台的编码方式,我系统默认是GBK)这时候得到的是 一堆的byte[]
然后将byte[]写入到 FileOutputStream
即FileOutputStream 是一个接受字节流的容器。只接受字节流。
你明明输入的一个字符串,FileOutputStream 却成功的得到了byte[]
这就是所谓的转换。
本质上:
String s --->Btye[]---->输出到字节流中去
只不过你看到的效果是 s---->字节流中有东西了。
中间过程,java给你封装了。
如果你需要比较原始的效果,应该这么写
String s = "hello balance";
try(
FileOutputStream f = new FileOutputStream("2.txt");
)
{
//用默认的字符集编码,本系统默认GBK
//如果指定字符集要用 s.getBytes("UTF-8");之类
byte[] bianrys = s.getBytes("GBK");
f.write(bianrys);
}
catch(Exception e)
{
e.printStackTrace();
}