FileOutputStream 文件字节输出流,继承了 OutputStream。常用于把数据写入到磁盘上(服务器端磁盘或者客户端磁盘),简单理解,有一些物品和一个盒子,把物品放到盒子里,物品代表内存中的数据流,盒子代表磁盘。这个比喻有些不恰当,方便大伙理解即可。
它的构造方法和FileInputStream类似,下面列出来,具体说明不再累赘,参考FileInputStream。前面两个比较常用。参数 append 表示写入的方式,true 追加或者 false 覆盖。不传的时候表示完全覆盖。
FileOutputStream(String name)
FileOutputStream(File file)
FileOutputStream(String name, boolean append)
FileOutputStream(File file, boolean append)
FileOutputStream(FileDescriptor fdObj)
常用的方法:
native void write(int b, boolean append)
native void writeBytes(byte b[], int off, int len, boolean append)
void write(byte b[])
void write(int b)
native void writeBytes(byte b[], int off, int len, boolean append)方法是基础,void write(byte b[])调用了它,相比void write(byte b[]),void write(byte b[]) 方法的使用率要高些。
native void write(int b, boolean append) 是一个私有方法,private 修改的。void write(int b)方法调用了它。
下面我们模拟一个场景,使用FileInputStream 读取一个文件,然后把读取到的数据写入到新的文件中。为了简单化,模拟读取一个txt文件。
实现示例,先声明FileInputStream 对象并用它读取到数据,然后将读取到的数据交给FileOutputStream 对象,此处调用了FileOutputStream 的write(byte [] b)。
完整的代码参考下面
package cmc.com.jer.cmc;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Demo3 {
public static void main(String[] args) {
// 声明 file
File file = new File("e:/app/f.txt");
File nf = new File("e:/app/nf.txt");
if(!nf.exists()){
try {
nf.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
// 这个数组的大小根据文件来指定,避免内存浪费 ,该数组用来存储读取的字节
byte [] b = new byte[(int)file.length()];
// 字节输入流 FileInputStream
InputStream in =null;
OutputStream out = null;
try {
in = new FileInputStream("e:/app/f.txt");
out = new FileOutputStream(nf);
try {
//把读取到的字节新放入 数组 b中
in.read(b);
out.write(b);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(in !=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(out != null){
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
执行完上面的代码,会发现每次都是完全覆盖,要想不完全覆盖,每次都累加要怎么办呢?
要是注意了上面的构造方法中的参数,会发现它很简单,有个参数 boolean append 当它为true的时候,表示 追加内容。
上面的示例代码只要改一处即可 把“out = new FileOutputStream(nf);” 改成 “out = new FileOutputStream(nf,true);”即可。
再次执行会发现原先的内容没有被覆盖,只是在尾部追加了新内容。