gpt4 book ai didi

java - HttpURLConnection 的意外结果 - 读取远程二进制文件

转载 作者:行者123 更新时间:2023-11-29 04:04:48 24 4
gpt4 key购买 nike

我正在尝试像这样从 Internet 读取远程二进制文件(比如图像):

HttpURLConnection connection = (HttpURLConnection) myUrl.openConnection(); //myUrl - URL object pointing for some location
if(connection.getResponseCode() == 200){
File temp = File.createTempFile("blabla", fileName); //fileName - string name of file
FileOutputStream out = new FileOutputStream(temp);
int fileSize = Integer.parseInt(connection.getHeaderField("content-length"));
int counter = 0;
DataInputStream in = new DataInputStream(connection.getInputStream());
byte ch[] = new byte[1024];
System.out.println(counter);
while((counter += in.read(ch)) > 0){
out.write(ch);
if(counter == fileSize){
out.close();
break;
}
}
}

本地网络服务器 (localhost) 完美运行。

但是。然后 myUrl 是某个远程 Web 服务器上文件的 URL - 它返回意外结果。例如,从给定文件的来源来看,它似乎重复了一些包(我认为是因为以前的包损坏或某些事情)并且由于这种重复,生成的文件通常比原始文件大 10% 左右。因此文件已损坏,无法使用图像查看器正确打开。

我该如何解决这个问题?

最佳答案

read 不一定读取整个缓冲区(特别是如果它位于流的末尾)。

所以改变你的循环:

for (;;) {
int len = in.read(ch);
if (len == -1) {
break;
}
out.write(ch, 0, len);
}

也许将该代码放在某处的方法中。

另请注意:

  • 在这里使用 DataInputStream 没有意义(尽管 readFully 通常很有用)。
  • 总是用惯用语关闭资源(例如流):

    final Resource resource = acquire();
    try {
    use(resource);
    } finally {
    resource.close();
    }
  • 可能不会有太大区别,但 1024 的缓冲区大小有点小。我倾向于任意默认为 8192。

关于java - HttpURLConnection 的意外结果 - 读取远程二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/611346/

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