【问题标题】:How to create file object from URL object (image) [duplicate]如何从 URL 对象(图像)创建文件对象 [重复]
【发布时间】: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 并检查它是否适合您

标签: java


【解决方案1】:

使用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依赖块
【解决方案2】:

从 Java 7 开始

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

【讨论】:

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

您可以使用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
【解决方案4】:

要从 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

【讨论】:

    【解决方案5】:

    您可以将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 文档不匹配。如果您编辑帖子,我将能够删除我的反对票。如果你这样做,请告诉我。
    • 已修复,我可以自己编辑并删除反对票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2018-04-11
    • 2017-02-15
    • 2016-06-22
    • 2011-03-08
    • 2021-04-09
    相关资源
    最近更新 更多