Java I/O流 (一)---文件流的基本操作

时间:2023-02-17 16:55:30
java I/O流是JAVA重要内容之一,它对我们进行常见的文件操作至关重要。就Java流写写自己的学习心得。
首先java流是由java.io包中定义的类实现的,需要对流操作时候,首先要加上:import java.io.*。
java流中4个基本的抽象类如下图,其余的类都是从这几个类中派上出来的以及这几个类的类层次如下:
Java I/O流 (一)---文件流的基本操作
Java I/O流 (一)---文件流的基本操作


Java I/O流 (一)---文件流的基本操作
    
Java I/O流 (一)---文件流的基本操作

Java I/O流 (一)---文件流的基本操作

以上大体说明了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()方法,它从缓冲输入流中读取一行字符,并且以字符串的形式放回。下面看看这个流的使用实例:

publicclassRraderDemo

{

         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流。