如何从 URL 对象(图像)创建文件对象 [重复]

Posted

技术标签:

【中文标题】如何从 URL 对象(图像)创建文件对象 [重复]【英文标题】:How to create file object from URL object (image) [duplicate] 【发布时间】:2012-01-09 15:00:04 【问题描述】:

我需要从 URL 对象创建一个 File 对象 我的要求是 我需要创建一个网络图像的文件对象(比如 googles 徽标)

URL url = new URL("http://google.com/pathtoaimage.jpg");
File f = create image from url object

【问题讨论】:

您能详细说明一下吗?你想达到什么目的? 我还建议您查看this question 并检查它是否适合您 【参考方案1】:

您可以将URL 转换为String 并使用它来创建新的File。例如

URL url = new URL("http://google.com/pathtoaimage.jpg");
File f = new File(url.getFile());

【讨论】:

对全路径有空格的本地文件系统文件使用此方法时,%20不会自动转换为空格,可能会导致异常 url.getFile 附加查询(例如,?a=b&c=d),如果有的话。通常没有实际意义,因为通常没有查询。但是,要获取文件,应该使用 url.getPath() getFile 或 getPath 都不能正确解码,所以上面的 Paths.get() 方法更可取, 抱歉,我不小心误读了您帖子中的代码并对其投了反对票,因为(我认为)它与 java.net.URL 文档不匹配。如果您编辑帖子,我将能够删除我的反对票。如果你这样做,请告诉我。 已修复,我可以自己编辑并删除反对票。【参考方案2】:

要从 HTTP URL 创建文件,您需要从该 URL 下载内容:

URL url = new URL("http://www.google.ro/logos/2011/twain11-hp-bg.jpg");
URLConnection connection = url.openConnection();
InputStream in = connection.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("downloaded.jpg"));
byte[] buf = new byte[512];
while (true) 
    int len = in.read(buf);
    if (len == -1) 
        break;
    
    fos.write(buf, 0, len);

in.close();
fos.flush();
fos.close();

下载的文件将位于项目的根目录:project/downloaded.jpg

【讨论】:

【参考方案3】:

使用Apache Common IO's FileUtils:

import org.apache.commons.io.FileUtils

FileUtils.copyURLToFile(url, f);

该方法下载url的内容并保存到f

【讨论】:

这对我有用:URL url = new URL("http://www.mydomain.com/pathToFile/fileName.pdf"); String tDir = System.getProperty("java.io.tmpdir"); String path = tDir + "tmp" + ".pdf"; file = new File(path); file.deleteOnExit(); FileUtils.copyURLToFile(url, file); @AdrienBe FileUtils 在 Eclipse 中出现错误,它不显示导入。 import org.apache.commons.io.FileUtils 应该可以完成这项工作,请参阅答案中的库链接 还有org.apache.commons.io.FileUtils.toFile(URL url),以防我们只想将URL转换为File 注意:将implementation 'commons-io:commons-io:2.6'添加到gradle依赖块【参考方案4】:

从 Java 7 开始

File file = Paths.get(url.toURI()).toFile();

【讨论】:

这是用于检索文件位置,以file:// 协议为例,不确定 OP 是否想要该位置或下载图像本身,但无论如何这是我个人正在寻找的。谢谢 如果 URL 中包含任何空格,这会导致 URISyntaxException,如果 URL 使用 file:// 协议可能会出现这种情况。 空格应替换为:%20【参考方案5】:

您可以使用ImageIO 从 URL 加载图像,然后将其写入文件。像这样的:

URL url = new URL("http://google.com/pathtoaimage.jpg");
BufferedImage img = ImageIO.read(url);
File file = new File("downloaded.jpg");
ImageIO.write(img, "jpg", file);

如果需要,这还允许您将图像转换为其他格式。

【讨论】:

他们是否可以通过 BufferedImage 创建文件对象而不将其写入磁盘 根据定义,文件需要存储在某个文件系统上。你需要一些内存文件系统才能得到一个不持久的文件。 您是否注意到已接受的答案?我不知道 FileUitls 是否为此创建了一个临时文件:P 我的感觉是你的要求需要重新考虑......也就是说,假设你需要调用像processImage(File f)这样的方法,这应该改为processImage(BufferedImage img)processImage(InputStream is)。这些更改中的任何一个都可以让您不必在本地 FS 上存储外部图像。 关于接受的答案,FileUtils 需要一个 File 实例(您可能已经注意到),与 ImageIO API 一样。如果您选择创建一个临时文件,该文件仍将保留,但会在 JVM 退出时删除(和/或在系统 tmp 目录中创建)。所以从这个角度来看,这两个答案是完全一样的。 :P

以上是关于如何从 URL 对象(图像)创建文件对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 中的 URL 读取图像数据?

Silverstripe 4.6 从 url 创建/保存图像对象

如何从对象数组中获取图像的URL

使用JavaScript将图像URL中的链接从s3转换为文件对象

从 url 获取图像文件对象

如何从 NSArray 中获取图像 URL?