当前位置: 代码迷 >> 综合 >> 十七、JAVA中的字节流FileOutputStream、BufferedOutputStream和FileInputStream、BufferedInputStream
  详细解决方案

十七、JAVA中的字节流FileOutputStream、BufferedOutputStream和FileInputStream、BufferedInputStream

热度:36   发布时间:2023-12-17 02:27:49.0

1.字节流概述

专门用来读写 数据的,而且是各种类型 的数据. 被底层的一些工具类大量的使用.

2.继承结构

--读取InputStream -- 父类是一个抽象类,不能new,只学习共性方法-- FileInputStream -- 子类学习怎么new,方法都是继承来的 -- BufferedInputStream -- 子类学习怎么new,方法都是继承来的 
--写出OutputStream  -- 父类是一个抽象类,不能new,只学习共性方法-- FileOutputStream   -- 子类学习怎么new,方法都是继承来的 -- BufferedOutputStream -- 子类学习怎么new,方法都是继承来的 

3.学习方法

 1.一般父类都会做程序设计,可能设计为抽象类或者接口,都不能new,学习父类的共性方法2.一般子类提供的方法,都是继承自父类的,或者重写了父类的,方法不值得研究,学习子类怎么new就行

4. 字节流读取

字节流是由字节组成的,字符流是由字符组成的. Java里字符由两个字节组成.字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据。

流式传输主要指将整个音频和视频及三维媒体等多媒体文件经过特定的压缩方式解析成一个个压缩包,由视频服务器向用户计算机顺序或实时传送。在采用流式传输方式的系统中,用户不必像采用下载方式那样等到整个文件全部下载完毕,而是只需经过几秒或几十秒的启动延时即可在用户的计算机上利用解压设备对压缩的A/V、3D等多媒体文件解压后进行播放和观看。此时多媒体文件的剩余部分将在后台的服务器内继续下载。

4.1 InputStream抽象类

此抽象类是表示字节输入流的所有类的超类/抽象类。

常用方法:

abstract  int read()从输入流中读取数据的下一个字节。int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。int read(byte[] b, int off, int len)将输入流中最多 len 个数据字节读入 byte 数组。void close()关闭此输入流并释放与该流关联的所有系统资源。

4.2 FileInputStream子类

直接插在文件上,直接读取文件数据。

创建对象

FileInputStream(File file)通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。FileInputStream(String pathname)通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

4.3 BufferedInputStream子类

BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组(默认8M大小)。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。

创建对象

BufferedInputStream(InputStream in)创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

5. 字节流写出

5.1 OutputStream抽象类

此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。

常用方法:

void close()关闭此输出流并释放与此流有关的所有系统资源。void flush()刷新此输出流并强制写出所有缓冲的输出字节。void write(byte[] b)将 b.length 个字节从指定的 byte 数组写入此输出流。void write(byte[] b, int off, int len)将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。abstract  void write(int b)将指定的字节写入此输出流。

5.2 FileOutputStream子类

直接插在文件上,直接写出文件数据

创建对象:

FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流。FileOutputStream(File file)创建一个向指定 File 对象表示的文件中写入数据的文件输出流。FileOutputStream(File file, boolean append) –追加创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

5.3 BufferedOutputStream子类

该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

创建对象

BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

6. 案例字节流读写

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;public class Test {
    public static void main(String[] args) throws Exception {
    method1();//字节读取method2();//字节写出}private static void method2() throws Exception {
    long s = System.currentTimeMillis();OutputStream out = new FileOutputStream(new File("D:\\teach\\a.txt"));for(int i = 48 ; i < 1000000; i++) {
    out.write(i);}s = System.currentTimeMillis() - s;System.out.println(s + "--");//3484long ss = System.currentTimeMillis();OutputStream out2 = new BufferedOutputStream(new FileOutputStream(new File("D:\\teach\\a2.txt")));for(int i = 48 ; i < 1000000; i++) {
    out2.write(i);}ss = System.currentTimeMillis() - ss;System.out.println(ss + "==");//54out.close();out2.close();}private static void method1() throws Exception {
    long s = System.currentTimeMillis();InputStream in = new FileInputStream("D:\\teach\\1.jpg");int b = 0;while ((b = in.read()) != -1) {
    // System.out.println(b);}s = System.currentTimeMillis() - s;System.out.println(s + "--");// 7515long ss = System.currentTimeMillis();InputStream in2 = new BufferedInputStream(new FileInputStream("D:\\teach\\1.jpg"));int b2 = 0;while ((b2 = in2.read()) != -1) {
    // System.out.println(b2);}ss = System.currentTimeMillis() - ss;System.out.println(ss + "==");// 32in.close();in2.close();}
}

7.字节流读写效率图:

在这里插入图片描述

  相关解决方案