Java笔记
来源:互联网 发布:mac os怎么玩dota2 编辑:程序博客网 时间:2024/06/15 22:04
1. InputStreamReader
目的:
获取用户键盘录入的数据,并将数据变成大写显示在控制台上,如果用户输入over,结束键盘录入。
在这里,因为输入的是文本内容,并且是一行一行的,所以使用readLine()方法来操作应该是最方便的。但是readLine()是字符输入流BufferedReader类中的方法,而System.in是一个InputStream类型的字节流,所以就要想办法在他们之间搭建起桥梁,把字节流转换为字符流。这个桥梁就是InputStreamReader类,它是Reader类的一个子类。
//字节流InputStream in = System.in;//转换流InputStreamReader isr = new InputStreamReader(in);//字符流BufferedReader bufr = new BufferedReader(isr);String line = null;while ((line = bufr.readLine())!= null) { if (line.equals("over")) { break; }else{ System.out.println(line.toUpperCase()); }}
输出结果:
hahaHAHAxixiXIXIheheHEHEover
输入over后程序停止。
使用字节流读一个中文需要读两次,使用字符流读一个中文只需要读一次
//字节流InputStream in = System.in;int ch = in.read();System.out.println(ch);int ch1 = in.read();System.out.println(ch1);
输出结果:
你196227
//字节流InputStream in = System.in;//转换流InputStreamReader isr = new InputStreamReader(in);int ch = isr.read();System.out.println(ch);
输出结果:
你20320
2. OutputStreamWriter
InputStreamReader是字节流通向字符流的桥梁,与之相对应的,还有一个字符流通向字节流的桥梁OutputStreamWriter类,它是Writer类的子类。
字符 —>字节:编码
字节 —>字符:解码
System.out是标准输出流。它是PrintStream类型的,PrintStream是字节输出流OutputStream的子类,我们平时使用的println()方法就是该类的方法。
刚才我们将输入的内容变成大写打印在控制台的语句是:
System.out.println(line.toUpperCase());
我们获取到的是字符,但是控制台只能够接收字节数据。所以现在我们想自己实现将字符打印到控制台的这个过程,就需要一个能够把字符转变成字节的对象,就是OutputStreamWriter。
//字节流InputStream in = System.in;//转换流InputStreamReader isr = new InputStreamReader(in);//字符流BufferedReader bufr = new BufferedReader(isr);//字节流 OutputStream os = System.out;//父类引用指向子类对象,多态。//转换流OutputStreamWriter osw = new OutputStreamWriter(os);//字符流 BufferedWriter bufw = new BufferedWriter(osw);String line = null;while ((line = bufr.readLine())!= null) { if (line.equals("over")) { break; }else{ bufw.write(line.toUpperCase()); bufw.newLine(); bufw.flush(); }}
输出结果:
hahaHAHAxixiXIXIheheHEHEover
3. 流的操作规律
IO流有很多对象,在开发的时候我们不知道到底使用哪个对象合适,这时候只要知道四个明确即可。
1.明确源和目的(汇)
源:InputStream Reader
目的:OutputStream Writer
2.明确数据是否是纯文本数据
源:是纯文本:Reader
不是纯文本:InputStream
目的:是纯文本:Writer
不是纯文本:OutputStream
到这里就可以明确具体要使用哪个体系
3.明确具体设备
源设备:
- 硬盘:File
- 键盘:System.in
- 内存:数组
- 网络:Socket流
目的设备:
- 硬盘:File
- 键盘:System.out
- 内存:数组
- 网络:Socket流
4.是否需要其他额外功能
需要高效:缓冲区,加buffer
需要转换:InputStreamReader或OutputStreamWriter
4.转换流的编码与解码
如果想将一个字符串数据写入到一个文本文件中,之前我们是这么做的
FileWriter fw = new FileWriter("E:\\a.txt");fw.write("你好");fw.flush();fw.close();
输出结果:
你好//4字节
这时其实使用的是默认的码表,如果我们想指定编码表应该怎么办?
Java内置的是Unicode码表,对于字符类型的数据都是用Unicode码表来解析的,也就是说,任何Java识别的字符数据用的全是Unicode码表,但是字符串用的是本地码表GBK。Unicode不管是什么文字,都统一用两个字节来表示,但这样对ASCII来说,高位字节毫无意义。后期为了优化,于是出现了Unicode Transformation Format-8,简称UTF-8。它一个字节能装下的字符就用一个字节装,一个字节能装不下就用两个字节装,两个字节装不下就用三个字节装。
现在准备使用UTF-8来进行存储。这时候转换流最大的好处就体现出来了,因为转换流可以在构造函数中加入编码表。OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
FileWriter类使用的是默认的字符编码,它是转换流OutputStreamWriter的子类。
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\b.txt"),"UTF-8");osw.write("你好");osw.flush();osw.close();
输出结果:
你好//6字节
其实
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(“gbk_1.txt”),”GBK”);
和
FileWriter fw = new FileWriter(“gbk_2.txt”);
这两句话是等同的,FileWriter其实就是转换流指定了本机默认码表,简单说,就是操作文件的字节流+本机默认的编码表。这是按照默认码表来操作文件的便捷类。之前我们说字符流是字节流+编码表,具体说就是字符流中的转换流。
并且如果想要读取UTF-8编码的文件,解码也要用UTF-8
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\c.txt"),"UTF-8");char[] buf = new char[1024];int len = isr.read(buf);String str = new String(buf,0,len);System.out.println(str);
输出结果:
你好
- java笔记
- JAVA笔记
- java笔记
- java笔记
- JAVA笔记
- java笔记
- Java 笔记
- java笔记
- java 笔记
- java笔记
- java笔记
- java笔记
- Java笔记
- java笔记
- java笔记
- Java笔记
- java笔记
- java笔记
- android 密码 显示与隐藏
- eclipse egit(版本回退)
- Java#字符串(String)方法
- 浏览器缓存深入研究
- FFOS introduction
- Java笔记
- ListView使用SimpleAdapter,或者继承BaseAdapter重写
- WEB基础,select触发事件,获取option自定义属性的值
- Tensorflow学习笔记2:About Session, Graph, Operation and Tensor
- 2017.06.13牛客网第一天Java试题学习
- ANDROID MANIFEST.XML中的META-DATA属性
- K-近邻算法
- leetcode18. 4Sum
- python第23篇之--列表操作