java-API之字节流

Posted 技术狂-CYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java-API之字节流相关的知识,希望对你有一定的参考价值。

字节流读取

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

InputStream抽象类及其子类

InputStream类是一个抽象类,是表示字节输入的所有类的超类/抽象类。源码如下:

public abstract class InputStream{}
public class FileInputStreamextends InputStream{}
// BufferedInputStream类继承于FilterInputStream类,FilterInputStream类继承于InputStream类,所以BufferedInputStream类还是InputStream类的子类
public class FilterInputStream extends InputStream{}
public class BufferedInputStream extends FilterInputStream{}

InputStream类的方法

虽然抽象类InputStream不能创建对象,但是它里面定义了一些共性的方法。

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

FileInputStream 子类

FileInputStream 从文件系统中的某个文件中获得输入字节。既然继承了父类InputStream,则就可以使用父类中定义的方法。此FileInputStream可以实例化对象。

class FileInputStream extends InputStream

创建对象

  • 构造1:FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
    InputStream file = new FileInputStream(new File("F:\ioTest\1.txt"));
  • 构造2:FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
InputStream file = new FileInputStream("F:\ioTest\1.txt");

FileInputStream类的测试

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

// 测试字节流读取的过程
//BufferedInputStream要比FileInputStream效率高,因为BufferedInputStream底层维护了一个byte[]缓冲数据,数组满了之后才给程序依次,减少了和程交互的次数,提高了程序的执行效率
//byte[] 数组默认尺寸是8192字节

public class Test4_FileInputStream {

    public static void main(String[] args) throws IOException {
//              通过FileInputStream类读取文件
//      FileInputStreamMethod(); 
    }
    
    /*
     * 通过 FileInputStream(File file)创建字节流对象
     * in.read() 字节流对象的读取方法,读取完是返回 -1
     */
    private static void FileInputStreamMethod() throws IOException {
//      1.创建字节读取流对象 两种创建对象的方式,都可以
        InputStream in = new FileInputStream(new File("F:\ioTest\1.txt"));  // 方法一
                // InputStream in = new FileInputStream("F:\ioTest\1.txt");  // 方法二
        
//      2.开始读取数据
        do {
            int data = in.read();
            if(data == -1) {  //当数据读取完毕时返回值为 -1
                in.close(); //关闭此输入流并释放与该流关联的所有系统资源。
                System.out.println("数据读完了");
                break;
            }
            System.out.println(data);
        }while(true);
    }
}

BufferedInputStream 子类

BufferedInputStream为另一个输入流添加一些功能,在创建 BufferedInputStream 时,会创建一个内部缓冲区数组,减少了和程序的交互次数,提高了程序的执行效率。这比运送东西,FileInputStream好比一个人开着小车送,BufferedInputStream好比一个人开着大卡车运送,肯定后者效率高。

private static int DEFAULT_BUFFER_SIZE = 8192; //默认大小8kb
private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
protected volatile byte buf[];

BufferedInputStream类创建对象

  • BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
InputStream in = new BufferedInputStream(new InputStream("F:\\ioTest\\1.txt"));

测试


import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class Test4_inputStream {
    public static void main(String[] args) throws IOException {
        BufferedInputStreamMethod(); //使用高效的BufferedInputStream(InputStream in)
    }

    /*
     * 使用具有缓存数组高效的BufferedInputStream类
     */
    private static void BufferedInputStreamMethod() throws IOException {
        // 1.创建字节读取对象
        InputStream in = new BufferedInputStream(new FileInputStream("F:\\ioTest\\1.txt"));
//      2.开始读取数据
        int data = 0;
        while((data = in.read()) != -1) {
            System.out.println(data);
        }
//      3.释放资源
        in.close();
    }
}

以上是关于java-API之字节流的主要内容,如果未能解决你的问题,请参考以下文章

IO流之字节流

Java文件流之字节流

I/O流之字节流

days19--IO流之字节流

Java基础:IO流之字节流和字符流

Java基础:IO流之字节流和字符流