JAVA-----IO篇二(FileOutputStream以及文件拷贝)

IO篇之FileOutputStream

这篇文章主要对该类作为字节输出流的代表进行学习理解。与FileInputStream有一点区别

输入流最后一定要close,输出流最后一定要flush。

因此输出流的两个最为重要的方法是wirte(),以及flush(),wirte方法中即可以传1个ASCI码值,也可以传入byte数组,也能够自定义传入byte数组的长度。
具体例子:在a.txt文件中写入abcd。

import java.io.FileOutputStream;

/**
 * @author cz
 * @date 2020/6/12/012
 * 文件字节输出流,负责写
 **/
public class FileOutputStreamTest {
    public static void main(String[] args) {
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream("F:\\a.txt");  
            //如果传入的文件不存在,会自动新建
//            fileOutputStream.write(97);   // 传入字节的ASCI值,会将原文件的内容请空,只写入a
            byte[] b = {'a','b',99,100};    //abcd,即使写数字会当做ASCI值进行处理
            fileOutputStream.write(b);
            //  fileOutputStream.write(b,0,2); 会写入ab
//            写完之后一定要进行刷新
            fileOutputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

注意:这三种写入方式,都会将原文件的内容进行清空!谨慎使用。

在创建fileOutputStream对象时,有多种构造方法,源码中该类存在private final boolean append;实现是否追加。只使用文件名进行创建对象时,默认append属性为false。即内容不以追加的方式进行添加。

而如果不希望清空,而是以在文件内容的末尾进行追加的方式,也很简单。 fileOutputStream = new FileOutputStream(“F:\a.txt”,true);

只输入abc也不符合常用使用规范,现在输入字符串“我是中国人”。
只需要将String转为btye数组即可。

String s = "我是中国人";
            byte[] b = s.getBytes();
            fileOutputStream.write(b);
//            写完之后一定要进行刷新
            fileOutputStream.flush();

当对fileInputStream以及fileOutputStream 有一定的理解后,就可以进行文件的拷贝工作。这个还是比较有意思的功能实现点

要点有三:
1.使用字节流进行拷贝,这样就不受文件类型限制,声音、视频、文本、等等都可以。
2.当拷贝完,输出流一定要flush。
3.两个流应该分开关闭,这样当某一流出现异常时,另一流还能正常关闭。
4.这里只能拷贝一个文件,不能进行文件目录的拷贝。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author cz
 * @date 2020/6/12/012
 * 文件拷贝
 * 使用FileInput以及FileOutput相结合完成文件拷贝
 * 拷贝的过程其实相当于一边读,一边写。
 * 使用字节流进行拷贝时,文件的类型不容易受到限制
 **/
public class FileOutputStreamTest {
    public static void main(String[] args) {
       FileOutputStream fileOutputStream = null;
       FileInputStream fileInputStream = null;

        try {
//            创建一个输入流对象
            fileInputStream = new FileInputStream("F:\\javastudy\\32\\part01-基础(1-25天)\\WEB01_HTML\\WEB01_HTML\\视频\\01_javaWEB课程体系结构介绍_.flv");

//            创建一个输出流对象
            fileOutputStream = new FileOutputStream("F:\\01_javaWEB课程体系结构介绍_.flv",true);
//            一次最多拷贝一兆,一边读取,一边写
            byte[] bytes = new byte[1024*1024];
            int read = 0;  // 当read等于-1时,证明该文件已经被全部读取完毕
            while ((read=fileInputStream.read(bytes))!=-1){
                fileOutputStream.write(bytes,0,read);    //读多少就写多少
            }
//注意刷新
            fileOutputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
//            输出、输出流的try catch要分开,不应该一起trycatch,防止一个流出现异常时,另一个流无法关闭
            if (fileInputStream!=null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }if (fileOutputStream!=null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

如果对您有用欢迎点赞、留言,发表看法。
转发请注明出处。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章