前面已经介绍了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+" ");*/ 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等等。