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

使用FileInputStream和File对象代替命名管道的问题

广乐邦
2023-03-14

我的问题是DataInputStream在流仍然打开但没有数据时抛出EOFException。我希望这会简单地阻止(尽管文档在这个问题上非常模糊)。

DataOutputStream:

public void onEvent() {
    fos.writeInt(width);
    fos.writeInt(height);
    fos.writeInt(newBuffer.length);
    fos.write(newBuffer);
}

DataInPutStream:

while(true) {
    int width = fis.readInt();
    int height = fis.readInt();
    int length = fis.readInt();
    byte[] bytes = new byte[length];
    fis.read(bytes);
}
    fos.write(intToByteArray(width));
    fos.write(intToByteArray(height));
    fos.write(intToByteArray(newBuffer.length));
    Log.e(this.class.getName(), "Writing width: " + Arrays.toString(intToByteArray(width)) + 
                                                      ", height: " + Arrays.toString(intToByteArray(height)) + 
                                                      ", length: " + Arrays.toString(intToByteArray(newBuffer.length)));
    fos.write(newBuffer);
    if(repeat == -1) {
        Log.e(this.class.getName(), "Closing ramFile");
        fos.flush();
        fos.close();
    }

另一边我用这个:

while(true) {
    byte[] intByteArray = new byte[] { -1,-1,-1,-1 };
    fis.read(intByteArray);
    Log.e(this.class.getName(), Arrays.toString(intByteArray));
    int width = toInt(intByteArray, 0);
    fis.read(intByteArray);
    int height = toInt(intByteArray, 0);
    fis.read(intByteArray);
    int length = toInt(intByteArray, 0);
    Log.e(this.class.getName(), "Reading width: " + width + ", height: " + height + ", length: " + length);
}

它给出:

[0, 0, 2, -48] 
Reading width: 720, height: 1280, length: 3686400 

奇怪的是,read()没有阻塞,它只是愉快地继续运行,没有阻塞,但也没有填充数组中的任何值(将数组初始化为{9,9,9,9}后仍然是9,9,9,9)。

[-1, -1, -1, -1] 
Reading width: -1, height: -1, length: -1 
java.lang.NegativeArraySizeException: -1

这就是疯狂的感觉吗?

共有1个答案

周朗
2023-03-14

这里的答案相当简单(没有很好的文档记录)。

FileInputStream的read请求没有超时--这意味着如果您从一个空的但未关闭的流中读取,它将返回而不填充字节(保持给定的字节“原样”)。

您可以使用LocalSocketLocalServerSocket通过相同的机制流式传输数据,并使用

LocalServerSocket server = new LocalServerSocket(SOCKET_NAME);
LocalSocket socket = server.accept();
socket.setSoTimeout(60);
 类似资料:
  • 问题内容: 这可能很愚蠢,但是我想知道后台操作的区别。 上面两行代码之间的区别是什么,以及它们在什么情况下使用。 问题答案: extend :它是InputStream的专用版本,旨在读取文件。 根据InputStream的用途,有几种实现。 通常最好的做法是使用代码中所需的最高类型。因此,如果您的代码需要从而不是从a 读取数据,则应使用。但是,如果您确实需要保持对象的信息为a 而不只是a ,则应

  • 问题内容: 我正在尝试使用File对象初始化FileInputStream对象。我在网上收到FileNotFound错误 这很奇怪,因为我已经通过相同的方法多次打开该文件来进行正则表达式。 我的方法如下: java.io.FileNotFoundException:C:\ dev的\服务器\的tomcat6 \的webapps \样品现场(访问被拒绝) 在java.io.FileInputStre

  • 主要内容:使用命名管道双向通信管道是用于相关过程之间的通信。 我们是否可以使用管道进行不相关的进程通信,比方说,我们要从一个终端执行客户端程序,从另一个终端执行服务器程序? 答案是否定的。那么怎样才能实现不相关的进程通信,简单的答案就是使用 命名管道。 即使这适用于相关的进程,但是使用命名管道进行相关的进程通信没有任何意义。 我们使用一个管道进行单向通信,两个管道进行双向通信。 命名管道是否适用相同的条件。 答案是否定的,我们

  • 我正试图通过命名管道使用VB.NET从windows应用程序连接到SQL Server2008。 但这根本不连接到服务器。这是使用命名管道连接到sql sererver的正确方法吗?

  • 问题内容: 在网上进行了一些搜索,找到了使用命名管道的简单“教程”。但是,当我对后台作业执行任何操作时,我似乎会丢失很多数据。 [[编辑:找到了一个简单得多的解决方案,请参阅回复。因此,我提出的问题现在是学术性的,以防万一可能需要工作服务器]] 在Linux 2.6.32-25-generic#45-Ubuntu SMP上使用Ubuntu 10.04(星期六)10月16日19:52:42 UTC

  • 问题内容: 我正在尝试在两个程序之间创建双向通信通道(一个在Python中,另一个在C#中) 当我在两个C#程序或两个Python程序之间创建一个命名管道时,一切都很好,但是当我尝试(例如)从Python代码连接到C#服务器时,它不起作用: C#代码: 如果我在Python中使用代码块(永远不会返回) 如果我使用open函数,它只会建立连接,但不会发生任何事情: 现在,如果我关闭Python程序,