Java NIO从inputstream读取大文件

Java NIO从inputstream读取大文件,java,nio,Java,Nio,我想读取一个大的InputStream并将其作为文件返回。所以我需要拆分InputStream(或者我应该在多个线程中读取InputStream)。我该怎么做?我正在尝试这样做: URL url = new URL("path"); URLConnection connection = url.openConnection(); int fileSize = connection.getContentLength(); InputStream is = conn

我想读取一个大的InputStream并将其作为文件返回。所以我需要拆分InputStream(或者我应该在多个线程中读取InputStream)。我该怎么做?我正在尝试这样做:

    URL url = new URL("path");
    URLConnection connection = url.openConnection();
    int fileSize = connection.getContentLength();

    InputStream is = connection.getInputStream();
    ReadableByteChannel rbc1 = Channels.newChannel(is);
    ReadableByteChannel rbc2 = Channels.newChannel(is);

    FileOutputStream fos = new FileOutputStream("file.ext");

    FileChannel fileChannel1 = fos.getChannel();
    FileChannel fileChannel2 = fos.getChannel();
    fileChannel1.transferFrom(rbc1, 0, fileSize/2);
    fileChannel2.transferFrom(rbc2, fileSize/2, fileSize/2);

    fos.close();
但它不会影响性能。

您可以对每个通道使用位置(长)方法开始读取

看看这个

此外,如果您想部分下载文件

并行下载

要并行下载文件的多个部分,我们需要创建 多线程。每个线程的实现方式与简单 线程,除了它只需要下载 下载的文件。为此,HttpURLConnection或其超类 URLConnection为我们提供方法setRequestProperty来设置范围 我们要下载的字节数

// open Http connection to URL
HttpURLConnection conn = (HttpURLConnection)mURL.openConnection();

// set the range of byte to download
String byteRange = mStartByte + "-" + mEndByte;
conn.setRequestProperty("Range", "bytes=" + byteRange);

// connect to server
conn.connect();
这将对你有帮助

我在这里找到了这个答案,你们可以查看完整的教程

您可以打开到同一资源(URL)的多个(HTTP)连接,但使用HTTP的功能使每个流在另一点开始读取。这实际上可以加快数据传输,特别是在存在高延迟问题的情况下。您不应该过度使用并行性,请注意它会给服务器带来额外的负载

connection1.setRequestProperty("Range", "bytes=0-" + half);
connection2.setRequestProperty("Range", "bytes=" + half+1 +"-");
这也可用于恢复下载。它需要得到服务器的支持。它可以通过
Accept Ranges:bytes
来宣布这一点,但不必这样做。请准备好,第一个连接可能会返回整个请求的实体(状态200与206)


您需要在单独的线程中从URLConnections读取输入流,因为这会阻塞IO(不确定NIO包装是否有帮助)。

不,不,看在上帝的份上,不!流本质上是连续的。您无法通过尝试并行操作来加快它们的处理速度。如果幸运的话,你只会放慢速度,但更有可能会对数据进行彻底的散列。此外,如果数据是通过网络传入的,那么你的瓶颈几乎肯定是网络。如果不是这样,那么它将是您正在写入的本地磁盘。当您所做的只是将字节从源移动到接收器时,接收程序内部不会进行数据处理。基本的premiss是有缺陷的。您不能同时读取网络流中的两个位置。只有一个流。@JohnBollinger当使用TCP时,同一网络上的两个流可能比一个流快(这是否不公平还有争议)@eckes,当然,有两个流。OP只有一条流,这就是他询问的情况。目前还不清楚是否可以在服务器上安排传输他的一个文件的两个流的安排。所要做的就是从网络上读取数据,所花费的时间与读取数据的时间一样多。基本前提是有缺陷的。您不能同时读取网络流中的两个位置。见上文@JohnBollinger的评论。有时我不明白为什么没有答案试图掩盖这个词。这家伙想要一个并行下载的答案。你们所服务的只是说不。请激励寻求答案的人。评论并没有显示效果?对不起,但你必须更加支持。我不知道“评论没有显示效果”应该是什么意思,也不知道它到底在哪里说我“必须更加支持”。你不能支持一个毫无意义的想法。