java中FileOutputStream流中有参构造方法有无append形参的区别--超详细讲解版

简介: java中FileOutputStream流中有参构造方法有无append形参的区别--超详细讲解版

java中FileOutputStream流中有参构造方法之间的区别超详细讲解版

1.创建FileOutputStream流对象

使用有参构造方法,FileOutputStream流中的有参构造方法分别有:

public FileOutputStream(File file):创建一个文件输出流写入指定的File对象表示的文件

public FileOutputStream(File file,boolean append):创建一个文件输出流写入指定的FileInputStream对象表示的文件

public FileOutputStream(String filename,boolean append):创建一个文件输出流,用指定的名称写入文件

public FileOutputStream(String filename):创建一个文件输出流,用指定的名称写入文件

2.使用文件目录的方式创建输入流对象有无append形参的区分

示例一:有append形参的构造方法分析

package june.selfStudy.IO;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class HaveAppend {
    public static void main(String[] args) {
        //创建输入字节流对象
        FileOutputStream fos = null;
        try {
            //如果tempfile04文件不存在,那么就会自动生成一个tempfile04
            fos = new FileOutputStream("tempfile04",true);
            //准备一个byte[]数组
            byte[] bytes  = {97,98,99,100,101};
            //第一次写入:将byte数组的全部字节全部写入文件中
            fos.write(bytes);//tempfile04的文件在IDEA的当前的工程目录下生成,并且写入了abcde
            //第二次写入:指定长度的将数组中的内容写入文件中
            fos.write(bytes,0,2);//从数组索引为0开始,写进去两个字节,tempfile04文件中被写入了abcdeab
            //第三次写入:使用String转成byte数组的方式写入
            byte[] bs = "我们在学习FileOutputStream流中有参构造方法(包含append形参)".getBytes();
            fos.write(bs);//abcdeab我们在学习FileOutputStream流中有参构造方法(包含append形参)
            //输出流使用完之后必须刷新
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            //养成一个关闭流的好习惯
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
通过上述程序我们可以总结出什么?

当使用含有append参数的构造方法去创建输出流对象的时候,往文件中写内容的时候,是不会把第一次写入或者第二次写入的内容清空然后新建一个文件去写入新的内容,同时我们可以试着理解append的翻译是“追加”,则表示后来写入文件的东西是以追加的方式写入的,如果append传入的是true,那么将字节写入文件的末尾处,而不是写入文件的开始处,就不会清空原文件的内容。

示例二:无append形参的构造方法分析
package june.selfStudy.IO;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class NoAppend {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("tempfile05");
            //准备byte数组
            byte[] bytes = {97,98,99,100,101};
            //第一次写入
            //fos.write(bytes);//abcde
            //第二次写入
            fos.write(bytes,0,2);//ab
            //输出流使用完之后要刷新,养成好习惯
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

总结:当使用FileOutputStream(String name, boolean append)构造方法并将append参数设置为false时,与使用FileOutputStream(String name)构造方法效果是一样的,都会在写入数据之前清空文件。

这是因为在FileOutputStream的源码中,当append参数为false时,会先检查文件是否存在,如果存在则删除文件内容,然后创建一个新的空文件,再进行写入操作。所以无论是使用FileOutputStream(String name, boolean append)构造方法还是使用FileOutputStream(String name)构造方法并设置append参数为false,都会清空文件内容并写入新的数据。

3.使用文件的方式创建输入流对象有无append形参的区分

File file是文件的方式创建文件,String name是通过路径创建文件,所以可以同理可知有无append形参的区别。

目录
相关文章
|
12天前
|
Java 程序员 数据库连接
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
本文详细介绍了Java中的初始化块,包括静态初始化块和非静态初始化块的概念、执行顺序和实际应用场景。通过具体示例,帮助读者理解这两种初始化块的区别和使用场景,让面试官对你刮目相看。
22 0
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
|
12天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
20天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
1月前
|
设计模式 Java 测试技术
Java零基础-构造方法详解
【10月更文挑战第5天】Java零基础教学篇,手把手实践教学!
19 1
|
1月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
21 1
|
1月前
|
Java 编译器 C语言
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
39 2
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
33 1
|
1月前
|
Java
java构造方法时对象初始化,实例化,参数赋值
java构造方法时对象初始化,实例化,参数赋值
47 1
|
1月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
72 1
|
1月前
|
缓存 安全 Java
Java中 final、finally、finalize 有什么区别?
本文详细阐述了Java中`final`、`finally`和`finalize`的区别:`final`用于修饰类、方法和变量以表示不可变性;`finally`是用于确保在`try-catch`结构中无论是否发生异常都能执行的代码块;而`finalize`是`Object`类的方法,用于在对象被垃圾回收前执行清理工作,但在JDK 9中已被标记为弃用。
28 0
Java中 final、finally、finalize 有什么区别?