From ed84445a6c1239306c3186b4964113fa709bdf04 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 29 Jul 2023 12:58:43 +0800 Subject: [PATCH] fix code --- .../core/io/resource/BytesResource.java | 5 ++ .../io/resource/CharSequenceResource.java | 5 ++ .../core/io/resource/FileObjectResource.java | 6 ++ .../hutool/core/io/resource/FileResource.java | 5 ++ .../hutool/core/io/resource/HttpResource.java | 5 ++ .../core/io/resource/InputStreamResource.java | 12 ++++ .../core/io/resource/MultiResource.java | 5 ++ .../core/io/resource/NoResourceException.java | 61 ++++++++++++++++--- .../hutool/core/io/resource/Resource.java | 7 +++ .../hutool/core/io/resource/UrlResource.java | 14 +++-- .../hutool/core/io/resource/VfsResource.java | 1 + .../org/dromara/hutool/core/net/NetUtil.java | 11 +++- .../dromara/hutool/core/net/url/URLUtil.java | 59 +++++++++++++++--- 13 files changed, 172 insertions(+), 24 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/BytesResource.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/BytesResource.java index e0f5ed4b6..7af20a8c5 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/BytesResource.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/BytesResource.java @@ -64,6 +64,11 @@ public class BytesResource implements Resource, Serializable { return null; } + @Override + public long size() { + return this.bytes.length; + } + @Override public InputStream getStream() { return new ByteArrayInputStream(this.bytes); diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/CharSequenceResource.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/CharSequenceResource.java index c52fa02c0..fff898af1 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/CharSequenceResource.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/CharSequenceResource.java @@ -77,6 +77,11 @@ public class CharSequenceResource implements Resource, Serializable { return null; } + @Override + public long size() { + return data.length(); + } + @Override public InputStream getStream() { return new ByteArrayInputStream(readBytes()); diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/FileObjectResource.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/FileObjectResource.java index f23f20ff3..c2c58580a 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/FileObjectResource.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/FileObjectResource.java @@ -14,6 +14,7 @@ package org.dromara.hutool.core.io.resource; import org.dromara.hutool.core.io.IORuntimeException; import org.dromara.hutool.core.io.IoUtil; +import org.dromara.hutool.core.net.url.URLUtil; import javax.tools.FileObject; import java.io.BufferedReader; @@ -65,6 +66,11 @@ public class FileObjectResource implements Resource { } } + @Override + public long size() { + return URLUtil.size(getUrl()); + } + @Override public InputStream getStream() { try { diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/FileResource.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/FileResource.java index 606bb4af9..eb72bf0e7 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/FileResource.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/FileResource.java @@ -89,6 +89,11 @@ public class FileResource implements Resource, Serializable { return URLUtil.getURL(this.file); } + @Override + public long size() { + return this.file.length(); + } + @Override public InputStream getStream() throws NoResourceException { return FileUtil.getInputStream(this.file); diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/HttpResource.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/HttpResource.java index 688f01e1d..34481628e 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/HttpResource.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/HttpResource.java @@ -51,6 +51,11 @@ public class HttpResource implements Resource, Serializable { return resource.getUrl(); } + @Override + public long size() { + return resource.size(); + } + @Override public InputStream getStream() { return resource.getStream(); diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/InputStreamResource.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/InputStreamResource.java index 6a84c291b..93aa67c4f 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/InputStreamResource.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/InputStreamResource.java @@ -12,6 +12,9 @@ package org.dromara.hutool.core.io.resource; +import org.dromara.hutool.core.io.IORuntimeException; + +import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.net.URL; @@ -59,6 +62,15 @@ public class InputStreamResource implements Resource, Serializable { return null; } + @Override + public long size() { + try { + return this.in.available(); + } catch (final IOException e) { + throw new IORuntimeException(e); + } + } + @Override public InputStream getStream() { return this.in; diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/MultiResource.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/MultiResource.java index 4794af8fb..cb717c525 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/MultiResource.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/MultiResource.java @@ -70,6 +70,11 @@ public class MultiResource implements Resource, Iterable, Iterator + *
  • 如果URL为文件,转换为文件获取文件长度。
  • + *
  • 其它情况获取{@link URLConnection#getContentLengthLong()}
  • + * + * + * @param url URL + * @return 长度 + * @since 6.0.0 + */ + public static long size(final URL url) { + if (URLUtil.isFileURL(url)) { + // 如果资源以独立文件形式存在,尝试获取文件长度 + final File file = FileUtil.file(url); + final long length = file.length(); + if (length == 0L && !file.exists()) { + throw new IORuntimeException("File not exist or size is zero!"); + } + return length; + } else { + // 如果资源打在jar包中或来自网络,使用网络请求长度 + // issue#3226, 来自Spring的AbstractFileResolvingResource + try { + final URLConnection con = url.openConnection(); + NetUtil.useCachesIfNecessary(con); + if (con instanceof HttpURLConnection) { + final HttpURLConnection httpCon = (HttpURLConnection) con; + httpCon.setRequestMethod("HEAD"); + } + return con.getContentLengthLong(); + } catch (final IOException e) { + throw new IORuntimeException(e); + } + } + } }