块IO与流IO简介

简介

所有的io设备都可以被分为流设备和块设备,块设备指的是把数据打包成块进行传输,传输基本单位为块,传输过程中需要缓冲区(buffer)支持,当然,读写也是以块作为基本单位.对于流设备(也称为字符设备),传输过程是以字节流形式进行的,这样的设备是不需要缓冲机制的.

块和流

块:Block:基本的数据单位,一个块通常包含多个字节(字节数目固定)
块设备:Block-Device:其提供的IO操作均是面向块的,也只能面向块,无论是读还是写,(CD,DVD)
流:Stream:基本的数据单位,一个流通常包含多个字节或者只有一个字节
流设备:Stream-Device:提供的IO面向流(键盘,鼠标,终端)

区别:

在操作系统和应用程序中经常把块设备当成一个块数组来进行操作,块操作是需要缓冲区的协助,缓冲区积满之后进行数据传输,当你的程序中包含了缓冲区的话,现在的操作系统采用内存映射将文件直接映射到用户空间中来加速操作。流io原理模仿了通道(channel),I/O 字节流必须顺序存取,常见的例子有TTY(控制台)设备、打印机端口和网络连接。流的传输一般(也不必然如此)比块设备慢,经常用于间歇性输入。

总结:

流io一般速度低于块io,并不是绝对,拿水龙头来比喻:流就像水龙头滴水,每次只有一滴;块就像水龙头往水壶放水,放满之后对一整个水壶的水进行操作。 * 1:针对一段固定大小的数据 n byte,流是对每一个字节进行读取,每次读取调用一次系统函数,所以是需要n次调用。而块则是一次一块,假设块大小为b因此系统函数调用的次数为[n/b]+1,特别是当数据比较大时,效率更高 * 2,流io为阻塞模式,而块io支持非阻塞(不考虑消息轮询);多线程情况下,把文件看成一个块数组的话,我们可以多线程对不同的块进行操作,比如thread1 操作块1,thread2操作块2...而对于流,由于流只能顺序读取,因此基本没有优势。 * 3,在数据的实时性要求比较严的情况下,流就很方便了,每次写入一个字节系统就能立即将数据传输给程序,而块则是等到缓冲区满或者flush之后才进行处理 * 4,处理数据方面,我们可以非常方便的节为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分。而对于一整块的数据处理起来相对就麻烦了。 * 5,占用内存:由于流面向字节,一次只需要少量内存即可,而面向快由于需要缓冲区的协助,因此内存的大小与块的大小以及数量直接相关,即使块中数据并没有填满,仍然需要占用这么多内存。

参考:

时间: 2024-11-05 00:22:38

块IO与流IO简介的相关文章

Java IO流-NIO简介

2017-11-05 22:09:04 NIO NIO:new IO就是新IO的意思,JDK4开始出现新IO,新IO和传统的IO有相同的目的,都是用于进行输入输出的,但是新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,将文件或者文件中的一段区域映射到内存中,就可以相访问内存一样来访问文件了,这种方式的效率比旧IO要高很多,但是目前好多地方我们看到还是旧IO为主. 一个小例子: Path:路径 Paths:有一个静态方法返回一个路径       public static Path

Java nio 笔记:系统IO、缓冲区、流IO、socket通道

一.Java IO 和 系统 IO 不匹配 在大多数情况下,Java 应用程序并非真的受着 I/O 的束缚.操作系统并非不能快速传送数据,让 Java 有事可做:相反,是 JVM 自身在 I/O 方面效率欠佳.操作系统与 Java 基于流的 I/O模型有些不匹配.操作系统要移动的是大块数据(缓冲区),这往往是在硬件直接存储器存取(DMA)的协助下完成的.而 JVM 的 I/O 操作类喜欢操作小块数据--单个字节.几行文本.结果,操作系统送来整缓冲区的数据,java.io 包的流数据类再花大量时间

Java IO字符流与字节流

一.基本概念 流:从一端流向另一端,从源头到目的地. 始终与程序为中心,都是程序与文件|数组|网络连接|数据库进行操作. 二.IO流分类 1.流向: 输入流和输出流 2.数据: 字节流:二进制,可以处理文本文件,视频,音频等 . 字符流:文本文件,只能处理纯文本,全款为可见字符(.txt..html). 3.功能: 节点:包裹源头 处理:增强功能,提高性能. 三.字节流与字符流 1.字节流 输入流:InputStream int read(byte[] b) int read(byte[] b,

UNIX高级环境编程(7)标准IO函数库 - 二进制文件IO,流定位,创建临时文件和内存流

? 1 二进制IO(Binary IO) 在前一篇我们了解了逐字符读写和逐行读写函数. 如果我们在读写二进制文件,希望以此读写整个文件内容,这两个函数虽然可以实现,但是明显会很麻烦且多次循环明显效率很低. 为了应对这种场景,标准IO库提供了fread和fwrite函数. 函数声明: #include <stdio.h> size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); size_t fw

java io 处理流,BufferdInputStream、BufferedWriter、BufferedReader

BufferdInputStream:读取helloworld.java helloworld.java: package io; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } package io; import java.io.BufferedInputStream; import java.io.FileInputS

JavaLearning:JAVA IO Piped流

package org.fun.io; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; class Send implements Runnable{ private PipedOutputStream output=null; public Send(){ this.output=new PipedOutputStream(); } public Pip

Java IO 过滤流 字节缓冲流 BufferedInput/OutputStream

Java IO 过滤流 字节缓冲流 BufferedInput/OutputStream @author ixenos 概念 BufferedInput/OutputStream是实现缓存的过滤流,他们分别是FilterInput/OutputStream的子类. BufferedInputStream工作流程 stream-->buf--read buf-->I 1.当一个BufferedInputStream被创建时,一个内部的缓冲区 byte[] buf = new byte[size]

Java IO 理解流的概念

Java IO 理解流的概念 @author ixenos 在理解流时首先理解以下概念 1.流的来源和去向一般在构造器指出 2.方法中的形参一般是将流输出到某个位置,读取时从流读出数据(来自流)送到位置上,输出时将所要输出的数据(来自我)送到位置上

Java IO 节点流 FileInput/OutputStream

Java IO 节点流 FileInput/OutputStream @author ixenos 节点流之 文件流 文件读写是最常见的I/O操作,通过文件流来连接磁盘文件,读写文件内容 1.文件的读写工作流程: 1)打开文件输入流或输出流 FileInputStream实现读文件,调用FileInputStream的构造器可以打开一个文件输入流: 1 public FileInputStream(String fileName) throws FileNotFoundException //指