关于流:流是一个抽象的观念,Java中通过流的方式处理输入,输出操作。
以数据的读取或写入分成了输入流(input stream)、输出流(out stream),Java中通过InputStream、OutputStream、Reader与Writer类
来处理流的输入与输出。
文件的基本操作:利用Reader与Writer类的衍生类创建对象来处理文件的读写操作,Reader类常用的方法有read读取一个字符,read(char[] buf)读取的是流所有数据,Writer类常用的方法write写入到流中,再通过flush方法将流中的数据刷新到文件中,不管是读还是写都要使用close方法关闭流资源。
将数据写入文件:要想将数据写入到文件中需要使用Writer类的衍生类FileWriter类,FileWriter类并不是直接继承的Writer,而是继承的OutputStream类,而OutputStream类又继承了Writer类。
public class FileWriterDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileWriter fw = null ;
try {
//创建一个FileWriter对象该对象一被初始化就必须有明确被操作的文件,FileWriter对象时需要做异常处理。
fw = new FileWriter("FileWriter.txt");
//调用write方法将数据写入缓冲流中
fw.write("file input~");
//调用flush方法将数据刷新到目的地
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(fw!=null)
//关闭流资源
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
结果:在指定目录下会有一个FileWriter.txt文件,并且文件里面会有file input~
FileWriter fw = new FileWriter("FileWriter.txt");创建一个文件对象,FileWriter.txt文件就会被创建到指定目录下,如果该目录下已有同名文件将被覆盖如果该目录下已有同名文件将被覆盖;调用write方法将数据写入流中,这时数据是存放在流的缓冲区中并没有真正的写入目的地,在调用了flush方法以后,该方法就将缓冲区的数据刷新到目的地。调用close方法关闭流资源,在关闭流资源的时候close方法会先刷新数据在将流资源关闭。
当在FileWriter fw = new FileWriter("FileWriter.txt",true);传递一个true参数时,调用write方法后会续写已有的数据
结果:指定目录下的FileWriter.txt文件里面的内容就会变成file input~file input~
close和flush区别:
flush刷新后,流可以继续使用,close刷新后,会将流关闭。
读取文件数据:文件的读取需要使用FileReader类,这个类是继承了InputStreamReader类,而InputStreamReader又继承了Reader类,因此Reader与InputStreamReader类里面的方法就可以提供给FileReader所创建的对象所使用。
代码演示:
public class FileReaderDemo {
/**
* @param args
*/
public static void main(String[] args) {
FileReader fr = null;
try {
//创建一个读取流对象,和指定目录下的文件
fr = new FileReader("FileWriter.txt");
//read():一次读一个字符,而且会依次自动往下读,返回的是一个数字
int c = 0;
//循环输出所有数据
while((c=fr.read())!=-1)
System.out.print((char)c);//由于read方法返回的为int类型的数字,这时需要强制转换成字符型
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
//关闭流资源
if(fr!=null)
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
结果:
file input~file input~
由于read方法会抛出IOException异常,利用try{}catch{}finally{}形式处理一下异常,在finally区关闭流资源。
文件搬家:将一个盘文件复制到另外一个盘
步骤:
1.在目的盘创建一个文件,用于存储来源盘的数据。
2.定义读取流和目的盘文件关联。
3.通过不断读写完成数据存储。
4.关闭流资源。
代码演示:
import java.io.*;
public class CopyDemo {
//定义用于复制函数
public static void copy()
{
FileWriter fw = null;
FileReader fr = null;
try {
//创建数据目的地
fw = new FileWriter("FileWriter_copy.txt");
//创建数据来源
fr = new FileReader("FileWriter.txt");
//定义一个缓冲容器存放数据,当读完所有数据以后,在写入数据这
char ch[] = new char[1024];
//定义一个指针变量
int len = 0;
//将所有数据读完存放在容器中
while((len=fr.read(ch))!=-1)
{
//将来源数据写入目的地
fw.write(ch,0,len);
}
} catch (IOException e) {
}finally{
if(fr!=null)
try {
fr.close();//关闭读取流资源
} catch (IOException e) {
}
if(fw!=null)
try {
fw.close();//关闭写入流资源
} catch (IOException e) {
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
copy();
}
}
小结:
1.Java以流的形式来处理输入和输出,这样做无论什么形式的输入和输出,只要是针对流处理就可以了。
2.Java中的流是以字节或字符组成的,Writer与Reader类主要是用于操作字符流,而InputStream与OutputStream主要是处理字节流文件。
3.Java中的流以读取和写入的形式,可以将流分为输入流和输出流。
4.在处理流的过程中都是通过创建InputStream、OutputStream、Reader与Writer类来处理输入和输出的。
5.具有缓冲区的文件处理方式,会现将数据存放到缓冲区中,然后一次性完成数据的操作,这样就避免了一个一个操作字节或字符的情况,增强了程序的效率。