javaseday22(输入输出文本文件 不同源和目的 转换流)
* 读取一个键盘录入的数据 并打印在控制台上
*
* 键盘本身就是一个标准的输入设备
* 对于java而言 对于这种输入设备都有对应的对象
*
*/
public class IODemo01 {
public static void main(String[] args) throws IOException {
// readKey();
// System.out.print("sss");
// System.out.print('\r');//13windows 的换行
// System.out.print("bbb");
// System.out.print('\n');//10
// System.out.print("bbb");
readkey2();
}
private static void readkey2() throws IOException {
/*
* 获取用户键盘录入的数据
* 并将数据变成大写显示在控制台上
* 如果用户输入的是over 结束键盘录入
* 思路
* 1、因为键盘录入只读取一个字节 要判断是否是over需要先将读到的字节拼成字符串
* 2、那就需要一个容器 StringBuilder
* 3、在用户回车之前将录入的数据变成字符串判断即可
*
*/
//1、创建容器
StringBuilder sb = new StringBuilder();
//获取键盘读取流
InputStream in = System.in;
//3、定义变量记录读取到的字节并循环读取
int ch = 0;
while((ch=in.read())!=-1){
//在存储之前需要判断是否是换行标记 因为换行标记不存储
if(ch=='\r')
continue;
if(ch=='\n'){
String temp =sb.toString();
if("over".equals(temp))//自定义结束标记
break;
System.out.println(temp.toUpperCase());
sb.delete(0, sb.length());
}
else
//江都udaode字节存储到StringBuilder 中
sb.append((char)ch);
}
// InputStream in = System.in;//键盘录入一般终止不了要么点 红终止 要么ctrl+c
// int ch =0;
// while((ch=in.read())!=-1){
// System.out.println(ch);
// }
}
private static void readKey() throws IOException {
InputStream in = System.in;
int ch = in.read();//阻塞式方法 没数据就等
System.out.println(ch);
int ch1 = in.read();
System.out.println(ch1);
int ch2 = in.read();
System.out.println(ch2);
InputStream in2 = System.in; //只有1个关了就不能再创建或输入了
//默认的输入 输出都不需要关 除非你系统重新启动才能再创建
}
}
平台默认字符集 是指操作系统的 简体中文版的字符集是GBK
/*
* FileWriter 的父类OutputStreamWriter 帮FileWriter 转化成了字符
* 所以FileWriter 都是继承自父类的方法
*/
public class IODemo02 {
public static void main(String[] args) throws IOException {
//字节流
//看的懂的变成看不懂的是编码通过码表转化成数字
//看不懂的变成看的看得懂的是解码
通过特定的码表还原
InputStream in =System.in;
// int ch = in.read();
// System.out.println(ch);
// int ch1 = in.read();
// System.out.println(ch1);//中文读2次 2字节
//字符流 前缀功能 后缀类型 InputStreamReader 转化流 把字节转化成字符
//将字节转化成字符的桥梁 转换流
InputStreamReader isr = new InputStreamReader(in);
// int ch = isr.read();
// System.out.println((char)ch);//字符一次性读完2个字节
BufferedReader br = new BufferedReader(isr);//Reader有个newLine方法需要所以找它的小弟看能否将字节转成字符
OutputStream ops = System.out;
OutputStreamWriter osw = new OutputStreamWriter(ops);
BufferedWriter bw = new BufferedWriter(osw);
String line = null;
while((line = br.readLine())!=null){
if("over".equals(line))
break;
// System.out.println(line.toString());
bw.write(line.toUpperCase());
bw.newLine();
bw.flush();
}
}
}
// 如果是要指定编码表就不要用File 开头的因为它是固定 的要用他的父类 OutputStreamWriter
/*
* 转换流
* 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、明确源和目的
*
* 需求1 复制一个文本文件
* 1、明确源和目的
* 源 InputStream Reader
* 目的 OutputStream Writer
* 2、是否是纯文本
* 是
* 源 Reader
* 目的 Writer
* 3、明确具体设备
* 源 硬盘 File
* 目的 硬盘 File
* FileReader fr = new FileReader ("a.txt");
* FileWriter fw = new FileWriter("b.txt");
* 4、需要额外功能
* 需要 需要高效
* BufferedReader br = new BufferedReader("a.txt");
* BufferedWriter bw = new BufferedWriter("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、是否需要其他功能
* 需要 转换 将字节流转成字符流 因为明确的源是Reader 这样操作文本数据最便捷
* 所以要将已有的字节流转成字符流 使用字节——>字符 InputStreamReader
* InputStreamReader isr = new I年普通StreamReader(System.in);
* FileWriter fw = new FileWriter("b.txt");
* 还需要功能么?
* 需要 想高效
* BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
* BufferedWriter bw = 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 os = System.out; //PrintStream 父类引用指向子类对象 OutputStream 的子类FilterOutputStream 的子类PrintStream
* 4、需要额外功能么
* 需要 转换
* FileReader fr = new FileReader("a.txt");
* OutputStreamWriter osw = new OutputStreamWriter(System.out);//都是字符流好控制
* 需要 高效
* BufferedReader br = new BufferedReader(new FileReader("a.txt"));
* BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(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、明确额外功能
* 需要转换 因为都是字节流 但是操作的却是文本数据
* 所以使用字符流操作起来更为便捷
* InputStreamReader isr = new InputStreamReader(System.in);
* OutputStreamWriter osw = new OutputStreamWriter(System.out);一次读取一个字符
* 为了将其高效
* BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
* BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
* 5、将一个中文字符串数据按照指定的编码表写入到文本文件中
* 1、目的
OutputStream Writer
* 2、是纯文本 Writer
* 3、设备硬盘 File
* FileWriter fw = new FileWriter("a.txt");
* fw.write("你好")
* 注意 既然需求中已经明确了指定 编码表的动作
* 那就不可以使用FileWriter 因为FileWriter内部是使用默认的本地码表
* 只能使用其父类 OutputStreamWriter
* OutputStreamWriter 接受一个字节输出流对象 既然是操作文件 那么该对象应该是FileOutputStream
* OutputStreamWriter osw = new FileOutputStream(new FileOutputStrem ("a.txt"),charsetName);
* 需要高效么?
* BufferedWriter bw = new BufferedWriter(new FileOutputStream(new FileOutputStrem ("a.txt"),charsetName));
*什么时候使用转换流呢?
* 1、源或者目的对应的设备是字节流但是 操作的却是文本数据 可以使用转换流作为桥梁 提高对文本操作的便捷
* 2、一旦操作文本 涉及到具体的指定编码表时 必须使用转换流
*
*
*/
public class IODemo03 {
public static void main(String[] args) throws IOException {
/*
* 1、需求 将键盘录入的数据写入到一个文件中
* 2、需求 将一个文本文件内容显示到控制台上
* 3、 将一个文本文件复制到 另一个文件中
* 下面不用变就改变 源和目的地
*/
// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//提到键盘录入就用这个
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//输出到控制台
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt")));//输出到指定文件中
//将一个文本文件复制到 另一个文件中
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));
String line = null;
while((line=br.readLine())!=null){
if("over".equals(line))//注意可能多了个封号导致无法到达输出
break;
bw.write(line.toUpperCase());
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}