`
isiqi
  • 浏览: 16496141 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

[转] 关于流和缓冲

阅读更多

标准I/O提供了三种类型的缓存:
(1) 全缓存。在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。对于驻在磁盘上的文件通常是由标准I/O库实施全缓存的。在一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc(见7 . 8节)获得需使用的缓存。
术语刷新(flush)说明标准I/O缓存的写操作。缓存可由标准I/O例程自动地刷新(例如当填满一个缓存时),或者可以调用函数fflush刷新一个流。值得引起注意的是在UNIX环境中,刷新有两种意思。在标准I/O库方面,刷新意味着将缓存中的内容写到磁盘上(该缓存可以只是局部填写的)。在终端驱动程序方面(例如在第11章中所述的tcflush函数),刷新表示丢弃已存在缓存中的数据。
(2) 行缓存。在这种情况下,当在输入和输出中遇到新行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符(用标准 I/O fputc函数),但只有在写了一行之后才进行实际I/O操作。当流涉及一个终端时(例如标准输入和标准输出),典型地使用行缓存。对于行缓存有两个限制。第一个是:因为标准I/O库用来收集每一行的缓存的长度是固定的,所以只要填满了缓存,那么即使还没有写一个新行符,也进行I/O 操作。第二个是:任何时候只要通过标准输入输出库要求从(a)一个不带缓存的流,或者(b)一个行缓存的流(它预先要求从内核得到数据)得到输入数据,那么就会造成刷新所有行缓存输出流。在(b)中带了一个在括号中的说明的理由是,所需的数据可能已在该缓存中,它并不要求内核在需要该数据时才进行该操作。很明显,从不带缓存的一个流中进行输入((a)项)要求当时从内核得到数据。
(3) 不带缓存。标准I/O库不对字符进行缓存。如果用标准I/O函数写若干字符到不带缓存的流中,则相当于用write系统调用函数将这些字符写至相关联的打开文件上。标准出错流stderr通常是不带缓存的,这就使得出错信息可以尽快显示出来,而不管它们是否含有一个新行字符。
ANSIC要求下列缓存特征:
(1) 当且仅当标准输入和标准输出并不涉及交互作用设备时,它们才是全缓存的。
(2) 标准出错决不会是全缓存的。
但是,这并没有告诉我们如果标准输入和输出涉及交互作用设备时,它们是不带缓存的还是行缓存的,以及标准输出是不带缓存的,还是行缓存的。SVR 4和4.3+ BSD的系统默认使用下列类型的缓存:
标准出错是不带缓存的。
如若是涉及终端设备的其他流,则它们是行缓存的;否则是全缓存的。

我们经常要用到标准输入和输出,而ANSI C对stdin、stdout和stderr的缓存特征没有强行的规定,以至于不同的系统可能有不同的stdin、stdout和stderr的缓存特征。目前主要的缓存特征是:stdin和stdout是行缓存;而stderr是无缓存的。


参考:
1. 《UNIX环境高级编程》第五章,Stevens
2. 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结(很详细)
分享到:
评论

相关推荐

    JavaIO实例_字节流_字符流_缓冲流_转换流IODemo

    在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...

    JavaIO实例|字节流|字符流|缓冲流|转换流IODemo

    在Java中,IO流被设计用来在不同的数据源和目的地之间传输数据,如文件、网络连接、内存缓冲区等。本教程将详细介绍Java IO中的字节流、字符流、缓冲流以及转换流,并通过IODemo实例来展示它们的用法。 ### 1. 字节...

    day10【缓冲流、转换流、序列化流、打印流】-笔记1

    缓冲流分为字节缓冲流和字符缓冲流两种,分别是BufferedInputStream、BufferedOutputStream和BufferedReader、BufferedWriter。 字节缓冲流的构造方法有两个,一个是public BufferedInputStream(InputStream in),...

    day21_缓冲流、转换流、序列化流、Commons IO.pdf

    缓冲流分为字节缓冲流和字符缓冲流两大类,分别是`BufferedInputStream`和`BufferedOutputStream`(处理字节流)以及`BufferedReader`和`BufferedWriter`(处理字符流)。缓冲流的主要作用在于减少对系统I/O操作的...

    21.【缓冲流、转换流、序列化流、打印流】(1)_缓冲流_源码

    【缓冲流、转换流、序列化流、打印流】-笔记`文件可能包含了详细的解释和示例代码,通过阅读这份笔记,可以更深入地理解这些流的用法和优化技巧。 总之,理解并熟练运用Java的缓冲流、转换流、序列化流和打印流,...

    Java基础知识-day10【缓冲流、转换流、序列化流、Files】.pdf

    字节缓冲流的构造方法为public BufferedInputStream(InputStream in)和public BufferedOutputStream(OutputStream out),用于创建新的缓冲输入流和缓冲输出流。缓冲流的读写方法与基本的流是一致的,我们可以通过...

    24_IO_第3天(转换流、缓冲流)_讲义

    本讲义主要探讨的是Java IO中的转换流和缓冲流,这两个概念对于高效且灵活的数据操作至关重要。 转换流(InputStreamReader和OutputStreamWriter)在Java IO系统中起到桥梁的作用,它们允许我们进行字符流与字节流...

    java IO流 1. 流的概念 2. 输入流和输出流 3. 字符流、字节流 4. 缓冲流 5. 转换流处理流

    java IO流 1. 流的概念 2. 输入流和输出流 3. 字符流、字节流 4. 缓冲流 5. 转换流处理流

    java缓冲流、转换流、序列化流.docx

    除了基本的字节和字符缓冲流外,还有对应的打印流(PrintStream 和 PrintWriter),以及可以对其他流进行缓冲化的装饰器模式实现,例如 FilterInputStream 和 FilterOutputStream。转换流(如InputStreamReader 和 ...

    缓冲流&转换流习题答案1

    在Java编程中,缓冲流(Buffered Stream)和转换流(Transferring Stream)是用于提高I/O操作效率的重要工具。这两个概念在处理文件读写、数据传输等场景时非常常见。下面,我们将深入理解这些知识点,并根据提供的...

    字符流缓冲流等1

    Java提供了四个缓冲流类:`BufferedInputStream`、`BufferedOutputStream`、`BufferedReader`和`BufferedWriter`。这些类分别增强了字节输入流、字节输出流、字符输入流和字符输出流。使用缓冲流可以显著提高读写...

    Java的IO流讲解代码: File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型

    File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...

    day09-字节缓冲流&字符流1

    字节缓冲流可以分为字节缓冲输出流和字节缓冲输入流两种。字节缓冲输出流可以将数据写入到文件中,而字节缓冲输入流可以从文件中读取数据。在本节中,我们将详细介绍字节缓冲流的构造方法、应用场景以及示例代码。 ...

    03【缓冲流、转换流、序列化流、打印流】.html

    Java文件流知识点梳理总结,IO文件流,包含了File类、缓冲流、字节流、字符流、转换流等

    点和线多边形缓冲区 c#算法

    点和线多边形缓冲区是GIS(地理信息系统)中常用的一种技术,它涉及到空间分析和几何处理。在C#编程环境下,我们可以利用.NET Framework提供的Geometry类库来实现这一功能,尤其是在开发基于Web的地图应用时,如使用...

    Java字符流与字节流区别

    Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元...字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。

    安卓对讲机录音机相关-android录音获取录音的音频流数据放入缓冲区分析缓冲区的数据.rar

    在处理音频流时,为了提高效率和防止数据丢失,通常会使用缓冲区来暂时存储数据。在安卓录音中,我们可以设定缓冲区大小,`AudioRecord`会在缓冲区满时触发读取事件,将新录制的音频数据读入。这允许开发者在合适的...

    芯片I/O缓冲及ESD电路设计

    在电子设计领域,芯片I/O缓冲及ESD电路设计是至关重要的环节,它们关系到芯片与外界环境的交互效率和稳定性。I/O缓冲电路作为芯片与外部系统通信的桥梁,承担着信号转换、驱动和保护的重要任务。这篇文章将深入探讨I...

    C# 将图片文件转换成字节流存储在TXT

    在实际应用中,可能还需要考虑其他因素,比如错误处理、性能优化(如使用缓冲区批量写入),或者在读取字节流后重新构建图片文件。对于后者,可以使用`File.WriteAllBytes()`将字节数组写回磁盘,或者使用`Image`类...

Global site tag (gtag.js) - Google Analytics