• Java InputStream.read()如何读取数据流字节并存储到缓冲区数组呢?


    转自:

    http://www.java265.com/JavaCourse/202111/1918.html

    下文笔者讲述java代码读取数据流字节及存储的方法分享,如下所示:

    实现思路:
        我们可借助以下方法,即可实现数据流读取
        public abstract int read()
        public int read(byte[] b)
        public int read(byte[] b,int off,int len)
     参数说明
       b:存储读入数据的缓冲区;
       off:数组b中将写入数据的初始偏移量
       len:要读取的最大字节数
    
    返回值说明
       读入缓冲区的总字节数
       当到达流末尾而不再有数据可用,则返回-1
    
    异常抛出:
       IOException:当不是因为流位于文件末尾而无法读取第一个字节
        当输入流已关闭;如果发生其他 I/O 错误。
    NullPointerException:当b为null
    IndexOutOfBoundsException:当off为负数,则len为负数,或len为b.length-off
    

    例:

    read()这个方法是对这个流一个一个字节的读,返回的int就是这个字节的int表示方式

    public static void main(String[] args){
    InputStream in = new FileInputStream("d:\\java265.txt");
    byte[] arr = new byte[15];
    while( in.available() != 0)
    {
        for(int i = 0; i & lt; 15; i++)
        {
            arr[i] = (byte) in .read();
        }
    }
    String str = new String(arr, "utf-8");
    System.out.println(str); 
              in.close();
    }
    /*
    以上代码从输入流中读取数据的下一个字节
     返回0到255范围内的int字节值
    当读取已经到达流末尾而没有可用的字节,则返回-1
    在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞
    */
    

    .read(byte[] b) 这个方法是先规定一个数组长度
    将这个流中的字节缓冲到数组b中
    返回的这个数组中的字节个数
    这个缓冲区没有满的话,则返回真实的字节个数
    到未尾时都返回-1

    public static void main(String[] args){
    InputStream in = new FileInputStream("d:\\java265.txt");
    byte[] bytes = new byte[1024];
    int b;
    while((b = in.read(bytes)) != -1)
    {
        String s = new String(bytes, "utf-8");
        System.out.println(s);
    } 
        in.close();
    }
    /*
    从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
    以整数形式返回实际读取的字节数
    在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞
    当b的长度为0,则不读取任何字节并返回 0
     否则,尝试读取至少一个字节
    当流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中
     将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中
     依次类推。读取的字节数最多等于b 的长度
     设 k 为实际读取的字节数;这些字节将存储在 b[0] 到 b[k-1] 的元素中,不影响 b[k] 到b[b.length-1] 的元素
    */
    

    read(byte[] b, int off, int len) 此方法其实就是多次调用了read()方法

    public static void main(String[] args){
    InputStream in = new FileInputStream("d:\\java265.txt");
    byte[] bytes = new byte[ in .available()];
    int z;
    while((z = in.read(bytes, 0, bytes.length)) != -1)
    {
        String s = new String(bytes, "utf-8");
        System.out.println(s);
    } 
           in.close()
    }
    /*
    1.将输入流中最多 len 个数据字节读入 byte 数组。
       尝试读取 len 个字节,但读取的字节也可能小于该值
         以整数形式返回实际读取的字节数。 
    2.在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。 
    3.如果 len 为 0,则不读取任何字节并返回 0
       否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;
       否则,至少读取一个字节并将其存储在 b 中。 
    4.将读取的第一个字节存储在元素 b[off] 中,下一个存储在 b[off+1] 中,依次类推。
       读取的字节数最多等于 len。设k为实际读取的字节数;
        这些字节将存储在 b[off] 到 b[off+k-1] 的元素中,不影响 b[off+k] 到 b[off+len-1] 的元素 
    */
  • 相关阅读:
    02-SpringBoot基础
    网安入门18-XSS(靶场实战)
    多媒体技术1-颜色在计算机中的表示
    Nginx配置反向代理解决跨域问题
    开关、电机、断路器、电热偶、电表接线图大全
    为什么要学习GoF设计模式?
    [附源码]SSM计算机毕业设计江苏策腾智能科技公司人事管理系统JAVA
    【计算机网络】介质访问控制
    SpringCloud-MQ消息队列
    PHP 行事准则:allow_url_fopen 与 allow_url_include
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/126297466