java.io.FileOutputStream是java.io.OutputStream的具体实现,提供连接到文件的输出流。
public class FileOutputStream extends OutputStream
类中实现了OutputStream的所有常用方法
public native void write(int b) throws IOException
public void write(byte[] data) throws IOException
public void write(byte[] data, int offset, int length) throws IOException
public native void close() throws IOException
跟之前的FileInputStream相同,FileOutputStream的四个方法也都是实际上的native方法。如下的三种构造器,区别在于文件是如何指定的:
public FileOutputStream(String filename) throws IOException
public FileOutputStream(File file) throws IOException
public FileOutputStream(FileDescriptor fd)
和FileInputStream不同的是,如果指定的文件不存在,那么FileOutputStream会创建它,如果文件存在,FileOutputStream会覆盖它。这个特性让我们使用的时候有些不太方便,有的时候,往往我们需要往一个文件里面添加一些数据,比如向日志文件里面存储记录。这时候,第四个构造函数就体现了它的作用
public FileOutputStream(String name, boolean append) throws IOException
如果append设置为true,那么如果文件存在,FileOutputStream会向文件的末尾追加数据,而不是覆盖。
下面的程序获取两个文件名作为参数,然后把第一个文件复制到第二个文件:
public class FileCopier {
public static void main(String[] args) {
if(args!=2) {
System.err.println("error input");//输入异常。
return;
}
try {
copy(args[0],args[1]);//调用复制文件的方法
} catch (IOException e) {System.err.println(e);}
}
public static void copy (String inFile, String outFile) throws IOException {
FileInputStream fin = null;
FileOutputStream fout = null;
try{
fin = new FileInputStream(inFile);
fout = new FileOutputStream(outFile);
StreamCopier.copy(fin,fout);
}
finally {
try {
if (fin != null) fin.close();
} catch (IOException e) {}
try {
if (fout != null) fout.close();
} catch (IOException e) {}
}
}
public class StreamCopier {
public static void copy(InputStream in,OutputStream out) throws IOException {
//Do not allow other threads read from the input or write the output
synchronized (in) {
synchronized (out) {
byte[] buffer = new byte[256];
while(true) {
int bytesRead = in.read(buffer);
if(bytesRead == -1) break;
out.write(buffer,0,bytesRead);
}