------------------------------android培训、java培训、期待与您交流! ----------------------------------------------------------------
流操作的基本规律:
通过三个明确来完成。
1,明确源和目的。
源: 输入流。InputStream Reader
目的:输出流。OutputStream Writer。
2,操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3,当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘。键盘
目的设备:内存,硬盘,控制台。
示例: 1. 将一个文本文件中数据存储到另一个文件中。
源:因为是源,所以使用读取流。InputStreamReader
是不是操作文本文件。
是!这时就可以选择Reader
这样体系就明确了。
接下来明确要使用该体系中的哪个对象。
明确设备:硬盘上一个文件。
Reader体系中可以操作文件的对象是 FileReader
是否需要提高效率:是!。加入Reader体系中缓冲区BufferedReader.
FileReader fr = new FileReader("a.txt");
BufferedReader bufr = new BufferedReader(fr);
目的:OutputStream Writer
是否是纯文本。
是!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 = new InputStreamReader(System.in);// InputStreamReader是Reader体系里的一部分,所以先明确体系:键盘操作 是文本操作
需要提高效率吗?需要!BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的:OutputStream Writer
是否是存文本?是!Writer。 明确体系.
设备:硬盘。一个文件。使用 FileWriter。 明确对象
FileWriter fw = new FileWriter("c.txt");
需要提高效率吗?需要。
BufferedWriter bufw = new BufferedWriter(fw);
示例:3. 想要把录入的数据按照指定的编码表(utf-8),将数据存到文件中。
目的:OutputStream Writer
是否是存文本?是!Writer。
设备:硬盘。一个文件。使用 FileWriter。
但是FileWriter是使用的默认编码表:GBK., 所以使用FileOutputStream
但是存储时,需要加入指定编码表utf-8。而指定的编码表只有转换流可以指定。
所以要使用的对象是OutputStreamWriter。
而该转换流对象要接收一个字节输出流。而且还可以操作的文件的字节输出流FileOutputStream
OutputStreamWriterosw = new OutputStreamWriter(newFileOutputStream("d.txt"),"UTF-8");
需要高效吗?需要。
BufferedWriterbufw = new BufferedWriter(osw);//因为osw 也是Write体系内的.
所以,记住。转换流什么使用。字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要用到转换流。
class TransStreamDemo2
{
publicstatic void main(String[] args) throws IOException
{
//键盘的最常见写法。
BufferedReader bufr =
newBufferedReader(new InputStreamReader(System.in));
BufferedWriterbufw = new BufferedWriter(new OutputStreamWriter(newFileOutputStream("d2.txt")"UTF-8");
Stringline = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
}
}
System指向最常见的设备是键盘和控制台, 通过setIn() 和 setOut() 方法可以改变输入输出源.
System.setIn(newFileInputStream("PersonDemo.java"));//改变输出源到一个文本文件.
System.setOut(newPrintStream("zzz.txt"));//改变输入源到一个文本文件.
java.lang.Object
java.io.OutputStream
java.io.FilterOutputStream
java.io.PrintStream
需求:将异常信息存入一个文本文件中,创建日志文件.
(工具包log4j 专门建立日志文件的.)
import java.io.*;
import java.util.*;
import java.text.*;
class ExceptionInfo
{
publicstatic void main(String[] args)throws IOException
{
try
{
int[]arr = new int[2];
System.out.println(arr[3]);//一定发生异常.
}
catch(Exception e)
{
try
{
Date d = new Date();
SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");//用上日期类.
String s = sdf.format(d);//换成可以读的日期格式.
PrintStreamps = new PrintStream("exeception.log");// PrintStream是FileOutputStream的子类
//输出流接受输出字节并将这些字节发送到某个接收, OutputStream输出流是写的动作
ps.println(s);
System.setOut(ps);//将标准输出设备改变成文件了
}
catch(IOException ex)
{
thrownew RuntimeException("日志文件创建失败");//此时程序停止了,
}
e.printStackTrace(System.out);//次方法会将输入流传进来,相对于FileInputStream中的数据传到FileOutputStream中了
}
}
}
-----------------------------android培训、java培训、期待与您交流! ----详细请查看:http://edu.youkuaiyun.com/heima