过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。
节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。
FileInputStream和FileOutputStream,节点流,用于从文件中读取或往文件中写入字节流。
BufferedInputStream和BufferedOutputStream,过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。
DataInputStream和DataOutputStream,多字节输入输出流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。
PipedInputStream和PipedOutputStream,管道流,用于线程间的通信。
1) 过滤输入输出流FilterInputStream、FilterOutputStream的使用
File f=new File("d:\\filetest\\1.txt");
FileInputStream fis=new FileInputStream(f);
FilterInputStream filter=new FilterInputStream(fis);
for(int i=0;i<f.length();i++)
{
System.out.print(filter.read());
}
fis.close();
先创建节点输入流 FileInputStream,接着在节点流的基础上创建过滤输入流,进行读操作,循环输出。最后关闭节点输入流。同样过滤输出流也是一样创建,采用写操作。
2)DataOutputStream多字节输出流使用举例
File f=new File("C:\\Users\\Administrator\\Desktop\\filetest\\1.txt"); FileOutputStream fos=new FileOutputStream(f); DataOutputStream dos=new DataOutputStream(fos);
try
{
dos.writeUTF("你项目完成了吗?");
dos.writeUTF("还没有");
dos.writeUTF("那还不加紧完成");
dos.writeUTF("知道了");
}
catch(Exception e)
{}
dos.close();
}
在创建节点流基础上创建多字节输出流对象fos,通过写操作将多个字节数据写入创建的文件之中。DataInputStream多字节输入流同理使用,只不过是采用read操作。
3) 字符输入输出流 InputStreamReader OutputStreamWriter
File f=new File("C:\\Users\\Administrator\\Desktop\\filetest\\1.txt"); FileInputStream fis=new FileInputStream(f);
InputStreamReader isr=new InputStreamReader(fis); char st=(char)isr.read();
System.out.println(st);
字符输入流对象的创建前提条件是创建文件输入流。实现读取创建文件的字符数据并循环输出。字符输出流使用流程与字符输入流类同。
4) 带输出缓冲的输入输出流 BufferedReader、BufferedWriter
FileInputStream fis=new FileInputStream(f);
InputStreamReader isr=new InputStreamReader(fis);
BufferedReader br=new BufferedReader(isr);
System.out.println(br.readLine());
System.out.println(br.readLine());
fis.close();
创建一个输入流对象fis,并且以f作为参数创建一个字符输入流对象isr,再以fis作为参数创建一个带缓冲的输入流对象,利用此对象读取一行数据。
5) 以输出输入流对象参数对方法进行设计
public void read1(BufferedReader br) {
try {
System.out.println(br.readLine());
} catch (Exception e) {
}
public void write1(String str, BufferedWriter bw) {
if (str.length() > 5) {
try {
bw.write(str);
bw.newLine();
bw.flush();
} catch (Exception e) {
}
} else if ((str.length()) < 5) {
try {
bw.write("输入有误!");
bw.newLine();
bw.flush();
} catch (Exception e) {
}
}
java在使用流时,都会有一个缓冲区,按一种它认为比较高效的方法来发数据:把要发的数据先放到缓冲区,缓冲区放满以后再一次性发过去,而不是分开一次一次地发。而flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满。下面给出主main的测试代码:
FileInputStream fis = new FileInputStream(f);
OutputStreamWriter osw = new OutputStreamWriter(fos);
InputStreamReader isr = new InputStreamReader(fis);
BufferedWriter bw = new BufferedWriter(osw);
BufferedReader br = new BufferedReader(isr);
f2.write1("欢迎你来到北京", bw);
f2.write1("你说是吗", bw);
f2.write1("我觉得你说得有点道理", bw);
f2.write1("我也是这么想的啊", bw);
f2.read1(br);
f2.read1(br);
f2.read1(br);
f2.read1(br);
br.close();
bw.close();
更多的文件IO操作还是需要多实践,才能有更深的理解。