如何从 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 对象(图像)创建文件对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Silverstripe 4.6 从 url 创建/保存图像对象