gpt4 book ai didi

java - 在java中使用RandomAccessFile的不完整文件

转载 作者:行者123 更新时间:2023-12-01 19:03:57 25 4
gpt4 key购买 nike

我编写了一个小程序来下载数据并将其写入文件。

这是代码:

public void run()
{

byte[] bytes = new byte[1024];
int bytes_read;

URLConnection urlc = null;
RandomAccessFile raf = null;
InputStream i = null;


try
{
raf = new RandomAccessFile("file1", "rw");
}
catch(Exception e)
{
e.printStackTrace();
return;
}

try
{
urlc = new URL(link).openConnection();
i = urlc.getInputStream();
}
catch(Exception e)
{
e.printStackTrace();
return;
}

while(canDownload())
{
try
{
bytes_read = i.read(bytes);
}
catch(Exception e)
{
e.printStackTrace();
return;
}

if(bytes_read != -1)
{
try
{
raf.write(bytes, 0, bytes_read);
}
catch(Exception e)
{
e.printStackTrace();
return;
}
}
else
{
try
{
i.close();
raf.close();
return;
}
catch(Exception e)
{
e.printStackTrace();
return;
}
}
}
}

问题是,当我下载大文件时,文件末尾缺少几个字节。我尝试将字节数组大小改为2K,问题解决。但是当我下载一个更大的文件(500 MB)时,我又丢失了一些字节。我说“好吧,我们试试 4K 尺寸”。我将字节数组大小更改为 4K。有效!很好,但是当我下载了一个 4 GB 的文件时,最后又丢失了字节!我说“酷,我们试试 8K 大小”。然后我将字节数组大小更改为8K。工作了。

我的第一个问题是:为什么会发生这种情况? (当我更改缓冲区大小时,文件不会损坏)。

好吧,理论上,将字节数组大小更改为更大的值可以解决文件损坏问题。但还有另一个问题:如何测量大字节数组大小的下载速度(以一秒为间隔)?

例如:假设我的下载速度是 2 KB/s。字节数组大小为4K。我的第二个问题是:如果线程必须等待字节数组填满,如何测量速度(以一秒为单位)?我的答案应该是:将字节数组大小更改为较小的值。但文件将会损坏 xD。

在尝试自己解决问题后,我花了两天时间在互联网上寻找解决方案。什么也没有。

请问你们能回答我的两个问题吗?谢谢=D

编辑

canDownload() 的代码:

synchronized private boolean canDownload()
{
return can_download;
}

最佳答案

我的建议是使用经过验证的库,例如 Apache Commons IO而不是尝试编写自己的代码。对于您的特定问题,请查看copyURLToFile(URL, File)方法。

关于java - 在java中使用RandomAccessFile的不完整文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11024588/

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