javaseday22(输入输出文本文件 不同源和目的 转换流)

来源:互联网 发布:sql中日期怎么定义 编辑:程序博客网 时间:2024/06/17 20:11
/*
 * 读取一个键盘录入的数据 并打印在控制台上
 *
 * 键盘本身就是一个标准的输入设备
 * 对于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();
}
}