javaIO-字节流-FileOutputStream

FileOutputStream是Java中用于将数据写入磁盘的字节输出流,它可以覆盖或追加文件内容。构造方法包括根据文件名或File对象创建,并可指定是否追加模式。常用方法有write(int b)和write(byte b[]),前者内部调用后者。通过示例展示了如何从一个文件读取数据并写入另一个文件,如果设置追加模式,内容将在原有基础上追加而非覆盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);”即可。
再次执行会发现原先的内容没有被覆盖,只是在尾部追加了新内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值