ITEEDU

Java Gossip: FileInputStream、 FileOutputStream

FileInputStream是InputStream的子类,由名称上就可以知道, FileInputStream主要就是从指定的档案中读取数据至目的地。

FileOutputStream是OutputStream的子类,顾名思义,FileInputStream主要就是从来源地写入数据至指定的档案中。

标准输入输出串流对象在程序一开始就会开启,但只有当您建立一个FileInputStream或FileOutputStream的实例时,实际的串流才会开启,而不使用串流时,也必须自行关闭串流,以释放与串流相依的系统资源。

下面这个程序可以复制档案,程序先从来源档案读取数据至一个位缓冲区中,然后再将位数组的数据写入目的档案:

FileStreamDemo.java
package onlyfun.caterpillar;
import java.io.*;
public class FileStreamDemo {
	public static void main(String[] args) {
		try {
			byte[] buffer = new byte[1024];
			FileInputStream fileInputStream =
			new FileInputStream(new File(args[0]));
			FileOutputStream fileOutputStream =
			new FileOutputStream(new File(args[1]));
			System.out.println("复制档案:" +
			fileInputStream.available() + "字节");
			while(true) { // 从来源档案读取数据至缓冲区
				if(fileInputStream.available() < 1024) {
					int remain;
					while((remain = fileInputStream.read())
					!= -1) {
						fileOutputStream.write(remain);
					}
					break;
				}
				else {
					fileInputStream.read(buffer);
					// 将数组数据写入目的档案
					fileOutputStream.write(buffer);
				}
			}
			// 关闭串流
			fileInputStream.close();
			fileOutputStream.close();
			System.out.println("复制完成");
		}
		catch(ArrayIndexOutOfBoundsException e) {
			System.out.println(
			"using: java FileStreamDemo src des");
			e.printStackTrace();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}

这个程序示范了两个 read() 方法,一个可以读入指定长度的数据至数组,一个一次可以读入一个字节,每次读取之后,读取的指标都会往前进,您使用available()方法获得还有多少字节可以读取;除了使用File来建立FileInputStream、FileOutputStream的实例之外,您也可以直接使用字符串指定路径来建立。

不使用串流时,记得使用close()方法自行关闭串流,以释放与串流相依的系统资源。