11.Java中的IO流(二)——转换流、流操作规律和File对象【Java学习笔记Hatter】Java开发工程师
" src="http://fishcooimg.chinazspeed.com/2017/03/1489227444001.png" title="Java中的IO流(二)——转换流、流操作规律和File对象.png" alt="Java中的IO流(二)——转换流、流操作规律和File对象.png"/>
一、转换流
readLine方法是字符流BufferedReader类中的方法;
而键盘录入的read方法是字节流是InputStream的方法。
读取转换流
InputStreamReader(System.in):是字节流通向字符流的桥梁。
写入转换流
OutputStreamWriter(System.out)
例1:
public class TransStreamDemo {
public static void main(String[] args) throws IOException {
BufferedReader bfr=
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter br=
new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while((line=bfr.readLine())!=null){
if("over".equals(line))
break;
br.write(line.toUpperCase());
br.newLine();
br.flush();
}
bfr.close();
}
}
例2:
public class TransStreamDemo2 {
/*源:键盘录入
* 目的:文件
* 需求:想把键盘录入的数据存储到一个文件中
*
*/
public static void main(String[] args) throws IOException {
BufferedReader bfr=
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw=
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt")));
String line=null;
while((line=bfr.readLine())!=null){
if("over".equals(line))
break;
bfw.write(line.toUpperCase());
bfw.newLine();
bfw.flush();
}
bfr.close();
}
}
二、流操作的基本规律
①明确源和目的;
源:输入流(InputStream ,Reader)
目的:输出流(OutputStream ,Writer)
②明确操作的数据是否是纯文本。
是:用字符流(Reader Writer)
不是:用字节流(InputStream OutputStream)
③当体系明确后,再明确要使用哪个具体的对象。
通过设备来进行区分:
源设备包括:内存,硬盘(文件),键盘
目的设备:内存,硬盘(文件),控制台
④是否需要提高效率
是:加入缓冲区技术
例1:
需求:将键盘录入的数据保存到一个文件中
源:InputStream Reader
是不是纯文本?是 Reader
设备:键盘。对应的对象System.in,为了操作键盘的文本数据方便。转成字符流按字符串操作更方便。就将System.in转换成Reader。即Reader体系的转换流
InputStreamReader isr=new InputStreamReader(System.in);
需要提高效率吗?需要
BufferedReader bfr=new BufferedReader(isr);
目的:OutputStream Writer
是否是纯文本?是Writer
设备:硬盘。一个文件,使用FileWriter
FileWriter fw=new FileWriter("c.txt");
需要提高效率吗?需要
BufferedWriter bfr=new BufferedWriter(fw);
例2:
需求:想要把录入的数据按照指定的编码表utf-8,将数据存到文件中
目的:OutputStream Writer
是否是纯文本?是Writer
设备:硬盘。一个文件
存储时需要加入指定的编码表。而指定的编码表只有转换流可以指定。
所以要使用的对象是OutputStreamWriter,而该转换流对象要接收一个字节输出流,而且还可以操作的文件的字节输出流,FileOutputStream
OutputStreamWriter osw=
new OutputStreamWriter(new FileOutputStream("c.txt"),"UTF-8");
需要高效吗?
BufferedWriter bw=new BufferedWriter(osw);
所以当涉及到字符编码转换时,需要用到转换流。
例1:
public class TransStreamDemo3 {
/*
* 需求:将一个文件的数据打印在控制台上
* 源:文件
* 目的:控制台
*/
public static void main(String[] args) throws IOException {
BufferedReader bfr=
new BufferedReader(new InputStreamReader(new FileInputStream("Demo.txt")));
BufferedWriter bfw=
new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while((line=bfr.readLine())!=null){
if("over".equals(line))
break;
bfw.write(line.toUpperCase());
bfw.newLine();
bfw.flush();
}
bfr.close();
}
}
例2:
public class TransStreamDemo4 {
public static void main(String[] args) throws IOException {
BufferedReader bfr=
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8"));
String line=null;
while((line=bfr.readLine())!=null){
if("over".equals(line))
break;
bw.write(line.toUpperCase());
bw.newLine();
bw.flush();
}
bfr.close();
}
}
改变标准输入输出流:
System.setIn(new FileInputStream("c.txt"));
System.setOut(new PrintStream("c.txt"));
IO流异常的日志信息:
public class IOExceptionInfo {


1914篇文章