`

深入了解LINUX下IO模式(二)——什么是面向流,什么是面向缓冲区

阅读更多

面向流,面向缓冲区,这是JAVA中的概念,和操作系统无关


具体怎么看呢,废话少说直接上源码


第一段是JAVA中的标准IO

java.net.SocketInputStream.read
 
int read(byte b[], int off, int length, int timeout) throws IOException {
int n;
 
 
 
// EOF already encountered
if (eof) {
return -1;
}
 
// connection reset
if (impl.isConnectionReset()) {
throw new SocketException("Connection reset");
}
 
// bounds check
if (length <= 0 || off < 0 || off + length > b.length) {
if (length == 0) {
return 0;
}
throw new ArrayIndexOutOfBoundsException();
}
 
boolean gotReset = false;
 
// acquire file descriptor and do the read
FileDescriptor fd = impl.acquireFD();
try {
n = socketRead(fd, b, off, length, timeout);//native函数
if (n > 0) {
return n;
}
} catch (ConnectionResetException rstExc) {
gotReset = true;
} finally {
impl.releaseFD();
}
 
/*
* We receive a "connection reset" but there may be bytes still
* buffered on the socket
*/
if (gotReset) {
impl.setConnectionResetPending();
impl.acquireFD();
try {
n = socketRead(fd, b, off, length, timeout);//native函数,这里从内核态中读取数据到数组b中
if (n > 0) {
return n;
}
} catch (ConnectionResetException rstExc) {
} finally {
impl.releaseFD();
}
}
 
/*
* If we get here we are at EOF, the socket has been closed,
* or the connection has been reset.
*/
if (impl.isClosedOrPending()) {
throw new SocketException("Socket closed");
}
if (impl.isConnectionResetPending()) {
impl.setConnectionReset();
}
if (impl.isConnectionReset()) {
throw new SocketException("Connection reset");
}
eof = true;
return -1;
}
  
第二段代码是一般说的NIO实现方式
sun.nio.ch.DatagramChannelImpl.receive
private int receive(FileDescriptor fd, ByteBuffer dst)
        throws IOException
    {
        int pos = dst.position();
        int lim = dst.limit();
        assert (pos <= lim);
        int rem = (pos <= lim ? lim - pos : 0);
        if (dst instanceof DirectBuffer && rem > 0)
            return receiveIntoNativeBuffer(fd, dst, rem, pos);

        // Substitute a native buffer. If the supplied buffer is empty
        // we must instead use a nonempty buffer, otherwise the call
        // will not block waiting for a datagram on some platforms.
        int newSize = Math.max(rem, 1);
        ByteBuffer bb = Util.getTemporaryDirectBuffer(newSize);//申请一块newSize大小的缓冲区块
        try {
            int n = receiveIntoNativeBuffer(fd, bb, newSize, 0);//数据读取到缓冲区中,buffer可以做标记,操作指针等
            bb.flip();
            if (n > 0 && rem > 0)
                dst.put(bb);
            return n;
        } finally {
            Util.releaseTemporaryDirectBuffer(bb);
        }
    }
  
可以看到,第一段代码中一次性从native函数中获取相当长度的数据,然后直接对这块数据进行了操作
而第二段代码中Util.getTemporaryDirectBuffer(newSize);申请了一块堆外内存,每次读取的数据放在该内存中,然后对该内存进行操作。
一般说法面向缓存相对于面向流的好处在于增加了处理数据的灵活性,当然也增加了操作的复杂度,比如当更多数据取入时,是否会覆盖前面的数据等 
分享到:
评论

相关推荐

    linux 标准IO——学生信息管理

    在Linux操作系统中,标准输入/输出(Standard Input/Output,简称标准IO)是系统提供的一种基本I/O模型,用于程序与外部设备...通过对这个程序的学习,我们可以深入了解C语言在Linux环境下的文件操作和数据处理能力。

    JAVA_IO操作总结——节点流和处理流.pdf

    ### JAVA IO操作总结——节点流和处理流 #### 一、概述 在Java中,输入/输出(Input/Output,简称IO)操作是一项非常重要的功能,它涉及到如何从不同的源读取数据以及如何向不同的目的地写入数据。Java IO体系主要...

    利用缓冲区提高Java应用程序的IO性能

    本文将深入探讨如何通过使用I/O缓冲区来提升Java程序的I/O性能,并通过一个生物信息学领域的具体案例——基因序列搜索应用来进行说明。实验结果表明,通过合理地运用I/O缓冲技术,可以在某些情况下使Java程序的I/O...

    实例解析linux的IO编程

    1. **全缓冲(Full Buffering)**:默认情况下,大多数标准IO流采用全缓冲模式。在这种模式下,只有当缓冲区满或显式调用`fflush`函数或进程正常结束时,才会将数据刷新到磁盘。 2. **行缓冲(Line Buffering)**:...

    linux下IO口驱动

    本文将深入探讨Linux下IO口驱动的工作原理、实现方式以及如何通过编程来控制IO口的高低电平。 首先,理解Linux中的IO口。在计算机硬件中,输入/输出(Input/Output,简称IO)口是处理器与外部设备进行数据交换的...

    Java图书管理系统(IO流版)(csdn)————程序.pdf

    本文总结了Java图书管理系统(IO流版)的主要知识点,涵盖了Java基础语法、流程控制、面向对象思想、封装、继承、多态、接口、异常、集合、IO流等多方面的知识。 一、Java基础语法 * 掌握Java的基本语法,包括变量...

    Linux下IO读写工具abu-1.0

    3. **数据记录与分析**:在进行大量I/O操作时,`abu-1.0`可能能记录下每个操作的详细信息,并提供分析工具,以便后期分析I/O行为模式,找出潜在问题。 4. **命令行接口**:作为Linux工具,`abu-1.0`很可能支持...

    19——Linux的系统调用与文件IO(二)

    本主题将深入探讨这两个重要领域,特别是针对"19——Linux的系统调用与文件IO(二)"这一视频教程内容进行详细阐述。 首先,让我们理解什么是系统调用。系统调用是用户程序与操作系统内核进行通信的唯一合法方式,它...

    linux文件IO编程ppt

    本讲座主要围绕"Linux文件IO编程"展开,由知名的教育机构华清远见出品,质量可靠,内容深入浅出。 首先,我们来了解一下Linux文件系统的基本概念。在Linux中,一切皆为文件,包括硬件设备、网络接口等,都被抽象为...

    JAVA IO流缓冲字节流缓冲字符流等流经典代码示例加注释总结.rar

    2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、...

    python中的IO流(csdn)————程序.pdf

    了解并熟练掌握Python中的IO流操作是进行文件处理和数据持久化的基础,也是许多应用程序的核心部分。通过正确地使用`open()`函数和相关方法,开发者可以轻松地读取、写入和管理各种类型的文件。

    Linux IO数据通道我理解

    了解这些层次及其工作原理对于深入理解Linux系统的IO机制至关重要。 1. **用户空间层**:应用程序通过标准的系统调用接口(如`read()`、`write()`等)来请求IO操作。 2. **文件系统层**:负责管理文件和目录的存储...

    Linux文件IO跟标准IO总结

    通过阅读这些文档,初学者可以更全面地了解Linux下的IO机制,以便在实际编程中选择最适合的方法。无论是标准IO还是文件IO,都各有优势,理解它们的特性并根据需求灵活运用是成为熟练的Linux程序员的关键。

    深入理解Linux内核中文第三版——第13章 IO体系结构和设备驱动程序

    《深入理解linux内核中文第三版》,高清晰扫描,真正中文第三版,对Linux 2.6内核进行了详细而细致的讲解。由于之前的压缩包分卷太多,现提供每一章的单独下载文件。100%高清晰第三版!

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

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

    python IO流(csdn)————程序.pdf

    `flush()`函数是另一个有用的工具,它允许我们在不关闭文件的情况下强制写入缓冲区中的数据到文件。这对于确保数据即时写入尤其有用,特别是当程序异常退出时,可以避免丢失未写入的数据。 总的来说,Python的IO流...

    Linux文件IO操作

    ### Linux文件IO操作详解 #### 基本概念 Linux 文件 I/O 操作是学习 Linux 应用开发的基础,尤其对于初学者来说至关重要。本文旨在详细介绍 Linux 下的文件 I/O 操作及其相关概念。 #### 文件 在 Linux 系统中,...

    java基础——IO流及File-RandomAccessFile对象.docx

    ### Java基础——IO流及File、RandomAccessFile对象 #### IO流概述 在Java中,IO流主要用于处理设备上的数据,这里的“流”可以被理解为数据的流动过程,即数据从一个地方移动到另一个地方的过程。Java中的IO流通过...

    标准c库的io缓冲区操作图示说明

    fgetc函数可能通过系统调用进入内核读1K字节到IO缓冲区中,然后返回IO缓冲区中的第一个字节给用户,把读写位置指向IO缓冲区中的第二个字符,以后用户再调fgetc,就直接从IO缓冲区中读取,而不需要进内核了,当用户把...

    Linux IO数据通道我理解之分享

    #### 二、块IO层——截获IO 块IO层是Linux内核中的一个重要组成部分,其主要职责是截获来自上层的IO请求,并对这些请求进行优化处理。这一层主要包括以下几个关键组件: 1. **bio_vec**:表示一组连续的数据块,...

Global site tag (gtag.js) - Google Analytics