java I/O流是JAVA重要内容之一,它对我们进行常见的文件操作至关重要。就Java流写写自己的学习心得。
首先java流是由java.io包中定义的类实现的,需要对流操作时候,首先要加上:import java.io.*。
java流中4个基本的抽象类如下图,其余的类都是从这几个类中派上出来的以及这几个类的类层次如下:
以上大体说明了JAVA中流的层次结构。接下来说说java中经常采用的两类流:实体流和装饰流。实体流是指直接连接数据源的流类,它可以独立使用;而装饰流不直接连接数据源,而是以实体流对象为基础建立的流类。java i/0中我们经常针对的是文件操作,接下来就以文件为例主要说说这两类
一、java实体流FileInputStream,FileOutputStream,FileReader,FileWriter
1.文件字节流FileInputStream,FileOutputStream
(1)文件输入流FileInputStream类:我们采用以下方式打开一个已经存在的文件:
FileInputStream fileStream=new FileInputStream(new File(String filename));当filename不含带路径时候,就打开当前目录下面的文件;如果filename含带路径,就在指定的路径下面打开文件。
打开文件以后,使用read()方法一个字节一个字节的读取文件内容;当文件读完以后,采用close()方法关闭文件流即可。以下是一个从文本文件中读取数据并且显示出来的例子:
import java.io.*;
classFileInputStreamDemo1 {
public static voidmain(String[] args) {
try {
File file = newFile("test.txt"); //创建文件对象
//使用文件对象创建文件输入流对象,相当于打开文件
FileInputStream fis = new FileInputStream(file);
for (int i = 0; i < file.length(); i++) {
char ch = (char)(fis.read()); //循环读取
System.out.print(ch);
}
System.out.println();
fis.close(); //关闭流
} catch (FileNotFoundException fnfe) {
System.out.println("文件打开失败。");
} catch (IOException ioe) {
ioe.printStackTrace();
}
}}
在上述例子中,可以通过file.length()来判断是否已经到达文件末尾。
(2)文件输出流FileOutputSream:我们采用以下方式将数据写入到文件中去
FileOutputStream filestream=new FileOutputStream(new File(String filename));这些含义均和上面FileInputStream类相对应。需要说明的是FileOutputStream类中还有另外一个构造方法:
FileOutputStream(File file, booleanappend)
当参数append为true的时候表明追加文件内容,参数为false的时候表示不追加文件内容。
接下来用public void write(byte b[],int off,int len); 写入内容。为了防止无法写入的问题,我们一般在这个方法后面采用flush()方法进行强行写入,写完以后采用close()方法关闭对象。具体实例如下:
import java.io.*;
class FileOutputStreamExample{
public static void main(String[] args) {
try {
String str="好好学习Java";
byte[] words = str.getBytes();//将字符串转化成字节数组
OutputStream fos = new FileOutputStream("Output.txt ");
fos.write(words, 0, words.length);
System.out.println("Text文件已更新!");
fos.close();
} catch (IOException obj) {
System.out.println("创建文件时出错!");
}
} }
2.文件字符流FileReader,FileWriter(操作流程和字节流相同)
(1)输入流FileReader类:没有什么特别的方法就不说了
(2)输出流FileWriter类:特别提到,这里用有一个方法void write(String str) throws IOException,这个方法能够写入字符串。在这里面顺便比较一下Writer类和OutputStream类中flush()方法的区别:在OutputStream类的子类中并没有对父类的这一个方法进行实现;但是Writer类中的flush()方法是一个抽象方法,它的子类都对这个方法进行了实现。无论是使用字节流还是字符流进行输出的时候,我们一般都加上这个方法,这样可以方法数据无法写入到输出流中去。
二、java装饰流
1.缓冲流BufferedReader,BufferedWriter类
(1)BufferedReader类:装饰流的创建是先创建一个实体流,然后在创建一个装饰流。该类创建如下:
FileReader filereader=new FileReader(new File(String filename));
BufferedReader bfReader=new BufferedReader(filereader);
在这个类中最常用方法是String readLine()方法,它从缓冲输入流中读取一行字符,并且以字符串的形式放回。下面看看这个流的使用实例:
publiccla***raderDemo
{
public staticvoidmain(String[] args) throws IOException
{
File file= newFile("test.txt");
//通过文件对象创建文件输入流对象
FileReaderfr= newFileReader(file);
//将文件读取流包装成缓冲输入流
BufferedReaderbr= newBufferedReader(fr);
String str;
while((str= br.readLine()) != null) //逐行读取数据
{
System.out.println(str);
}
br.close(); //关闭流
fr.close(); //关闭流
}
}
(2)BufferedWriter类:它最常用的方法是void write(String str)和void newLine()。后面这个方法是将回车换行符写入到流中,必须捕获异常IOException
2.数据流DataInputStream,DataOutputStream
这两个类提供了java读写基本数据类型int,byte,boolean,long,float,double,short,char的功能。它们对文件操作的时候要分别依附于FileInputStream和FileOutputStream这两个实体流。
通过上述介绍的内容,我们就可以实现对文件的基本操作,接着会在后续介绍JAVA I/0流。