java IO简单总结



java IO简单总结,实例源码介绍。java主要有两种流:

InputStream和OutputStream:字节流,在没有处理流的情况下,每次只能从数据源读取一个字节和向数据源写出一个字节,这两个是抽象类。

Reader和Writer:字符流,,在没有处理流的情况下,每次只能从数据源读取一个字符(2个字节)和向数据源写出一个字符,这两个也是抽象类。

通过这两组流,延伸出去的流就多了!

比如,加上一个File,就成了文件字节输入流-FileInputStream,
比如,加上了个Buffered,主成了缓冲字节输入流-BufferedInputStream,

同样,字符流也有FileReader,BufferedReader。

也就是说,InputStream和OutputStream字节流,Reader和Writer字符流我们都可以加上File或者Buffered。但是说到底,只有字节流和字符流这两种。

Buffered有什么好处?

1. 能够提搞读写速度,在一次访问硬盘的时候可以读取多条数据。
2. 拥有节点流没有的readLine(),即读取一行的方法。

 

我们常用的流有哪些呢?我们以读取一个文本文件然后另存为一个文本文件为例,写两种方式。为了尽量简单,我省去了try-catch之类的与文件操作无直接关系的代码。

第一种,用字节流,文件字节输入流和文件字节输出流,FileInputStream,FileOutputStream,这种方式适用于几乎所有文件,包括文本文件。需要一个File对象配合使用。

public void saveFile() throws Exception{
FileInputStream fis = null;
FileOutputStream fos = null;

File inFile=new File(“F:\\files\\a.txt”);
File outFile=new File(“F:\\files\\b.txt”);
fis=new FileInputStream(inFile);
fos=new FileOutputStream(outFile);

byte[] buf = new byte[1024];
while((fis.read(buf))!=-1){
fos.write(buf);
}
if(fis!=null){
fis.close();
}
if(fos!=null){
fos.close();
}
}

第二种,用字符流,而且是带缓冲的字符流。BufferedReader和BufferedWriter。这里面,需要一个FileReader和FileWriter以及File对象与它们配合使用。


public void buffer() throws Exception{
FileReader fis = null ;
BufferedReader bfr = null ;

FileWriter fw = null ;
BufferedWriter bfw = null ;
String  readContent =”";
File file = new File(“F:\\files\\a.txt”);
String str=”";
fis = new FileReader(file);
bfr = new BufferedReader(fis);
while( (str = bfr.readLine()) != null )
{
readContent+=str+”\r\n”;;
}

fw = new FileWriter(“F:\\files\\b.txt”,true);
bfw = new BufferedWriter(fw);
bfw.write(readContent);
if( bfr != null )
{
bfr.close();
}
if( fis != null )
{
fis.close();
}
if( bfw != null )
{
bfw.close();
}
if( fw != null )
{
fw.close();
}
}

以上组合,

字节流FileInputStream+FileOutputStream+File

字符流FileReader+BufferedReader+FileWriter+BufferedWriter+File

就是我们平时操作文件比较常用的了。

为什么有了字节流还要字符流?既然字节流可以把字符流能做的都做了,还要字符流做什么?我个人认为,由于我们难免操作文本文件,如果用字节流明显效率太低,于是,字符流应运而生。
文件操作没这么简单,但作为初学者,就算要系统地掌握这一块的知识,把这两者搞清楚也是必要的,这个是前提。


有了带缓冲的字符流(BufferedReader),有没有带缓冲的字节流(BufferedInputStream)呢?

答案是有。

还记得我们刚才用FileReader与BufferedReader配合使用,

同理,FileInputStream也与BufferedInputStream配合使用。

但是遗憾的是,字节流没有readline方法。用法上,带缓冲的字节流和不带缓冲的字节流好像没有多少区别。

public void bufferstream() throws Exception{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(“F:\\files\\a.txt”)));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(“F:\\files\\b.txt”)));
byte[] buf = new byte[1024];
bis.read(buf,0,100);
bos.write(buf,0,100);
bis.close();
bos.close();
}