Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么时候阻塞IO块?_Java_Io_Blocking - Fatal编程技术网

Java 什么时候阻塞IO块?

Java 什么时候阻塞IO块?,java,io,blocking,Java,Io,Blocking,InputStream.available()javadoc: 返回可从中读取(或跳过)的字节数 此输入流无阻塞 我认为阻塞意味着我调用的read()线程被阻塞(控制流不再继续),直到read()返回。从这个意义上讲,我看不到任何可以在不阻塞的情况下调用read()的场景 阻塞的另一个含义可能是,如果我想读取3个字节,但没有或只有1个字节可用,read()将阻塞并等待更多字节出现-但我无法理解,b/c然后调用read()并尝试读取更多可用字节可能会导致永久阻塞(只是从一个10字节的文件中读取10

InputStream.available()javadoc:

返回可从中读取(或跳过)的字节数 此输入流无阻塞

  • 我认为阻塞意味着我调用的
    read()
    线程被阻塞(控制流不再继续),直到
    read()
    返回。从这个意义上讲,我看不到任何可以在不阻塞的情况下调用read()的场景

  • 阻塞的另一个含义可能是,如果我想读取3个字节,但没有或只有1个字节可用,
    read()
    将阻塞并等待更多字节出现-但我无法理解,b/c然后调用
    read()
    并尝试读取更多可用字节可能会导致永久阻塞(只是从一个10字节的文件中读取100字节的图像)

  • 在哪种意义上java.io是阻塞(1)还是阻塞(2)

    我无法模拟使用FileInputStream或ByteArrayInputStream读取IO块(意义(2))方法时的情况:

            // file content is: 1 2 3       
            FileInputStream myStream = new FileInputStream("d:\\file.txt");
            byte[] b = new byte[100];
            myStream.read(b);
            System.out.println("control reached here?");
            System.out.println(Arrays.toString(b));
    
    输出:

    reached here?
    [122, 100, 122, 120, 118, 122, 120, 32, 118, 122, 120, 118, 32, 122, 120, 118, 32, 122, 118, 99, 122, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    
    第二个调用
    myStream.read(b)
    也会返回-1而不会阻塞

    在哪种情况下会发生阻塞

    我认为如果我尝试读取5个字节,有3个字节,就会发生这种情况。如果没有,则表示返回EOF/end of stream和-1(也没有阻塞)


    另外,我倾向于认为java.io既是(1)又是(2):它是同步的(1)和阻塞的(2),但是阻塞实际上只在使用套接字时才被观察到。
    Socket.getInputStream()/Socket.getOutputStream()
    )。

    场景2就是这个意思

    (经过一些实验后更新)

    似乎本地磁盘文件I/O未被视为阻塞。对于FileInputStream,available()方法返回文件的剩余长度。也就是说,如果文件长度为91764字节,并且您读取了4个字节,那么available()方法将返回91760

    我发现这个结果令人惊讶;如果您尝试读取91760字节,您的线程肯定会阻塞磁盘I/O

    结果对于网络套接字连接来说更容易理解。将来可能从远程系统到达的数据量当然是未知的;可用()将告诉您有多少已经到达并且现在可以读取。在这种情况下,“阻塞”将是无限期的—等待远程主机发送,这超出了I/O系统的知识范围。
    至少有20个字节可供进一步读取而无需阻塞。

    或多或少的选项2,但您不必担心
    读取
    阻塞,即使已经有一些数据要处理

    这里有一个提示:不要使用available()。它实际上是无用的,它提供的信息并不能真正让你做你本来无法做的事情

    假设您有一个TCP网络连接。在您或对方挂断连接之前,可以通过线路发送的字节数没有限制,但在另一方面,可能还有(比如)10个字节需要读取,并且在一段时间内不会有更多的字节,因为发送方目前处于静默状态

    假设你这样做:

    byte[] b = new byte[100];
    int r = in.read(b);
    
    这里要发生的是,
    r
    将是
    10
    ,您的
    b
    中的前10个插槽将被填满,就是这样。
    read
    “smartly”返回:如果有0个字节,它不会返回(read保证它将阻塞,直到它读取至少1个字节,或者流被关闭,在这种情况下,它返回
    -1
    )…如果有字节要读取,它将读取其中的有效块


    阻塞
    ,具体地说,意味着线程将暂停,并且在某些内容发生更改之前不会恢复。(字节进入,或者流关闭).

    可能的重复异步允许您同时执行其他工作。如果文件存在非阻塞,则它不会立即成功或失败。您当然是对的。谢谢。无论如何,FWiW,我重写了我的答案。您不应该说明
    availagle()的内容
    返回一个
    文件inoutstrem
    。这正是FIONREAD在许多系统中所做的。它在任何地方都没有指定,Java和AFAIK中也没有为
    ioctl()
    指定。OP可能正在读取一个网络文件。