1、转换流
转换流是将字节流变成字符流的流。
OutputStreamWriter:将字节输出流转换成字符输出流。
public class OutputStreamWriter extends Writer
提供的构造方法:
public OutputStreamWriter(OutputStream out)
InputStreamReader:将字节输入流转换成字符输入流。
public class InputStreamReader extends Reader
提供的构造方法:
public InputStreamReader(InputStream in)
/* * 字节流与字符流的转化 * */ public class Test2{ public static void main(String[] args) throws IOException { String singal = File.separator; //1.根据文件路径创建File对象 File file = new File("C:"+singal+"Users"+singal+"lenovo"+singal+"DeskTop"+singal+"Test.txt"); if(!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } OutputStream outputStream = new FileOutputStream(file); //字节流转化成字符流 Writer writer = new OutputStreamWriter(outputStream); String string = "有点淡淡的忧伤"; writer.write(string); writer.close(); } }
这种操作在实际开发中并没有多么大的意义,我们主要用来分析FileOutputStream、FileInputStream及FileWriter、 FileReader之间的继承关系。
该类继承是典型的装饰者设计模型
优点:灵活,被装饰者可灵活组装需要的类。
缺点:类结构复杂,含有大量的其他类。
2、字符编码
1、常用的字符编码
(1)GBK、gb2312:描述的是中文编码,其中gb2312中只含有简体中文,而GBK中可包含有繁体中文。
(2)UNICODE编码:是java语言中的默认编码,16进制编码,支持世界上所有语言的编码,缺点就是占用的内存过大,会造成网络传输的负担。
(3)UTF-8:支持所有的语言,通用编码。
(4)ISO8859-1:国际通用拜编码,不支持中文,浏览器页面默认使用此编码。
2、乱码分析:
要对乱码进行分析首先我们应该先明确的知道当前操作系统上使用的是什么编码(java默认编码):
public class Test2{ public static void main(String[] args) throws UnsupportedEncodingException, IOException { //查看当前系统的字符编码(可以发现采用GBK编码) System.getProperties().list(System.out); OutputStream outputStream = new FileOutputStream("G:\\lemon\\testIO\\TestIO.java"); //向文件中写入下列内容,并转化成ISO8859-1编码格式 outputStream.write("hello你好!".getBytes("ISO8859-1")); outputStream.close(); } }
通过结果可以发现,出现了乱码,正是因为ISO8859-1不支持中文编码,所以导致有中文的地方出现了乱码。所以我们可以得出下列结论:
乱码产生的原因:编码与解码的字符编码不一致。