java基础 之 InputStream

InputStream的理解概述:

Input含义为进入内存,即从硬盘中读取数据,原理为:

java程序-->JVM-->OS-->OS读取数据的方法-->读取文件(硬盘-->内存)


InputStream的使用概述:

  •  java.io.InputStream:字节输入流,此抽象类是表示字节输入流的所有类的超类。

    定义了所有子类共性的方法:

    public abstract int read()从输入流中读取数据的下一个字节。

    public int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。

    public void close() 关闭此输入流并释放与该流关联的所有系统资源。

  • InputStream的子类之一FileInputStream(文件字节输入流),作用是把硬盘文件中的数据,读取到内存中使用。

    定义了构造方法:

    public FileInputStream(String name)通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

    public FileInputStream(File file) 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。

  • 使用数组读取,每次读取多个字节,减少了系统间的IO操作次数,从而提高了读写的效率,建议开发中使用


InputStream的测试代码:

import java.io.FileInputStream;
import java.io.IOException;
    
public class InputStreamTest {
    public static void main(String[] args) throws IOException {
        show1();
   }
  /**show1():从文件中读取单个字节
   * 1.创建FileInputStream对象,构造方法中绑定要读取的数据源
   * 2.使用FileInputStream对象中的方法read,读取文件
   * 3.释放资源
   */
   public void show1() throws IOException {  
        //1.
        /* 构造方法的作用:
            1.会创建一个FileInputStream对象
            2.会把FileInputStream对象指向构造方法中要读取的文件的第一个字节
         */
        FileInputStream fis = new FileInputStream("09_IOAndProperties\\c.txt"); //文件内容为abc
        //FileInputStream fis = new FileInputStream(new File("09_IOAndProperties\\c.txt"));
        
        //2.int read()通过JVM,再通过OS,读取文件中的指针指向的字节并提升到int返回,连续读取时指针依次向后移,读取到文件的末尾返回-1
        len = fis.read();
        System.out.println(len);//97 a
        len = fis.read();
        System.out.println(len);// 98 b
        len = fis.read();
        System.out.println(len);//99 c
        len = fis.read();
        System.out.println(len);//-1
       /*
        int len = 0; //记录读取到的字节
        while((len = fis.read())!=-1){
            System.out.print((char)len);//abc
        }
        */
 
        //3.
        fis.close();
    }
 
   /**show2():从文件中读取字节数组
    *1.创建FileInputStream对象,构造方法中绑定要读取的数据源
    *2.使用FileInputStream对象中的方法read读取文件
    *3.关闭资源
    */
    public void show2() throws IOException {
        //1.
        FileInputStream fis = new FileInputStream("09_IOAndProperties\\b.txt");//文件内容为ABCDE
        
        //2.
        //int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
        byte[] bytes = new byte[2]; // byte[]起到缓冲作用,存储每次读取到的多个字节,数组的长度一把定义为1024(1kb)或者1024的整数倍
        //
        //不同于读取单个字节int len记录每次读取的有效字节个数
        int len = fis.read(bytes); 
        System.out.println(len);//2
        //System.out.println(Arrays.toString(bytes));//[65, 66]
        //
        //String(byte[] bytes) :把字节数组转换为字符串
        System.out.println(new String(bytes));//AB
        len = fis.read(bytes);
        System.out.println(len);//2
        System.out.println(new String(bytes));//CD
        len = fis.read(bytes);
        System.out.println(len);//1
        //
        //String(byte[] bytes, int offset, int length) 把字节数组的一部分转换为字符串 offset:数组的开始索引 length:转换的字节个数
        System.out.println(new String(bytes,0,len));
        //System.out.println(new String(bytes)); ED 错于当数组容量大于剩余字节时,上次读取的数据没有被完全替换而重复读取,所以要通过 len ,获取有效的字节.
        len = fis.read(bytes);
        System.out.println(len);//-1       
        /*
        byte[] bytes = new byte[1024];
        int len = 0;
        while((len = fis.read(bytes))!=-1){
            //
            //当数组容量大于读取内容时,直接转换成字符串会生成大量空格,所以只转换有效字节
            System.out.println(new String(bytes,0,len));
        }
        */
 
        //3.
        fis.close();
    }
}


原文链接:https://blog.csdn.net/m0_46523928/article/details/118784947