欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中的I/O输入输出流,缓冲流

程序员文章站 2024-03-06 16:17:38
...

一.I/O流

I/O(Input/Output)流,即输入输出流,可以分为字节流与字符流、输入流与输出流、节点流与处理流。Java中的I/O流主要定义在java.io包中,在此包下定义了很多类,其中有4个类是*类,分别为InputStream和OutputStream,Reader和Writer.

  • InputStream和OutputStream是字节流,而Reader和Writer是字符流
  • InputStream和Reader是输入流,而OutputStream和Writer是输出流

二.字节流

1.字节流的概述
在计算机中,文本、图片、音频、视频等所有文件都是以二进制(字节)形式存在的,I/O流中针字节的输入/输出提供了以系列的流,统称为字节流,在JDK中,所有的字节输入流都继承自InputStream,所有的字节流都继承自OutputStream

Java中的I/O输入输出流,缓冲流InputStream被看成一个输入管道,OutputStream被看成一个输出管道,数据通过InputStream从源设备输入到程序,通过OutputStream从程序输出到目标设备,从而实现数据的传输。
2.案例演示
行读取键盘输入的数据

package net.yh.lesson24;
/**
 * 功能:行读取键盘输入的数据
 * 作者:王育红
 * 日期:2020年08月14日
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Examples403 {
    public static void main(String[] args) {
        int a;
        /**
         * system.in - 标准字节输入流
         * inputstreamreader 转换流
         * Bufferereader 缓冲流 提供了高效的读取方法
         */
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("a = ");
        try {
            a = Integer.parseInt(br.readLine());
            a = a + 150;
            System.out.println("a + 150 = " + a);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}


-运行结果
Java中的I/O输入输出流,缓冲流3.利用字节流读取文件
FileInputStream是InputStream的子类,它是文件字节输入流,用于读取文件中的数据。从文件读取数据是重复的操作,需要重复的语句来实现数据的持续读取。可以按照字节读取文件也可以按照字节数组来读取文件。

  • 创建in的txt文件,并输入两行字符内容
    Java中的I/O输入输出流,缓冲流
  • 说明:文件输入字节流read()方法返回是读取的字符对应的ASCII码值,要输出字符内容,很简单,只需要转成字符类型输出即可。
package net.yh.lesson24;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 功能:利用FileInputStream读取文件
 * 作者:王育红
 * 日期:2020年08月14日
 */
public class Example2404 {
    public static void main(String[] args) {
        try {
            //创建文件字节输入流对象
            FileInputStream fis = new FileInputStream("src/net/yh/lesson24/in");
        //通过while循环按字节读取文件
            int c = 0;
            while ((c = fis.read()) !=-1){
                System.out.print((char)c);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • 运行结果
    Java中的I/O输入输出流,缓冲流

三、字节流的缓冲区

1.概述

利用文件字节流可以实现文件拷贝,但是一个字节一个字节地读写,效率十分低下,在文件拷贝过程中,通过一字节形式逐个拷贝,效率也非常低。可以定义一个字节数组缓冲区,在拷贝文件时,就可以一次性读取多个字节的数据。

2.案例演示:采用文件字节与字节流缓冲区实文件拷贝

  • 把文件student.jpg拷贝到net.dsj.test1
    Java中的I/O输入输出流,缓冲流
  • 创建文件Example01
package net.dsj.test1;

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

/**
 * 功能:拷贝文件
 *      采用文件字节流和字节流缓冲区
 * 作者:王育红
 * 日期:2020年08月05日
 */
public class Example01 {
    public static void main(String[] args) throws Exception {
        //创建文件字节输入流
        FileInputStream fis = new FileInputStream("src/net/dsj/test1/student.jpg");
        //创建文件字节输出流
        FileOutputStream fos = new FileOutputStream("src/net/dsj/test/target.jpg");

        //获取开始拷贝文件的系统时间
        long startTime = System.currentTimeMillis();
        System.out.println(startTime);
        //定义字节数组作为缓冲区
        byte[] buffer = new byte[1024];
        //读取源文件,写入目标文件
        int len = 0;
        //得到实际读取到的字节数 读到最后返回-1
        //循环读取
        while ((len = fis.read(buffer)) != -1){
            fos.write(buffer,0,len);
        }

        //获取结束拷贝的系统时间
        long endTime = System.currentTimeMillis();
        System.out.println(endTime);

        //输出拷贝文件耗费时间
        System.out.println("拷贝文件耗费时间:" + (endTime - startTime) + "毫秒");

    }
}

-查看运行结果
Java中的I/O输入输出流,缓冲流

四、字节缓冲流

1.概述

除了定义字节缓冲区来提高文件拷贝的效率外,IO中还提供了两个字节缓冲流提高文件拷贝效率:BufferedInputStream和BuffereOutputStream。

2.案例演示:采用字节缓冲流但不采用字节缓冲区拷贝文件

package net.dsj.test1;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;


/**
 * 功能:拷贝文件
 *       采用字节缓冲流,不用字节缓冲区
 * 作者:王育红
 * 日期:2020年08月06日
 */
public class Example02 {
    public static void main(String[] args) throws Exception {
        //创建缓冲字节输入流
        BufferedInputStream bis = new BufferedInputStream(
             new FileInputStream("src/net/dsj/test1/student.jpg"));
        //创建缓冲字节输出流
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("src/net/dsj/test/t.jpg"));

        //获取开始拷贝文件的时间
        long startTime = System.currentTimeMillis();

        //读取源文件,写入目标文件
        int len = 0;
        while ((len = bis.read() ) !=-1){
            bos.write(len);
        }
        long endTime = System.currentTimeMillis();

        //获取结束拷贝文件系统时间
        System.out.println("拷贝文件耗费时间:" + (endTime-startTime) + "毫秒");
    }
}

  • 说明:缓冲流对象bis和bos内部都定义了一个大小为8192的字节数组,当调用read()和write()时,首先将读写的数据存入到定义好的字节数组,然后将字节数组,然后将字节数组的数据一次性读到文件中,从而有效的提高了数据的读写效率。
相关标签: Java java