From 47134c0536dc1f09ba014718279f1d68844afdf6 Mon Sep 17 00:00:00 2001 From: Zhu Kaixiao <3617246657@qq.com> Date: Thu, 11 Mar 2021 12:10:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AF=BB=E5=8F=96=E6=B5=81?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=AF=86=E5=88=AB=E7=B1=BB=E5=9E=8B=E6=8C=89?= =?UTF-8?q?=E7=85=A7=E6=89=A9=E5=B1=95=E5=90=8D=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/io/FileTypeUtil.java | 47 +++++++++++++------ .../cn/hutool/core/io/FileTypeUtilTest.java | 10 ++++ 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java index 3da7555a4..d7764bce3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java @@ -133,6 +133,7 @@ public class FileTypeUtil { return getType(IoUtil.readHex28Upper(in)); } + /** * 根据文件流的头部信息获得文件类型 * @@ -141,27 +142,20 @@ public class FileTypeUtil { * 2、xls、doc、msi头信息无法区分,按照扩展名区分 * 3、zip可能为docx、xlsx、pptx、jar、war头信息无法区分,按照扩展名区分 * - * - * @param file 文件 {@link File} + * @param in {@link InputStream} + * @param filename 文件名 * @return 类型,文件的扩展名,未找到为null - * @throws IORuntimeException 读取文件引起的异常 + * @throws IORuntimeException 读取流引起的异常 */ - public static String getType(File file) throws IORuntimeException { - String typeName; - FileInputStream in = null; - try { - in = IoUtil.toStream(file); - typeName = getType(in); - } finally { - IoUtil.close(in); - } + public static String getType(InputStream in, String filename) { + String typeName = getType(in); if (null == typeName) { // 未成功识别类型,扩展名辅助识别 - typeName = FileUtil.extName(file); + typeName = FileUtil.extName(filename); } else if ("xls".equals(typeName)) { // xls、doc、msi的头一样,使用扩展名辅助判断 - final String extName = FileUtil.extName(file); + final String extName = FileUtil.extName(filename); if ("doc".equalsIgnoreCase(extName)) { typeName = "doc"; } else if ("msi".equalsIgnoreCase(extName)) { @@ -169,7 +163,7 @@ public class FileTypeUtil { } } else if ("zip".equals(typeName)) { // zip可能为docx、xlsx、pptx、jar、war等格式,扩展名辅助判断 - final String extName = FileUtil.extName(file); + final String extName = FileUtil.extName(filename); if ("docx".equalsIgnoreCase(extName)) { typeName = "docx"; } else if ("xlsx".equalsIgnoreCase(extName)) { @@ -185,6 +179,29 @@ public class FileTypeUtil { return typeName; } + /** + * 根据文件流的头部信息获得文件类型 + * + *
+	 *     1、无法识别类型默认按照扩展名识别
+	 *     2、xls、doc、msi头信息无法区分,按照扩展名区分
+	 *     3、zip可能为docx、xlsx、pptx、jar、war头信息无法区分,按照扩展名区分
+	 * 
+ * + * @param file 文件 {@link File} + * @return 类型,文件的扩展名,未找到为null + * @throws IORuntimeException 读取文件引起的异常 + */ + public static String getType(File file) throws IORuntimeException { + FileInputStream in = null; + try { + in = IoUtil.toStream(file); + return getType(in, file.getName()); + } finally { + IoUtil.close(in); + } + } + /** * 通过路径获得文件类型 * diff --git a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java index 16b8d2bea..148f2950a 100644 --- a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java @@ -6,6 +6,7 @@ import org.junit.Ignore; import org.junit.Test; import java.io.File; +import java.io.InputStream; import java.lang.reflect.Field; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -56,4 +57,13 @@ public class FileTypeUtilTest { Assert.assertEquals("ofd", type); } + + @Test + @Ignore + public void inputStreamAndFilenameTest() { + File file = FileUtil.file("e:/laboratory/test.xlsx"); + String type = FileTypeUtil.getType(file); + Assert.assertEquals("xlsx", type); + } + }