gpt4 book ai didi

Java NIO : transferFrom until end of stream

转载 作者:太空狗 更新时间:2023-10-29 22:45:38 25 4
gpt4 key购买 nike

我正在研究 NIO 库。我正在尝试监听端口 8888 上的连接,一旦连接被接受,就将该 channel 中的所有内容转储到 somefile

我知道如何使用 ByteBuffers 来做到这一点,但我想让它与据称 super 高效的 FileChannel.transferFrom 一起工作.

这是我得到的:

ServerSocketChannel ssChannel = ServerSocketChannel.open();
ssChannel.socket().bind(new InetSocketAddress(8888));

SocketChannel sChannel = ssChannel.accept();
FileChannel out = new FileOutputStream("somefile").getChannel();

while (... sChannel has not reached the end of the stream ...) <-- what to put here?
out.transferFrom(sChannel, out.position(), BUF_SIZE);

out.close();

所以,我的问题是:如何表达“transferFrom some channel until end-of-stream is reached”


编辑:将 1024 更改为 BUF_SIZE,因为所用缓冲区的大小与问题无关。

最佳答案

处理此案的方法很少。一些背景信息如何在内部实现 trasnferTo/From 以及何时可以更好。

  • 首先,也是最重要的一点,你应该知道你必须 xfer 多少字节,即使用 FileChannel.size()确定可用的最大值并对结果求和。案例引用FileChannel.trasnferTo(socketChanel)
  • 该方法不返回-1
  • 该方法在 Windows 上被模拟。 Windows 没有从文件描述符到套接字 xfer 的 API 函数,它确实有一个(两个)从名称指定的文件 xfer - 但它与 java API 不兼容。
  • 在 Linux 上标准 sendfile (或 sendfile64)被使用,在 Solaris 上它被称为 sendfilev64 .

简而言之for (long xferBytes=0; startPos + xferBytes<fchannel.size();) doXfer()将用于从文件传输 ->套接字。没有从套接字传输到文件的操作系统功能(OP 对此感兴趣)。由于套接字数据不在操作系统缓存中,因此无法如此有效地完成,它被模拟了。实现复制的最佳方法是通过标准循环使用轮询的直接 ByteBuffer 大小与套接字读取缓冲区。因为我只使用涉及选择器的非阻塞 IO。

话虽这么说:我想让它与所谓的 super 高效“?一起工作 - 它效率不高并且它在所有操作系统上都被模拟,因此它会在传输时结束套接字是否正常关闭。如果有任何传输(如果套接字可读且打开),该函数甚至不会抛出继承的 IOException。

我希望答案很明确:File.transferFrom 唯一有趣的用途当源是文件时发生。最有效(也是最有趣的情况)是 file->socket 和 file->file 是通过 filechanel.map 实现的/unmap(!!) .

关于Java NIO : transferFrom until end of stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7651528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com