字符流和字节流之间的转换以及输入输出,详细分析


/*
 * 1:源:键盘录用
 * 目的:控制台
 * 2:需求:想把键盘录入的数据存储到一个文件中。
 * 源:键盘
 * 目的:文件;
 * 3:需求:想要将一个文件的数据打印到控制台上
 * 源:文件
 * 目的:控制台
 * 流操作的基本规律:
 * 最痛苦的就是流对象有很多,不知道该用那一个;
 * 通过两个明确来完成;
 * 1:明确源和目的;
 * 源:为输入流;InputStream;Reader
 * 目的:输出流OutputStream;Writer
 * 2:操作的数据是否为纯文本
 * 是:用字符流
 * 不是:用字节流
 * 3:当体系明确后,再明确要使用那个具体的对象
 * 通过设备来进行区分
 * 源设备:内存,硬盘,键盘
 * 目的设备;内存,硬盘,控制台
 * 第一个需求:将一个文件中的数据存储到另一个文件中,复制文件
 * 源:因为是源所以使用读取流。InputStream;Reader
 * 是不是操作文本文件。
 * 是:选择Reader,这样就体系就明确了
 * 接下来就明确使用该用那个体系中的那个对象
 * 明确设备:硬盘上的一个文件
 * Reader体系中可以操作文件的对象是FileReader
 * 是否需要提高效率:是:加入Reader体系中的缓冲区BufferedReader
 * FileReader fr=new FileReader("a.txt");
 * BufferedReader bufr=new BufferedReader(fr);
 * 目的:OutputStream
 * 是否为纯文本?
 * 是:Writer
 * 设备:硬盘中的一个文件
 * Writer体系中可以操作文件的对象是FileWriter
 * 是否需要提高效率:是:加入Writer体系中的缓冲区BufferedWriter
 * FileWriter fw=new FileWriter(b.txt);
 * BufferedWriter bufw=new BufferedWriter(fw);
 * 练习:将一个图片文件中数据存储到另一个文件中。复制文件,
 * 要求按照以上格式自己完成三个明确
 * ---------------------------------------------------------------------------------------
 * 2:需求:将键盘录入的数据保存到一个文件中
 * 这个需求中有源和目的都存在
 * 那么分别分析
 * 源:InputStream;Reader
 * 是不是纯文本?是!Reader
 * 设备:键盘。对应的对象 为 system.in
 * 不是选择Reader么?system.in对应的不是字节流么?
 * 为了操作键盘的文本数据方便,转成字符流按照字符串操作是最方便的
 * 所以既然明确了Reader,那么就将system.in转换成Reader
 * 用了Reader体系中的转换流InputStreamReader
 * 代码:InputStreamReader isr=newInputStreamReader(system.in);
 * 需要提高效率?需要:BufferedReader;
 * BufferedReader bufr=new BufferedReader(isr);
 * 目的OutputStream Writer;
 * 是否为纯文本?是,Writer
 * 设备:硬盘,一个文本,使用FileWriter
 * FileWriter fw=new FileWriter(“c.txt”);
 * 需要提高效率么?需要;
 * BufferedWriter bufw=new BufferedWriter(fw);
 * 扩展一下,想要吧录入数据按照指定的编码表utf-8,将数据存到文件中
 * 设备:硬盘,一个文本,使用FileWriter
 * 但是存储时,需要加入指定编码表utf-8,而指定的编码表只有转换流可以指定
 * 所以要使用的对象是OutputStreamWriter,而该转换对象要接收一个字节输出流
 * 而且还可以操作的文件的字节输出流FileOutputStream
OutputStreamWriter osw=new OutputStreamWriter(new  FileOutputStream("d.txt"),"utf-8");

 * 需要提高效率么?需要;
 * BufferedWriter bufw=new BufferedWriter(osw);
 * 记住;转换流什么时候使用,字符和字节之间的桥梁通常涉及到字符编码转换时需要用到转换流
 */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;


/*
 * 读取键盘录入。
 * system.out :对应的标准的输出设备,控制台
 * system.in:对应的标准输入设备,键盘
 * 需求:通过键盘录入数据。当录入一行数据后就将改行数据进行打印
 * 如果录入是数据是over,那么停止录入。(ctrl+c就是结束语句)
 */
public class ReaderIn {
public static void main(String[] args) {
InputStream in=System.in;
// int ch=0;
StringBuilder sb=new StringBuilder();
//使用字符流转换成字节流方法进行录用
//将字节流对象转换转换成字符流,使用转换流。InputStreamReader
// InputStreamReader isr=new InputStreamReader(in);
//为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader
// BufferedReader  bufr=new BufferedReader(isr);

try {//把源变成一个文件
// System.setIn(new FileInputStream("d:\\2.txt"));
//目的改为一个文件
System.setOut(new PrintStream("d:\\zz.txt"));
//如果源和文件都是一个文件,那么运行结果就是复制的过程


} catch (FileNotFoundException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
}


BufferedReader  bufr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter  bufw=new BufferedWriter(new OutputStreamWriter(System.out ));


/*
//以上三句话合并为一句话书写;项目一的程序
BufferedReader  bufr=new BufferedReader(new InputStreamReader(System.in));
//项目3的程序
try {
BufferedReader  bufr2=new BufferedReader(new InputStreamReader(new FileInputStream("d:\\2.txt")));
} catch (FileNotFoundException e2) {
e2.printStackTrace();
}
//键盘录入最常见写法


//以下三句话合并为一句话书写;项目一的程序
BufferedWriter  bufw=new BufferedWriter(new OutputStreamWriter(System.out ));
//项目二的程序
try {
BufferedWriter  bufw2=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:\\out.txt") ));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}*/
//对应为输出语句
/*OutputStream out=System.out;
OutputStreamWriter osw=new OutputStreamWriter(out );
BufferedWriter  bufw=new BufferedWriter(osw);*/

String line=null;
try {
while ((line=bufr.readLine())!=null) {
if ("over".equals(line)) {
break;
}
// osw.write(line.toUpperCase());
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
//System.out.println(line.toUpperCase());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bufr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*while (true ) {
try {
int ch=in.read();
if (ch=='\r') {
continue;
}if (ch=='\n') {
String s=sb.toString();
if ("over".equals(s)) {
break;
}
System.out.println(s.toUpperCase());
}else {
sb.append((char)ch);
}
} catch (IOException e) {
e.printStackTrace();
}

}*/
/*try {//录一个输出一个
while ((ch=in.read())!=-1) {
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}*/
/*try {
//键盘录入
int by=in.read();
System.out.println(by);
} catch (IOException e) {
e.printStackTrace();
}*/
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值