gpt4 book ai didi

java - 使用Java通过网络复制文件数据非常慢

转载 作者:太空宇宙 更新时间:2023-11-04 08:26:01 27 4
gpt4 key购买 nike

我的代码必须从它加载的每个文件中读取部分数据,通常约为 100,000 字节。这对于本地文件来说效果很好,但在我的 WiFi 网络上可能会非常慢,即使我的网络看起来足够(但不是很快)

所以我创建了这个简单的测试:

public void testDataCopySpeed() throws Exception
{
File file = new File("Z:\\TestFile.mp3");
System.out.println("start:"+new Date());
FileChannel fc = new FileInputStream(file).getChannel();
ByteBuffer bb = ByteBuffer.allocate(500000); //1/2 MB
fc.read(bb);
System.out.println("end:"+new Date());
}

本地文件的时间不到一秒,但网络文件的时间超过一分钟。

然后我尝试测试我的网络速度,我不知道如何测试 wifi,但我使用 http://myspeedtestonline.com/ 测试了互联网上传/下载速度假设这会比我实际的 wifi 网络慢。它给了我:

下载速度:512KB/秒上传速度:40KB/秒

我在另一台计算机上运行了相同的测试,速度相似

那么,我可以在一秒内下载 1/2 MB 的数据,但从 Java 中的一个文件复制 1/2 MB 的数据可能需要一分钟,该文件托管在 NAS 上。 ?

编辑:所以我在下面有几个很好的答案,我真正想知道的是从一组文件中访问前 100,000 个字节以进行只读访问(适用于本地和网络文件)的最佳方法是什么,或者我应该根据它是否未联网而使用不同的代码。修复网络并不是真正的解决方案,我也许能够修复我的网络,但该软件必须在任何计算机上运行,​​我的许多客户可能没有最佳网络,并且不具备修复网络问题的技能。

最佳答案

你能尝试一下内存映射文件吗?

File file = new File("Z:/TestFile.mp3");
System.out.println("start:"+new Date());
FileChannel fc = new FileInputStream(file).getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
System.out.println("end:"+new Date());

这可能只会显得更快,或者可能有助于隐藏所需的时间。

关于java - 使用Java通过网络复制文件数据非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8520395/

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