Java InputStream.read()读取数据流字节,存储到缓冲区数组_java inputstream read-程序员宅基地

技术标签: Java  InputStream  

定义

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

 

区别

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

从输入流中读取数据的下一个字节,返回0到255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

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

从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。读取的字节数最多等于b 的长度。设 k 为实际读取的字节数;这些字节将存储在 b[0] 到 b[k-1] 的元素中,不影响 b[k] 到b[b.length-1] 的元素。

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

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] 的元素。 

5. 在任何情况下,b[0] 到 b[off] 的元素以及 b[off+len] 到 b[b.length-1] 的元素都不会受到影响。 

6. 类 InputStream 的 read(b,off,len) 方法重复调用方法 read()。如果第一次这样的调用导致 IOException,则从对 read(b,off,len) 方法的调用中返回该异常。如果对 read() 的任何后续调用导致 IOException,则捕获该异常并将其视为到达文件末尾;到达该点时读取的字节存储在 b 中,并返回发生异常之前读取的字节数。在已读取输入数据 len 的请求数量、检测到文件结束标记、抛出异常前,此方法的默认实现将一直阻塞。建议子类提供此方法更为有效的实现。

 

实战

package com.ly.dao;

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

/**
 * liyang 2020-10-08
 * 使用流读取文本中的内容
 */
public class MyTest {
    public static void main(String[] args) throws IOException {
        // 你自己文件的绝对地址
        File file = new File("/Users/Young/Desktop" +
                "/study-code/test/src/main/java/mytest.txt");

        // InputStream的三个read方法的应用
        // 方法1:按照范围读,但是实现了一次性读完,范围即使整个文件范围
        InputStream input = new FileInputStream(file);
        byte[] b = new byte[(int) file.length()]; // 计算文件的字节长度
        int len = input.read(b, 0, b.length); // 读取指定的字节数量到数组
        System.out.println(new String(b));
        System.out.println("file.length" + file.length());
        System.out.println(b.length == len);
        System.out.println(len);
        input.close(); // 关闭流

        System.out.println();
        // 方法2:一次性读完
        InputStream input2 = new FileInputStream(file);
        byte[] b2 = new byte[700];  // 文件629个字节
        int len2 = input2.read(b2); // 一次性读取,返回总共读取的字节数
        System.out.println(new String(b2, 0, len));
        System.out.println(len2);
        input2.close();

        System.out.println();
        // 方法3:一个字节一个字节读
        InputStream input3 = new FileInputStream(file);
        byte[] b3 = new byte[(int) file.length()];
        for (int i = 0; i < b3.length; i++) {
            b3[i] = (byte) input3.read(); // 返回的是读取的数据,逐个字节读取内容
        }
        System.out.println(new String(b3, "utf-8")); // 默认就是utf-8,因此这里可以不写
        System.out.println(b3.length);
        input3.close();
    }
}

mytest.txt

君不见,黄河之水天上来,奔流到海不复回。
君不见,高堂明镜悲白发,朝如青丝暮成雪!
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
岑夫子,丹丘生,将进酒,杯莫停。
与君歌一曲,请君为我倾耳听。
钟鼓馔玉不足贵,但愿长醉不复醒。
古来圣贤皆寂寞,惟有饮者留其名。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。
五花马、千金裘,呼儿将出换美酒,与尔同销万古愁!

结果:

君不见,黄河之水天上来,奔流到海不复回。
君不见,高堂明镜悲白发,朝如青丝暮成雪!
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
岑夫子,丹丘生,将进酒,杯莫停。
与君歌一曲,请君为我倾耳听。
钟鼓馔玉不足贵,但愿长醉不复醒。
古来圣贤皆寂寞,惟有饮者留其名。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。
五花马、千金裘,呼儿将出换美酒,与尔同销万古愁!
629file.length
true
629

君不见,黄河之水天上来,奔流到海不复回。
君不见,高堂明镜悲白发,朝如青丝暮成雪!
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
岑夫子,丹丘生,将进酒,杯莫停。
与君歌一曲,请君为我倾耳听。
钟鼓馔玉不足贵,但愿长醉不复醒。
古来圣贤皆寂寞,惟有饮者留其名。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。
五花马、千金裘,呼儿将出换美酒,与尔同销万古愁!
629

君不见,黄河之水天上来,奔流到海不复回。
君不见,高堂明镜悲白发,朝如青丝暮成雪!
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
岑夫子,丹丘生,将进酒,杯莫停。
与君歌一曲,请君为我倾耳听。
钟鼓馔玉不足贵,但愿长醉不复醒。
古来圣贤皆寂寞,惟有饮者留其名。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。
五花马、千金裘,呼儿将出换美酒,与尔同销万古愁!
629

Process finished with exit code 0

参考资料:

http://www.51gjie.com/java/700.htm

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41876385/article/details/108965795

智能推荐

GPT是否解决了信息抽取问题?-程序员宅基地

文章浏览阅读909次,点赞16次,收藏14次。在信息抽取任务上,GPT还落后于专用的有监督模型; 对于困难的任务,落后的更多;提出使用软匹配更准确的评估效果;对鲁棒性和错例进行了分析

【创意坊】未来对话:激进AI崛起,探索国内CHATGPT,开启超智对话体验!-程序员宅基地

文章浏览阅读1.9w次,点赞25次,收藏19次。《未来对话:激进AI崛起,探索国内CHATGPT,开启超智!》文章聚焦于中国国内的一股激进AI力量,正是这股力量将开启我们对CHATGPT和GPT-4的全新探索。博客生动地描绘了中国国内ChatGPT项目,这个引人注目的力量直面全球AI竞技场,成为“全球第一直接对标ChatGPT ja GPT-4的顶级力量”。文章详细介绍了该项目独具的技术优势,突显了其在智能对话领域的卓越性能。通过独特技术手段,开发者成功打造了一个与ChatGPT及GPT-4直接竞争的系统,标志着中国在全球AI领域的引领地位。

IC验证的经验总结_ic验证经验《总结我的思路-如何在验证中发现和定-程序员宅基地

文章浏览阅读6.8k次,点赞28次,收藏186次。IC验证的经验总结 ----IC验证工程师的“易筋经” 有人认为我验证做得很牛,也有人认为我的验证早就丢下了;有人认为我发现了各个项目的不少问题,也有人认为我在CMM库的几百个问题单大部分属纯净水。 好吧,无论怎样,我还是把我在验证中如何发现和定位Bug的思路稍微描述总结一下,纯属灌水。以前华仔曾经叫我写过一次,我随手写了一点点,这次还是详细一点吧,主要分几点:视..._ic验证经验《总结我的思路-如何在验证中发现和定

Ubuntu下使用pjsip点对点通话_pjsua2 点对点sip电话 二次开发-程序员宅基地

文章浏览阅读2.5k次。Ubuntu AUbuntu Bubuntu A IP:192.168.43.49ubuntu B IP:192.168.43.11方法一:使用pjsua1. 进入目录pjsip-apps/binubuntu A: ./pjsua-x86_64-unknown-linux-gnuubuntu B发起呼叫: ./pjsua-x86_64-unkno_pjsua2 点对点sip电话 二次开发

嵌入式系统开发学习_嵌入式系统需要开发版配合,本课程将使用何种开发版?搜寻开发版图形标出重要名称?-程序员宅基地

文章浏览阅读2.4k次。嵌入式系统开发学习:(载自:http://blog.csdn.net/leoocn/archive/2008/02/26/2121703.aspx) 随着现代社会信息化进程的加快,嵌入式系统被广泛的地应用于军事、家用、工业、商业、办公、医疗等社会各个方面,表现出很强的投资价值。从国际范围来看,作为数字化电子信息产品核心的嵌入式系统目前其硬件和软件开发工具市场已经突破2000亿美元,嵌入式系统带来的全球工业年产值更是达到了一万亿美元,随着全_嵌入式系统需要开发版配合,本课程将使用何种开发版?搜寻开发版图形标出重要名称?

flask实战-用户登录注册系统+密码动态加密(5-实战篇)_登陆密码加密是动态的 如何做登录器-程序员宅基地

文章浏览阅读1.7k次。该篇主要介绍使用flask如何实现用户注册登录功能,使用SQLAlchemy操作数据库,密码进行动态加密解密验证,以及基本登录逻辑和表单提交,项目中用到的东西前几篇都有介绍,如有不足请留言指出谢谢1. 项目结构2. HTML页面登录页面 login.html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>登录</title._登陆密码加密是动态的 如何做登录器

随便推点

CodeForces - 342A-程序员宅基地

文章浏览阅读268次。A. Xenia and Divisorstime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputXenia the mathematician has a sequence_codeforces - 342a

局域网的搭建_内部局域网搭建csdn-程序员宅基地

文章浏览阅读357次,点赞2次,收藏3次。一.对等网络搭建1.先建立如下图所示的网络拓扑2.使用右侧面板第二项Place Note注释交换机3.使用右侧面板第四项调色板对话框填充工作区将“No Fill”切换为“Fill Color”选择绘制矩形Select Outline Color为黑色绘制蓝色对话框放置在楼层二绘制黄色对话框放置在楼层一填充结果如下图所示:二.完成基础配置,测试连通性测试从ping 192.168.1.2到192.168.1.1的连通性测试从ping 192.168.1.1到1_内部局域网搭建csdn

百度地图 计算两点间 角度 用于自定义轨迹播放_百度地图测角度-程序员宅基地

文章浏览阅读347次。function getRote(fromPoint,toPoint){var f = _map.pointToPixel(fromPoint);//_map为地图实例var m = _map.pointToPixel(toPoint);if (m.x != f.x) { var k = (m.y - f.y) / (m.x - f.x), g = Math.atan(k); e = g * 360 / (2 * Math.PI); if (m.x < f..._百度地图测角度

C++学习著作!(——本人已经走了弯路,大家吸取教训)_concept, model 和 refinement-程序员宅基地

文章浏览阅读1.4k次。发展历程C++语言发展大概可以分为三个阶段:  第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;OO思维。 《C++程序设计教程》(钱能著),《C++ Primer中文版》,《Effective C++》、《More Effective_concept, model 和 refinement

QT实例:从QListWidget中删除选中的QListWidgetItem_qlistwidget删除自定义item-程序员宅基地

文章浏览阅读5.1k次。从QListWidget中删除选中的QListWidgetItem QList list = ListWidget->selectedItems(); if(list.size() == 0) return; QListWidgetItem* sel = list[0]; if (sel) { int r = ListWidget->row(_qlistwidget删除自定义item

程序设计c语言教程杨路明6,C语言程序设计教程 杨路明 答案第9章-程序员宅基地

文章浏览阅读102次。1、li 45 300.0chang 30 200.0chang2、#includestruct students{char sid[100];char name[100];float score[3];}student;void main(){ int i; float j;printf("\nPlease input sid: ");scanf("%s",student...._"(\"\\naverage:\")"

推荐文章

热门文章

相关标签