什么是字节流,缓冲字节流及其案例

字节流

1.字节流:

(1)字节输入流:InputStream,这个流是一个抽象类,我们在使用时使用FileInputStream类实现文件的输入
(2)字节输出流:OutputStream,这个流是一个抽象类,我们在使用时使用FileOutputStream类实现文件的输出
(3)所有流操作都是在字节流的基础上进行的,通过字节流读取到原始数据,然后交给其他流进行处理
(4)使用字节输入输出流可以操作字符文件,但比较麻烦,需要进行转码.如果操作字符文件建议使用字符流
(5)使用字节流更适合操作图片、音频、视频、压缩包等二进制文件,字符文件也可以操作但不建议

2.带有缓冲区的字节流:

(1)带有缓冲区的字节流属于包装流,对原始流的包装流
(2) Java的IO流提供了一个带有缓冲区的字节输入流(BufferedInputStream)、带有缓冲区的字节输出流(BufferedOutputStream)
(3)由于带有缓冲区的流是对原始流的包装流,所以要使用带有缓冲区的流必须在原始流的基础上使用
(4)缓冲区流是线程安全的,在并发情况可以保证数据的准确性,在缓冲流中使用synchronized同步锁实现

案例

1.字节输出流

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Scanner;

public class 字节输出流 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        Scanner scanner = new Scanner(System.in);
        /**
         * 创建字节输出流对象,并指定输出的目标文件
         * 如果目标文件不存在则自动创建该文件,如果存在则替换该文件
         * 当第二个参数设置为true时,表示向文件中追加内容(如果文件不存在依然会创建新文件)
         */

        OutputStream outputStream = new FileOutputStream("f:/abcx.txt",true);
        //循环向文件输出内容
        while(true){
    
    
            System.out.print("请输入内容:");
            String str = scanner.next();
            if(str.equals("exit")){
    
    
                break;//退出
            }
            //将字符串转换为字节数组
            byte[] buf = str.getBytes();
            outputStream.write(buf);
            //刷新流
            outputStream.flush();
        }

        //释放资源
        outputStream.close();
    }
}

2.字节输入流

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

/**
 * 字节输入流实例-将磁盘上文件中的数据读入到程序中
 */
public class 字节输入流 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        /**
         *  创建输入流对象,并指定要读取的文件
         */

        InputStream inputStream = new FileInputStream("f:/mysql5.7解压缩安装.txt");
        //读取一个字节,该字节为一个整数
        /*int num = inputStream.read();*/
        //声明一个用于存储读取字节的缓冲区(字节数组)
        byte[] buf = new byte[1024];
        /**
         * 读取数据,读取缓冲区指定大小的数据
         * 返回实际读取字节的数量(长度),如果未读取到数据则返回-1
         */
        int len = - 1;
        //循环读取文件中的数据,当len的值为-1时表示读取结束
        while((len=inputStream.read(buf,0,buf.length))!=-1){
    
    
            /**
             * 将字节数组中的字节转换字符串
             * 指定转换的起始下标,及转换长度
             */

            String str = new String(buf,0,len);

            System.out.println(str);
        }


        inputStream.close();//关闭输入流

    }
}

3.文件复制

import java.io.*;

public class 文件复制 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        //创建文件输入流对象,并指定源文件
        InputStream inputStream = new FileInputStream("e:/maven-lib.rar");
        //创建文件输出流对象,并指定目标文件
        OutputStream outputStream = new FileOutputStream("f:/maven-lib.rar");
        /**
         * 创建字节数组做为缓冲区
         * 可以通过设置缓冲区的大小,提高效率,设置缓冲区时根据实际情况设置,不是越大越好
         */

        byte[] buf = new byte[1024*1024*5];
        //表示输入流读取的字节数
        int len = -1;
        //获得开始复制的毫秒数
        long start = System.currentTimeMillis();
        //使用while循环读取文件中的数据并写出到目标文件
        while((len=inputStream.read(buf,0,buf.length)) != -1){
    
    
            //将读到的数据写出到磁盘指定的文件中
            outputStream.write(buf,0,len);
            //刷新输出流
            outputStream.flush();
        }

        //获得复制复制结束时的毫秒数
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-start)+"毫秒");
        //关闭流
        inputStream.close();
        outputStream.close();
    }
}

4.文件复制_使用带有缓冲区的字节流实现

import java.io.*;

public class 文件复制_使用带有缓冲区的字节流实现 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        //创建文件输入流对象,并指定源文件
        InputStream inputStream = new FileInputStream("e:/maven-lib.rar");
        //创建文件输出流对象,并指定目标文件
        OutputStream outputStream = new FileOutputStream("f:/maven-lib.rar");
        //使用BufferedInputStream和BufferedOutputStream对原始的字节输入输出流进行包装
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream,1024*1024*5);
        //创建带有缓冲区的字节输出流
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
        /**
         * 创建字节数组做为缓冲区
         * 可以通过设置缓冲区的大小,提高效率,设置缓冲区时根据实际情况设置,不是越大越好
         */

        byte[] buf = new byte[1024];
        //表示输入流读取的字节数
        int len = -1;
        //获得开始复制的毫秒数
        long start = System.currentTimeMillis();
        //使用while循环读取文件中的数据并写出到目标文件
        while((len=bufferedInputStream.read(buf,0,buf.length)) != -1){
    
    
            //将读到的数据写出到磁盘指定的文件中
            bufferedOutputStream.write(buf,0,len);
            //刷新输出流
            bufferedOutputStream.flush();
        }

        //获得复制复制结束时的毫秒数
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-start)+"毫秒");
        //关闭流
        inputStream.close();
        outputStream.close();
        bufferedInputStream.close();
        bufferedOutputStream.close();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_52682014/article/details/127644377
今日推荐