IO 字节 缓冲流 总结 复制文件

  • IO概述

        在程序中,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上。

    当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。

    当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。

因此我们把这种输入和输出动作称为IO操作。

  • IO流分向

按照流向分:输入流与输出流,每个IO流对象均要绑定一个IO资源

分类关系如下:

字节输入流 InputStream 抽象类

FileInputStream 操作文件的字节输入流

字节输出流 OutputStream 抽象类

FileOutputStream 操作文件的字节输出流

按照传输方式:分为字节流和字符流

    字符流  按照字符的方式读写

    字节流  按照字节的方式读写

        在数据传输过程中,一切数据(文本、图像、声音等)最终存储的均为一个个字节,即二进制数字。所以数据传输过程中使用二进制数据可以完成任意数据的传递。

        我们向一个文件中存储一定的数据(一些数字),如果使用文本方式打开,则会以文本的方式解释数据。如果以视频的方式打开,则会以视频的方式解释数据。音频、可行执行文件等亦是如此。所以,在文件传输过程中,我们要时刻明确,传输的始终为二进制数据。


  • 字节流
  1. 字节输出流OutputStream

        OutputStream此抽象类,是表示输出字节流的所有类的超类。操作的数据都是字节,定义了输出字节流的基本共性功能方法。

  2. 输出流中定义都是写write方法,如下图:


  • FileOutputStream类

        OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。

        FileOutputStream类,即文件输出流,是用于将数据写入 File的输出流。


  • FileOutputStream将数据写到文件中,代码演示:

        publicstaticvoidmain(String[] args) throws IOException {

            //需求:将数据写入到文件中。

            //创建存储数据的文件。

            File file = new File("c:\\file.txt");

            //创建一个用于操作文件的字节输出流对象。一创建就必须明确数据存储目的地。

            //输出流目的是文件,会自动创建。如果文件存在,则覆盖。

            FileOutputStream fos = new FileOutputStream(file);

            //调用父类中的write方法。

            byte[] data = "abcde".getBytes();

            fos.write(data);

            //关闭流资源。

            fos.close();

        }

    我们直接new FileOutputStream(file)这样创建对象,写入数据,会覆盖原有的文件,那么我们想在原有的文件中续写内容怎么办呢?

    继续查阅FileOutputStream的API。发现在FileOutputStream的构造函数中,可以接受一个boolean类型的值,如果值true,就会在文件末位继续添加。

  • 字节输入流InputStream

    通过前面的学习,我们可以把内存中的数据写出到文件中,那如何想把内存中的数据读到内存中,我们通过InputStream可以实现。InputStream此抽象类,是表示字节输入流的所有类的超类。,定义了字节输入流的基本共性功能方法。

    int read():读取一个字节并返回,没有字节返回-1.

    int read(byte[]): 读取一定量的字节数,并存储到字节数组中,返回读取到的字节数。

    FileInputStream类

    InputStream有很多子类,其中子类FileInputStream可用来读取文件内容。

    FileInputStream 从文件系统中的某个文件中获得输入字节。

    FileInputStream类读取数据read方法

    在读取文件中的数据时,调用read方法,实现从文件中读取数据

    从文件中读取数据,代码演示:

    public class FileInputStreamDemo {

        publicstaticvoidmain(String[] args) throws IOException {

            File file = new File("c:\\file.txt");

            //创建一个字节输入流对象,必须明确数据源,其实就是创建字节读取流和数据源相关联。

            FileInputStream fis = new FileInputStream(file);

            //读取数据。使用read();一次读一个字节。

            int ch = 0;

            while((ch=fis.read())!=-1){

                System.out.println("ch="+(char)ch);

            }

            // 关闭资源。

            fis.close();

        }

    }

    读取数据read(byte[])方法

    在读取文件中的数据时,调用read方法,每次只能读取一个,太麻烦了,于是我们可以定义数组作为临时的存储容器,这时可以调用重载的read方法,一次可以读取多个字符。

    public class FileInputStreamDemo2 {

        publicstaticvoidmain(String[] args) throws IOException {

            /*

             * 演示第二个读取方法,read(byte[]);

             */

            File file = new File("c:\\file.txt");

            // 创建一个字节输入流对象,必须明确数据源,其实就是创建字节读取流和数据源相关联。

            FileInputStream fis = new FileInputStream(file);       

            //创建一个字节数组。

            byte[] buf = new byte[1024];//长度可以定义成1024的整数倍。    

            int len = 0;

            while((len=fis.read(buf))!=-1){

                System.out.println(newString(buf,0,len));

            }

            fis.close();

        }

    }

  • 复制文件

    publicstaticvoidmain(String[] args) throws IOException {

        File srcFile = new File("c:\\YesDir\test.JPG");

        File destFile = new File("copyTest.JPG");

        // 明确字节流输入流和源相关联,输出流和目的关联。

        FileInputStream fis = new FileInputStream(srcFile);

        FileOutputStream fos = new FileOutputStream(destFile);

        //定义一个缓冲区。

        byte[] buf = new byte[1024];

        int len = 0;

        while ((len = fis.read(buf)) != -1) {

            fos.write(buf,0, len);// 将数组中的指定长度的数据写入到输出流中。

        }

        // 关闭资源。

        fos.close();

        fis.close();

    }


  • 缓冲流

        字节流与字符流读取数据量大的文件时,读取的速度会很慢,很影响我们程序的效率,那么,我想提高速度,怎么办?

Java中提高了一套缓冲流,它的存在,可提高IO流的读写速度

缓冲流,根据流的分类分类字节缓冲流与字符缓冲流。


  1. 字节缓冲流

字节缓冲流根据流的方向,共有2个

写入数据到流中,字节缓冲输出流 BufferedOutputStream

读取流中的数据,字节缓冲输入流 BufferedInputStream

它们的内部都包含了一个缓冲区,通过缓冲区读写,就可以提高了IO流的读写速度

复制单级文件夹

/*

 * 数据源:e:\\demo

 * 目的地:e:\\test

 * 分析:

 *       A:封装目录

 *       B:获取该目录下的所有文本的File数组

 *       C:遍历该File数组,得到每一个File对象

 *       D:把该File进行复制

 */

publicclass CopyFolderDemo {

    publicstaticvoid main(String[] args) throws IOException {

        // 封装目录

        FilesrcFolder = new File("e:\\demo");

        // 封装目的地

        FiledestFolder = new File("e:\\test");

        // 如果目的地文件夹不存在,就创建

        if (!destFolder.exists()) {

            destFolder.mkdir();

        }

        // 获取该目录下的所有文本的File数组

        File[]fileArray = srcFolder.listFiles();

        // 遍历该File数组,得到每一个File对象

        for (File file : fileArray) {

            // System.out.println(file);

            // 数据源:e:\\demo\\e.mp3

            // 目的地:e:\\test\\e.mp3

            String name = file.getName(); // e.mp3

            File newFile = new File(destFolder, name); //e:\\test\\e.mp3

            copyFile(file,newFile);

        }

    }

    private static void copyFile(File file, FilenewFile) throws IOException {

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream( file));

        BufferedOutputStreambos = new BufferedOutputStream(

                new  FileOutputStream(newFile));

 

        byte[] bys = new byte[1024];

        int len = 0;

        while ((len = bis.read(bys)) !=-1) {

            bos.write(bys, 0, len);

        }

        bos.close();

        bis.close();

    }

}


猜你喜欢

转载自blog.csdn.net/wzc1991520/article/details/80192132