读取键盘录入:
package com.readkey.demo;
import java.io.IOException;
import java.io.InputStream;
public class ReadKey {
public static void main(String[] args) throws IOException {
// readKey();
readKey_2();
}
public static void readKey_2() throws IOException {
/*
* 接收键盘输入的字符 将字符装换为大写打印到控制台上 输入over结束 思路:
* 接收的是一个一个的字符所以要先使用容器先存起来,然后在进行转换 注意的是\r \n是不需要存储的,在换行之后要先清空,才能在在进行存储
*/
// 1 创建一个容器
StringBuilder sb = new StringBuilder();
// 2 键盘输入
InputStream in = System.in;
// 循环读取数据
int ch = 0;
while ((ch = in.read()) != -1) {
if (ch == '\r')
continue;// \r 不需要存储
if (ch == '\n') {
String tmp = sb.toString();// 回车后转为字符串
if ("over".equals(tmp))// 输入over结束
break;
System.out.println(tmp.toUpperCase());
sb.delete(0, sb.length());
} else/* \n不进行存储 */{
sb.append((char) ch);
}
}
}
public static void readKey() throws IOException {
// 默认输入设备不需要关闭,否则想继续输入还得重新开启。
InputStream in = System.in;
int ch = in.read();
System.out.println(ch);
/*
* int ch1 = in.read(); //读取的是\r
System.out.println(ch1);
int ch2 =in.read();//读取的是\n
System.out.println(ch2);
*/
}
}
流的转换:
package com.readkey.demo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class TransStreamDemo {
public static void main(String[] args) throws IOException {
//字节流-->字符流
//字节流 (一个汉字为两个字节)
InputStream in = System.in;
//转换流
InputStreamReader isr = new InputStreamReader(in);
//字符流
BufferedReader bufr = new BufferedReader(isr);
//以上三句相当于
BufferedReader bufr1 = new BufferedReader(new InputStreamReader(System.in));
String str = null;
/*while((str = bufr.readLine())!=null){
if("over".equals(str))
break;
System.out.println(str.toUpperCase());
}*/
//字符流-->字节流(从下到上)
OutputStream out = System.out;//字节流
OutputStreamWriter osw = new OutputStreamWriter(out);//字符流
BufferedWriter bufw = new BufferedWriter(osw);
//以上三句相当于
BufferedWriter bufw1 = new BufferedWriter(new OutputStreamWriter(System.out));
while((str = bufr.readLine())!=null){
if("over".equals(str))
break;
bufw.write(str.toUpperCase());//写入缓冲区 目的地是osw
bufw.newLine();
bufw.flush();
}
}
}
-------------------------------------------------------------------------------------------------------
流操作的基本规律:
转换流:
InputStreamReader :字节到字符的桥梁 解码
OutputStreamWriter:字符到字节的桥梁 编码
之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适。
想要知道开发时用到哪些对象,只要通过四个明确即可
1 明确源和目的(汇)
源:InputStream Reader
目的:OutputStream Writer
2 明确数据是否是纯文本数据
源:是纯文本 : Reader
否: InputStream
目的: 是纯文本 Writer
否:OutputStream
到这里,就可以明确需求中具体要使用哪个体系
3 明确具体的设备
源设备:
硬盘:File
键盘:System.in
内存: 数组
网络:Socket流
目的设备:
硬盘:File
控制台:System.out
内存:数组
网络:Socket流
4 是否需要其他额外功能
1 是否需要高效(缓冲区):
是,就加上buffer
2 转换
需求1 :复制一个文本文件
1 明确源和目的
源:InoutStream Reader
目的:OutputStream Writer
2 是否是纯文本
是
源:Reader
目的: Writer
3 明确具体设备
源:
硬盘:File
目的:
硬盘:File
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
4 需要额外功能吗
需要,需要高效
BufferReader bufr = new BufferReader(new FileReader("a.txt"));
BufferWriter bufw = new BufferWriter(new FileWriter("b.txt"));
需求2 :读取键盘录入信息,并写到一个文件中
1 明确源和目的
源:InputStream Reader
目的:OutputStream Writer
2 是否为纯文本
源:Reader
目的:Writer
3 明确设备
源:键盘 System.in
目的: 硬盘 File
InputStream in = System.in
FileWriter fw = new FileWriter("b.txt");
4 需要额外功能吗?
1 转换: InputStreamReader isr = new InputStreamReader (System.in)
FileWriter fw = new FileWriter("b.txt");
将字节流转成字符流。因为明确的源是Reader,这样操作文本数据便捷
所以要将已有的字节流转成字符流。使用字节-->字符 InputStreamReader
2 高效: BufferedReader bur = new BufferedReader(newInputStreamReader (System.in))
BufferedWriter buw = new BufferedWriter ( new FileWriter("b.txt");)
需求3 :将一个文本文件数据显示在控制台上
1 明确源和目的
源:InputStream Reader
目的:OutputStream Writer
2 是否为纯文本
源:Reader
目的:Writer
3 明确具体设备
源:
硬盘:File
目的:
控制台:System.out
FileReader fr = new FileReader("a.txt");
OutputStream out = System.out;
4 需要额外功能吗?
需要:转换
FileReader fr = new FileReader("a.txt")
OutputStreamWriter osw = new OutputStreamWriter (System.out)
高效:
BufferedReader bufr = new BufferedReader (new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter (newOutputStreamWriter (System.out))
需求4 :读取键盘录入数据,显示在控制台上
1 明确源和目的
源:InputStream Reader
目的:OutputStream Writer
2 是否为纯文本
源:Reader
目的:Writer
3 明确具体设备
源:System.in
目的:System.out
InputStream in = System.in
OutputStream out = System.out
4 需要额外功能吗?
1 转换
InputStreamReader isr = new InputStreamReader(System.in)
OutputStreamWriter osw = new OutStreamWriter(System.out)
2 高效
BufferedReader bufr = new BufferedReader (new InputStreamReader(System.in))
BufferedWriter bufw = newBufferedWriter(newnew OutStreamWriter(System.out) )
需求5:
将一个中文字符串数据按照指定的编码表写入到一个文本文件中
1 目的 OutputStream.Writer
2 是纯文本,Writer
3 设备:硬盘File
FileWriter其实是按照默认编码表操作的
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk_1.txt"),"GBK");(GBK 这个码表一汉字两个字节)(UTF-8 这个码表一汉字三个字节)
FileWriter fw = new FileWriter("gbk.txt");
/*这两句代码的功能是等同的。
* FileWriter:其实就是转换流指定了本机默认表的体现,而且这个转换流的子类对象,可以方便操作文件
* 简单说:操作文件的字节流+本机默认的编码表,这是按照默认码表来操作文件的便捷类。
* 如果操作文本文件需要明确具体的编码。FileWriter就不行了。必须用转换流。
因为操作的是文件 所以用FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf_1.txt"),"编码表");
读取时:InputStreamReader isr = new InputStreamReader(new FileInputStream("utf_1.txt"),"编码表");
需要高效:
BufferedWriter bufw = new BufferedWriter (new OutputStreamWriter(new FileOutputStream("utf_1.txt"),"编码表"); )
什么时候使用转换流?
1 源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁。
提高对文本操作的便捷
2 一旦操作文本涉及到具体的指定编码表时,必须使用转换流。