黑马程序员技术交流社区
标题: 文件io流知识总结 [打印本页]
作者: 淡定哥 时间: 2013-5-26 14:42
标题: 文件io流知识总结
字符流
字符流的特点:既然IO是流用于操作数据的,那么数据的最常见形式:文件。
Writer:
需求:在硬盘上创建一个文件并写入一些文字数据。
找到一个专门用于操作文字的Writer子类对象:FileWriter。
后缀名是父类名,前缀名是该流对象的功能。
//创建一个FileWriter对象,该对象已被初始化就必须明确被操作的文件。
//而且该文件会被创建到该目录下。如果该目录下已有同名文件,那么覆盖源文件。
//其实就是为了明确数据要存放的目的地。
FileWriter fw=newFileWriter("f:\\操作文件.txt");
//调用write方法,将数据写到了流中。
fw.write("asdfg");
//刷新流对象中的缓冲数据,将数据刷到目的地。 fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部流中的数据,将数据刷到目的地。
//他跟flush的区别是:flush刷新后还可以继续使用,但close刷新后会关闭流。
fw.close();
处理IO异常:
FileWriter fw=null;//定义一个指向性参数
try {
fw=new FileWriter("f:\\操作文件.txt");//创建新的文件对象
fw.write("abc");//写入
} catch(IOException e) {
e.printStackTrace();
}finally{
if(fw!=null){//判断文件是否存在,因为文件可能不存在。
try {
fw.close();//关闭流
} catch(IOException e) {
e.printStackTrace();
}
}
}
文件的续写:FileWriter fw=new FileWriter(“Demo.txt”,true);
Reader:第一种读取方式(常用的读取方式)
FileReader fr=null;
try {
fr=newFileReader("f:\\操作文件.txt");
intch=0;
//read方法一次只能对一个字符,而且会自动往下读
while((ch=fr.read())!=1){
System.out.print((char)ch);
}
} catch(IOException e) {
e.printStackTrace();
}finally{
try {
fr.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
第二种读取方式:
//定义一个字符数组,用于存储读到的字符
//该read(char[])返回的是读到字符的个数
FileReader fr=null;
try {
fr=newFileReader("f:\\操作文件.txt");
char[]buff=new char[1024];
int num=0;
while((num=fr.read(buff))!=-1){
System.out.print(new String(buff,0,num));
}
} catch(IOException e) {
e.printStackTrace();
}finally{
try {
fr.close();
} catch(IOException e) {
e.printStackTrace();
}
}
BufferedWriter:字符读入缓冲流
缓冲流的出现时为了提高流的操作效率 所以在操作缓冲流之前,必须要先有流对象
//创建一个流对象
FileWriter fw=newFileWriter("f:\\操作文件.txt");
//为了提高效率,加入了缓冲流对象
//只要将需要被提高效率的流对象作为参数传给缓冲流即可
BufferedWriter bw=newBufferedWriter(fw);
Bufferedreader:字符读取缓冲流。
readLine()文件的行读取,提高读取效率。读取的时候只返回回车符前边的数据,并不返回回车符,所以要加bw.newLine()换行
//创建一个读取流对象和文件相关联
FileReader fr=newFileReader("f:/操作文件.txt");
//提高效率 加入缓冲流对象的构造函数
BufferedReaderbr=new BufferedReader(fr);
//文件的行读取
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
字节流
键盘录入最常见写法:BufferedReader br=
new BufferedReader(new InputStreamReader(System.in));
流操作规律:(流对象太多,不知道用哪个)
1. 明确源和目的。
源:输入流:InputStream Reader
目的:输出流:OutputStream Writer
2. 操作的数据时不是纯文本
是:字符流。不是:字节流
3. 当体系明确后,在明白要使用哪个具体对象。
通过设备来区分:
源设备:内存,硬盘,键盘;
目的设备:内存,硬盘,控制台;
需求:1.将一个文本文件中的数据存储到另一个文件中。复制文件
源:因为是源,所以使用读取流。InputStream Reader
是不是操作文本文件。是,这是可以使用Reader,这样体系就明确了。
接下来就要明确该体系中的那个对象:
明确设备:硬盘,上的一个文件。
Reader体系中可以操作文件对象的是FileReader
是否需要提高效率:是,加入Reader体系中缓冲区 BufferedReader。
BufferedReaderbr=new BufferedReader(new FileReader(”c.txt”));
目的:OutputStream Writer
是否是纯文本。是,Writer
设备,硬盘 一个文件
Writer体系中可以操作文件对象的是Writer Reader
是否需要提高效率:是,加入Writer体系中缓冲区 BufferedWriter。
BufferedWriterbw=new BufferedWriter(new FileWriter(“c.txt”));
需求2.将键盘输入的数据保存到一个文件中。
源:InputStream Reader
是不是纯文本?是,Reader
设备:键盘,对应的是System.in。为了操作键盘文本数据方便,转成字符流按照字符串操作是最方便的。
所以既然明确了Reader,那么就将System.in 转换成Reader。
用了Reader体系中的转换流,InputStreamReader;
InputStreamReader isr = new InputStreamReader(System.in);
需要提高效率吗?需要
BufferedReaderbr=new BufferReader(new InputStreamReader(System.in));
目的:OutputStream Writer
是否是纯文本?是,Writer
设备:键盘。一个文件。使用FileWriter
FileWriter fw = new FileWriter(c.txt);
需要提高效率吗?需要
BufferedWriter bw=new BufferedWriter(new FileWriter(c.txt) );
扩展:将键盘输入的数据按照指定的编码表,保存到一个文件中、
目的:OutputStream Writer
是否是纯文本?是,Writer
设备:键盘。一个文件。使用FileWriter,但FileWriter使用的是默认编码表GBK
但是存储时,需要假如指定编码表utf-8,而指定编码表只有转换流才可以之定,所以要使用OutputStreamWriter,而转换流对象需要接收一个字节输出流,而且还可以操作文件的字节输出流:FileOutputStream;
OutputStreamWriterosw=
newOutputStreamWriter(new FileOutputStream(“c.txt”,”utf-8”))
需要提高效率吗?需要 BufferedWriter bw=new BufferedWriter(osw );
转换流什么时候使用:字符和字节之间的桥梁,通常涉及到字符编码转换时用转换流
作者: rende1991 时间: 2014-7-16 16:06
技术还不到位 得努力了
作者: hengxing0079 时间: 2014-7-17 22:07
总结的有点乱了点,最好排版一下!
作者: huiyifan 时间: 2015-9-23 19:22
.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |