java如何实现判断文件的真实类型

Java如何实现判断文件真实类型的攻略如下:

1.使用后缀名判断文件类型

Java可以通过文件后缀名来判断文件类型。例如,如果文件名以".txt"结尾,则是文本文件。这种方法适用于大多数文件类型,但不适用于所有文件。以下是示例代码:

import java.io.File;

public class FileTypeChecker {
    public static String getFileTypeBySuffix(String filePath) {
        String type = "";
        String fileName = new File(filePath).getName();
        if (fileName.indexOf(".") != -1) {
            String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
            if ("txt".equalsIgnoreCase(suffix)) {
                type = "text/plain";
            } else if ("html".equalsIgnoreCase(suffix)) {
                type = "text/html";
            } else if (suffix.equalsIgnoreCase("gif") || suffix.equalsIgnoreCase("jpg") || suffix.equalsIgnoreCase("jpeg") || suffix.equalsIgnoreCase("png")) {
                type = "image/" + suffix;
            } else if (suffix.equalsIgnoreCase("pdf")) {
                type = "application/pdf";
            } else if (suffix.equalsIgnoreCase("doc") || suffix.equalsIgnoreCase("docx")) {
                type = "application/msword";
            } else if (suffix.equalsIgnoreCase("xls") || suffix.equalsIgnoreCase("xlsx")) {
                type = "application/vnd.ms-excel";
            } else if (suffix.equalsIgnoreCase("ppt") || suffix.equalsIgnoreCase("pptx")) {
                type = "application/vnd.ms-powerpoint";
            } else if (suffix.equalsIgnoreCase("zip") || suffix.equalsIgnoreCase("rar")) {
                type = "application/zip";
            }
        }
        return type;
    }
}

以上代码中自动识别文件后缀名并返回相应类型的MIME类型(多功能Internet邮件扩展类型)。

2.使用魔数(magic number)判断文件类型

文件类型通常包含文件头(header)或规范(specification),可以通过魔数来识别。魔数是文件起始的一些特定字节,用于标识文件类型。我们可以读取文件的前几个字节来判断文件类型。以下是示例代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class FileTypeChecker {
    public static String getFileTypeByMagic(String filePath) throws IOException {
        String type = "";
        InputStream is = new FileInputStream(filePath);
        byte[] head = new byte[10];
        is.read(head);
        String fileHeader = bytesToHexString(head);
        switch (fileHeader) {
            case "89504e47":
                type = "image/png";
                break;
            case "47494638":
                type = "image/gif";
                break;
            case "ffd8ffe0":
            case "ffd8ffe1":
            case "ffd8ffe2":
                type = "image/jpeg";
                break;
            case "25504446":
                type = "application/pdf";
                break;
            case "504b34":
                type = "application/zip";
                break;
            default:
                type = "unknown";
        }
        return type;
    }

    private static String bytesToHexString(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            int hex = b & 0xFF;
            if (hex < 16) {
                hexString.append("0");
            }
            hexString.append(Integer.toHexString(hex));
        }
        return hexString.toString();
    }
}

以上代码中直接读取文件的前10个字节,并根据字节的值所对应的16进制数字来检查文件头。根据文件头的值确定文件类型。

这两种方法都可以识别文件的类型。但是,只使用文件后缀名来判断文件类型可能不够准确,因为文件名可以任意更改。使用魔数判断文件类型更加准确,因为它只是读取文件的前几个字节来确定文件类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java如何实现判断文件的真实类型 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解Java实现JSONArray转Map的三种实现方式

    详解Java实现JSONArray转Map的三种实现方式 本文将详细介绍Java中实现JSONArray转Map的三种方法,其中包括使用JSONObject、Gson和Jackson三种方式实现。首先,我们需要使用以下的引入语句: import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjs…

    Java 2023年5月26日
    00
  • spring boot 2.x静态资源会被拦截器拦截的原因分析及解决

    一、问题描述 在使用Spring Boot 2.x开发项目时,我们可能会遇到一个问题,即静态资源(如CSS、JS、图片等)会被拦截器拦截而无法正常加载导致页面样式、交互等异常。这是因为Spring Boot 2.x采用了不同于之前版本的WebMvcConfigurerAdapter配置方式,在配置拦截器时需要特别注意。 二、原因分析 在Spring Boot…

    Java 2023年5月20日
    00
  • 通过实例了解JavaBean开发及使用过程解析

    当我们在开发Java应用时,经常需要定义一些Java对象来传递数据。这些对象通常被称为JavaBean。JavaBean是符合特定规范的Java类,它通常具有以下特征: 具有公共的无参数构造函数 存取方法遵循JavaBean的规范 实现可序列化接口 在下面的过程中,我将通过两个实例来说明JavaBean的开发及使用过程: 示例1:开发JavaBean pub…

    Java 2023年6月15日
    00
  • Java编程用指定字符打印菱形实例

    对于Java编程打印指定字符的菱形实例,具体操作步骤如下: 1. 确定框架和输出样式 菱形实例通常分为两部分,上半部分和下半部分。我们可以先确定输出框架,可以用一个二维字符数组来表示,其中每个元素存储一个字符,通常用空格或特定字符填充。 上半部分可以采用两个嵌套的循环控制每行的输出符号,下半部分则可以采用逆向输出的方法,即先确定下边界,再循环输出。 2. 确…

    Java 2023年5月23日
    00
  • Java中启动线程start和run的两种方法

    启动线程是Java并发编程中的重要话题。在Java中,启动线程有两种方法,分别是调用Thread类的start()方法和直接调用run()方法。 为什么要使用线程 在Java中,线程的创建和启动可以让程序并发执行,实现多任务的处理。进程是由操作系统进行资源分配和调度的,而线程是在进程的基础上创建的,可以利用CPU时间片轮流获得执行时间。这样就可以让程序在一定…

    Java 2023年5月26日
    00
  • Java定时任务的三种实现方法

    让我来详细讲解“Java定时任务的三种实现方法”的完整攻略吧。 1. 基于TimerTask实现Java定时任务 策略步骤 创建Timer对象 继承TimerTask类实现task任务 调度task任务执行 示例代码 import java.util.Timer; import java.util.TimerTask; public class TimerT…

    Java 2023年5月20日
    00
  • Java实现英文猜词游戏的示例代码

    Java实现英文猜词游戏的示例代码 简介 英文猜词是一种简单而有趣的游戏。在这个游戏中,计算机会随机选取一个单词,并将其中的字母都用空格代替。玩家需要猜出这个单词是什么,并逐步填充每一个空格。每次猜错都会导致玩家失去一部分生命值,当生命值归零时,游戏结束。 本文将分享如何使用Java来实现这样一个英文猜词游戏。以下是完整的示例代码: import java.…

    Java 2023年5月19日
    00
  • 避免sql注入_动力节点Java学院整理

    接下来我将详细讲解“避免SQL注入_动力节点Java学院整理”的完整攻略。 SQL注入是什么 SQL注入攻击是指攻击者在提交应用程序的输入值时,嵌入执行恶意的SQL语句,从而诱发数据库执行非预期的恶意操作。SQL注入是目前web程序中比较常见的漏洞种类之一,它是由于软件开发人员在编写应用程序或Web页面时,没有对用户输入的数据进行充分的检查,致使攻击者可以攻…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部