电脑技术学习

JAVA教程 第四讲 Java的例外处理和I/O流(二)

dn001

  4.5.2 文件的顺序处理

  类FileInputStream和FileOutputStream用来进行文件I/O处理,由它们所提供的方法可以打开本地主机上的文件,并进行顺序的读/写。例如,下列的语句段是顺序读取文件名为text的文件里的内容,并显示在控制台上面,直到文件结束为止。

  FileInputStream fis;

   try{

    fis = new FileInputStream( "text" );

   System.out.print( "content of text is : ");

     int b;

     while( (b=fis.read())!=-1 ) //顺序读取文件text里的内容并赋值

                    给整型变量b,直到文件结束为止。

     {              

       System.out.print( (char)b );

     }

   }catch( FileNotFoundException e ){

   System.out.println( e );

   }catch( IOException e ){

   System.out.println( e );

   }

  4.5.3 随机访问文件

  对于InputStream 和OutputStream 来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。随机访问文件则允许对文件内容进行随机读/写。在java中,类RandomAccessFile 提供了随机访问文件的方法。类RandomAccessFile的声明为:

  public class RandomAccessFile extends Object implements DataInput, DataOutput

  接口DataInput 中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数。如:readBoolean( )、readInt( )、readLine( )、readFully( ) 等。

  接口DataOutput 中定义的方法主要是向流中写入基本类型的数据、或者写入一定长度的字节数组。如:writeChar( )、writeDouble( )、write( ) 等。 下面详细介绍RandomAccessFile类中的方法。

  ◇ 构造方法:

  RandomAccessFile(String name,String mode); //name是文件名,mode

          //是打开方式,例如"r"表示只读,"rw"表示可读写,"

  RandomAccessFile(File file,String mode); //file是文件对象

  ◇ 文件指针的操作

  long getFilePointer( ); //用于得到当前的文件指针

  void seek( long pos ); //用于移动文件指针到指定的位置

  int skipBytes( int n ); //使文件指针向前移动指定的n个字节

  4.6 过滤流

   过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类

   过滤流类层次:

     java.lang.Object

   |

   +----java.io.InputStream

   |

   +----java.io.FilterInputStream

  为了使用一个过滤流,必须首先把过滤流连接到某个输入/出流上,通常通过在构造方法的参数中指定所要连接的输入/出流来实现。例如:

  FilterInputStream( InputStream in );

  FilterOutputStream( OutputStream out );

  4.6.1 几种常见的过滤流

  ◇ BufferedInputStream和BufferedOutputStream

    缓冲流,用于提高输入/输出处理的效率。

  ◇ DataInputStream 和 DataOutputStream

    不仅能读/写数据流,而且能读/写各种的java语言的基本类型,如:boolean,int,float等。

  ◇ LineNumberInputStream

    除了提供对输入处理的支持外,LineNumberInputStream可以记录当前的行号。

  ◇ PushbackInputStream

    提供了一个方法可以把刚读过的字节退回到输入流中,以便重新再读一遍。

  ◇ PrintStream

    打印流的作用是把Java语言的内构类型以其字符表示形式送到相应的输出流。

  4.7 字符流的处理

  java中提供了处理以16位的Unicode码表示的字符流的类,即以Reader和Writer 为基类派生出的一系列类。

  4.7.1 Reader和Writer

   这两个类是抽象类,只是提供了一系列用于字符流处理的接口,不能生成这两个类的实例,只能通过使用由它们派生出来的子类对象来处理字符流。

  1.Reader类是处理所有字符流输入类的父类。

  ◇ 读取字符

  public int read() throws IOException; //读取一个字符,返回值为读取的字符

  public int read(char cbuf[]) throws IOException; /*读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量*/

  public abstract int read(char cbuf[],int off,int len) throws IOException;

  /*读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现*/

  ◇ 标记流

  public boolean markSupported(); //判断当前流是否支持做标记

  public void mark(int readAheadLimit) throws IOException;

   //给当前流作标记,最多支持readAheadLimit个字符的回溯。

  public void reset() throws IOException; //将当前流重置到做标记处

  ◇ 关闭流

  public abstract void close() throws IOException;

  2. Writer类是处理所有字符流输出类的父类。

  ◇ 向输出流写入字符

  public void write(int c) throws IOException;

  //将整型值c的低16位写入输出流

  public void write(char cbuf[]) throws IOException;

  //将字符数组cbuf[]写入输出流

  public abstract void write(char cbuf[],int off,int len) throws IOException;

  //将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流

  public void write(String str) throws IOException;

  //将字符串str中的字符写入输出流

  public void write(String str,int off,int len) throws IOException;

  //将字符串str 中从索引off开始处的len个字符写入输出流

  ◇ flush( )

  刷空输出流,并输出所有被缓存的字节。

  ◇ 关闭流

  public abstract void close() throws IOException;

  4.7.2 InputStreamReader和OutputStreamWriter

  java.io包中用于处理字符流的最基本的类,用来在字节流和字符流之间作为中介。

   ◇ 生成流对象

  public InputStreamReader(InputStream in);

  /*in是字节流,而InputStreamReader是字符流,但是其来源是字节流in,

  因此InputStreamReader就可以把字节流in转换成字符流处理。/*

  public InputStreamReader(InputStream in,String enc) throws UnsupportedEncodingException;

  /*enc是编码方式,就是从字节流到字符流进行转换时所采用的编码方式,

   例如 ISO8859-1,UTF-8,UTF-16等等*/

  public OutputStreamWriter(OutputStream out);

  /*out是字节流,而OutputStreamReader是字符流 */

  public OutputStreamWriter(OutputStream out,String enc) throws UnsupportedEncodingException; //enc是编码方式

  InputStreamReader和OutputStreamWriter的方法:

  ◇ 读入和写出字符

  基本同Reader和Writer。

  ◇ 获取当前编码方式

  public String getEncoding();

  ◇ 关闭流

  public void close() throws IOException;

标签: