Java FileOutputStream 详细介绍

1、FileOutputStream 简介

FileOutputStream继承于OutputStream:public class FileOutputStream extends OutputStream

FileOutputStream流是指文件字节输出流,专用于输出原始字节流,如图像数据等,其继承OutputStream类,拥有输出流的基本特性。

2、FileOutputStream 构造方法

FileOutputStream 总共有四个构造方法,但是实际上是由一个核心构造方法而延伸出另外的三种构造方法。

构造方法1:

public FileOutputStream(File file) throws FileNotFoundException{}

构造方法2:

public FileOutputStream(File file,boolean append) throws FileNotFoundException{}

其实,查看底层源码发现该构造方法1实际是调用了另一个构造方法2

public FileOutputStream(File file) throws FileNotFoundException {
    this(file, false);
}

若第二个参数为真,则意味着会写入字节到文件的末尾,意味着追加内容,若为假,则是写入字节到文件的开头,意味着是覆盖,

构造方法3:

public FileOutputStream(String name) throws FileNotFoundException{}

构造方法4:

public FileOutputStream(String name,boolean append) throws FileNotFoundException

同理,构造方法3的底层是调用构造方法4来实现的,而构造方法4则通过调用构造方法2来实现:

public FileOutputStream(String name) throws FileNotFoundException {
    this(name != null ? new File(name) : null, false);
}

3、FileOutputStream 常用API

(1)将指定的一个字节写入文件的输出流中,此处需要注意:参数是int型不是byte型的。

public void write(int b) throws IOException

代码如下所示:

public class Test
{
    public static void main(String[] args)
    {
        File file = new File("C:\\Users\\Administrator\\Desktop\\out.txt");
        try
        {
            String content = "Hello";
            FileOutputStream out = new FileOutputStream(file, false);
            byte[] b = content.getBytes();
            System.out.println("要写入的字节数据长度:" + b.length);
            for (int i = 0; i < b.length; i++)
            {
                out.write(b[i]); //此处等于是进行了向上转换,即byte类型的转换成了int类型然后调用方法,向上装换不需要强转标识
                System.out.println("写入次数:" + (i + 1));
            }
        }
        catch (FileNotFoundException e)
        {

            System.out.println("文件不存在或者文件不可读或者文件是目录");
        }
        catch (IOException e)
        {
            System.out.println("读取过程存在异常");
        }
    }
}

(2)将指定字节数组中的b.length个字节写入到输出流中

public void write(byte[] b) throws IOException {}

代码如下所示:

public class Test
{
    public static void main(String[] args)
    {
        //建立文件对象
        File file = new File("C:\\Users\\Administrator\\Desktop\\out.txt");
        try
        {
            String content = "Hello";
            FileOutputStream out = new FileOutputStream(file, false);
            out.write(content.getBytes());
        }
        catch (FileNotFoundException e)
        {
            System.out.println("文件不存在或者文件不可读或者文件是目录");
        }
        catch (IOException e)
        {
            System.out.println("读取过程存在异常");
        }
    }
}

(3)将从偏移量off开始的指定字节数组中的len个字节写入输出流中

public void write(byte[] b,int off,int len) throws IOException{}

参数说明:参数b代表着含有要写入数据的字节数组,参数off代表着从数组下标off开始,参数len表示最终写入的字节个数。例如,write(bytes,0,5)则意味着从字节数组bytes中下标0开始读5个字节到输出流中。

代码说明:

public class Test
{
    public static void main(String[] args)
    {
        File file = new File("C:\\Users\\Administrator\\Desktop\\out.txt");
        try
        {
            String content = "Hello";
            FileOutputStream out = new FileOutputStream(file, false);
            byte[] bytes = content.getBytes(); //得到装有内容的字节数组
            out.write(bytes, 1, 4); //代表我只想要从下标1开始的4个字节,即bcde
        }
        catch (FileNotFoundException e)
        {
            System.out.println("文件不存在或者文件不可读或者文件是目录");
        }
        catch (IOException e)
        {
            System.out.println("读取过程存在异常");
        }
    }
}

4、FileOutputStream write 方法小结

通过上述实例代码其实可以发现使用write(int n)是需要传递单字节作为参数,但是一般情况我们都是接收的字节数组,与其使用字节数组进行循环调用还不如使用write(byte[] b)方法,直接把内容转化成字节数组作为参数调用即可,因此使用FileOutputStream流写数据时一般使用第二种和第三种write方法即可。

原文链接:http://www.mybatis.cn/java/1982.html