Java I/O的典型使用方式

前面已经介绍了IO的各种流,我们知道,可以通过不同的方式组合I/O流。介绍几种典型的I/O的使用方法;

1.缓冲文件读取

打开一个文件,并读取其中的字符,可以使用String或者file对象作为文件名的FileInputReader.

如下:

package IOStreamTest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class BufferdInputFile {
    
    public static String read(String filepath) throws IOException{
        FileReader filere = new FileReader(new File(filepath));
        int ch;
        StringBuilder sb = new StringBuilder();
        while((ch=filere.read())!=-1){
            sb.append(ch);
            System.out.println(ch);
        }
        filere.close();
        return sb.toString();
    }
   public static void main(String args[]) throws IOException{
       System.out.println(read("fortest"));
       
   }
}

输入文件: fortest 

 

 

只能一个字符一个字符的读取 结果如下,输出:

 

为了提高速度,可以使用BufferedReader来读取 ,如下所示:

package IOStreamTest;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class BufferdInputFile {
    
    public static String read(String filepath) throws IOException{
        BufferedReader bufre = new BufferedReader(new FileReader(new File(filepath)));
        StringBuilder sb = new StringBuilder();
        String s;
        int ch=0;
        while((ch=bufre.read())!=-1){
            sb.append(ch);
        }
    /*    while((s=bufre.readLine())!=null)
            sb.append(s+"\n");*/
        bufre.close();
        return sb.toString();
        
    }
   public static void main(String args[]) throws IOException{
       System.out.println(read("fortest"));
       
   }
}

结果与上图一样。

Bufferreader提供readline方法,而filereader只提供

A  ,int read(); // 读取单个字符。返回作为整数读取的字符,如果已达到流末尾,则返回 -1。

B. int read(char []cbuf);//将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1 

2从内存中输入

从BufferedInputFile.read中读入的String用来创建一个Stringreader然后调用read每次读取一个字符,并发送到控制台。

public static void main(String args[]) throws IOException{
       StringReader sr = new StringReader(BufferdInputFile.read("fortest"));
       int ch=0;
       while((ch=sr.read())!=-1){
           System.out.print((char)ch);//注意read是以int形式返回下一字节,因此要转化成char才能正确打印。
       }
       //System.out.println(read("fortest"));
       
   }

3.格式化的内存输入

要读取格式化的数据,可以使用DataInputStream,这个是面向字节的IO.因此使用inputstream而不是reader.

public static void main(String args[]) throws IOException{
       DataInputStream datain = new  DataInputStream
               (new ByteArrayInputStream(BufferdInputFile.read("fortest").getBytes()));
       while(datain.available()!=0){        //由于readbyte一次读取一个字符,任何字节的值都是合法的结果,因此返回值不能用来检验输入是否结束。相反,我们可以利用available()
//还有多少个供存取的字符检查 System.out.println((
char)datain.readByte()); } }

4.基本的文件输出

filewriter向文件写入数据。通常,创建一个与指定文件链接的filewriter 实际上,会用bufferedwriter包装起来用来缓存输出。可以根据需要将其包装成任意输出流。在此包装城printwriter

在javase5中,可以省略掉装饰工作。添加了辅助构造器(PrintWriter pw = new printwirter(file)).printwriter 可以格式化数据方便阅读。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringReader;

public class BufferedOutputtest {
    public static void main(String args[]) throws IOException{
        BufferedReader bufr =new BufferedReader(new StringReader(BufferdInputFile.read("read")));
        PrintWriter pw = new PrintWriter
                //(new File("fortest"));
                (new BufferedWriter(new FileWriter("fortest")));
        int linecount =1;
        String s;
        while((s=bufr.readLine())!=null)
            pw.println(linecount++ +":"+s);
        pw.close();
        //System.out.println(BufferdInputFile.read("fortest"));
    }

}

5.存储和恢复数据

可以从dataoutputStream写入数据,并用datastream恢复数据。

Java保证我们可以使用datainputstream准确的读取数据,无论读写的平台有多么不一样。

package IOStreamTest;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class dataout_inputstream {
    public static void main(String args[]) throws IOException{
    DataOutputStream datao =new DataOutputStream(new BufferedOutputStream(new FileOutputStream("fortest")));
    datao.writeInt(9);
    datao.writeUTF("mark");
    datao.writeByte(9);
    datao.close();
   DataInputStream datain  = new DataInputStream(new BufferedInputStream(new FileInputStream("fortest")));
   System.out.println(datain.readInt());
   System.out.println(datain.readUTF());
    }
}

6.读写随机访问文件。RandomAccessFile

类似于组合使用了dataoutput 和datainputstream。

Random适合由大小已知的记录组成的文件。可以用seek将记录从一处转移到另一处。实现了datainput和dataoutput接口,不是继承自outputstream或者inputstream。支持搜寻方法,可以查询当点所处的文件位置(getfilepointer());

 

7.管道流。用于多任务间的通信,也就是说用于并发。pipeinputstream pipeoutputstream,pipereader piperwriter等等。

 

 

 

 

 

posted @ 2017-04-10 18:32  王小丸子  阅读(807)  评论(0编辑  收藏  举报