当前位置: 首页 > 知识库问答 >
问题:

BufferedInputStream如何从操作系统请求数据块

陆子石
2023-03-14

我读了这个问题:为什么使用BufferedInputStream逐个字节读取文件比使用FileInputStream更快?根据作者BufferedInputStream(BIS)FileInputStream(FIS)更快,因为当方法read()FileInputStream中调用时,它总是使用本地API进行系统调用,以便获取单个字节,而BufferedInputStream做同样的事情,但是它需要操作系统的字节块,并将它们存储在本地字段中,称为buf,该字段在BIS类中声明,然后当读取()被称为BIS时,返回字节从buf数组。

我查看了BIS的代码,特别是read()方法,但我不清楚何时会发生这种情况,何时BIS需要字节块而不是一个字节。方法read()首先检查if(pos

for (; i < len ; i++) {
                c = read();

我是否遗漏了什么,或者BIS和FIS两个类都将执行相同数量的系统调用,以便分别获取每个字节?


共有1个答案

帅令雪
2023-03-14

你找错地方了。

InputStream提供了int read(字节[]b,int off,int len)的实现,它确实在循环中调用read()。因此,如果BuffredInputStream包装的具体InputStream不重写此方法,则不会有性能改进。但是,您链接的问题专门讨论FileInputStream,它通过调用本机int readBytes(byte b[],int off,int len)来重写此方法。

 类似资料:
  • 操作系统提供的服务 操作系统的五大功能,分别为:作业管理、文件管理、存储管理、输入输出设备管理、进程及处理机管理 中断 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类: 内部异常中断:由计算机硬件异常或故障引起的中断; 软中断:由程序中执行了引起中断的指令而造成

  • sed sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。 sed命令行格式为: sed [-nefri] ‘command’ 输入文本 常用选项: -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的

  • 进程与线程 对于有线程系统: 进程是资源分配的独立单位 线程是资源调度的独立单位 对于无线程系统: 进程是资源调度、分配的独立单位 进程之间的通信方式以及优缺点 管道(PIPE) 有名管道:一种半双工的通信方式,它允许无亲缘关系进程间的通信 优点:可以实现任意关系的进程间的通信 缺点: 长期存于系统中,使用不当容易出错 缓冲区有限 无名管道:一种半双工的通信方式,只能在具有亲缘关系的进程间使用(父

  • 1 select,poll和epoll 其实所有的I/O都是轮询的方法,只不过实现的层面不同罢了. 这个问题可能有点深入了,但相信能回答出这个问题是对I/O多路复用有很好的了解了.其中tornado使用的就是epoll的. selec,poll和epoll区别总结 基本上select有3个缺点: 连接数受限 查找配对速度慢 数据由内核拷贝到用户态 poll改善了第一个缺点 epoll改了三个缺点.

  • 你可以在任何主流操作系统下去做开发工作,Windows,macOS,Linux 都可以。如果选择 Windows ,版本最好选择 Windows 10 专业版。用 macOS 的用户不用太担心系统问题,可以无痛并免费升级,现在你应该用的是 Sierra 这个版本的 macOS 。Linux 也可以,比如 Ubuntu 的桌面版。 如果你能满足下面三个条件的其中一个,这个任务就算完成了: Windo

  • 指令运行参数 设定变量T为指令运行总时间,t为所需时间最长部分指令的时间(周期),n为指令条数 指令相关公式 顺序方式运行指令所需时间:Tn 流水方式运行指令所需时间:T+(n-1)t 重叠方式运行指令所需时间:(n+2)t 吞吐率:n/流水方式运行指令所需时间 效率:效率=吞吐率t 加速比:加速比=效率n 可变分区分配算法 首次适应法 从主存低地址开始,寻找第一个可用(即大于等于作业需求的内存)