FrEqDe Asked: 2020-01-17 15:24:34 +0800 CST 2020-01-17 15:24:34 +0800 CST 2020-01-17 15:24:34 +0800 CST 如果文件属于其扩展名指示的类型,如何检查java? 772 例如,如果我有一个视频文件,我将 mp4 扩展名更改为 txt,它的内部结构仍然是视频的结构。但是,如果扩展名已更改,它如何检测到它仍然是视频。我做了一些研究,我知道每个扩展都有特定的字节或特定的结构来识别它们,但我不知道如何使用它来验证我的问题所说的内容。 java 2 Answers Voted Best Answer Jorgesys 2020-01-17T15:49:40+08:002020-01-17T15:49:40+08:00 您可以使用Files.probeContentType()确定文件的 MIME TYPE 。 例如,对于名为 file_video.mp4 的文件,此类文件的MIME TYPE为:video/mp4,如果您更改扩展名;通过Files.probeContentType()您可以获得类型并确定您的文件真正是什么类型的内容: File archivo = new File("C:\\archivos\\archivo_video.txt); try { String tipodeArchivo = Files.probeContentType(archivo.toPath()); } catch (IOException ioException) { System.out.println("Error: " + ioException.getMessage()); } Stefan Nolde 2020-01-17T16:14:30+08:002020-01-17T16:14:30+08:00 您可以将文件作为RandomAccessFile打开并读取文件的元数据(取决于您希望找到的文件的规格)。 例如,对于 ISO 容器,您必须找到具有以下格式的ftyp框: <nnnn> - 4 bytes tamaño del box ftyp - 4 bytes ASCII "ftyp" (literalmente) <cccc> - 4 caracteres código de tipo mayor (por ejemplo "mp41" para mp4 versión 1 <bbbb> - 4 bytes versión 其余数据已经是可选的,更多信息(英文)你可以在这里找到,主要类型列表在这里。 使用基于 ISO 的视频文件,您可以获得最大的类型,如下所示: byte[] tipo = new byte[4]; try{ RandomAccessFile file = new RandomAccessFile("mifile.ext","r"); file.skipBytes(8); // salta tamaño y "ftyp" file.read(tipo); String sTipo = new String(tipo); System.out.println(String.format("Tipo de archivo: %s", sTipo)); file.close(); catch (Exception e){ e.printStackTrace(); } (此代码不应在生产系统中使用,应确保在出现错误时释放系统资源。)
您可以使用Files.probeContentType()确定文件的 MIME TYPE 。
例如,对于名为 file_video.mp4 的文件,此类文件的MIME TYPE为:
video/mp4
,如果您更改扩展名;通过Files.probeContentType()您可以获得类型并确定您的文件真正是什么类型的内容:您可以将文件作为RandomAccessFile打开并读取文件的元数据(取决于您希望找到的文件的规格)。
例如,对于 ISO 容器,您必须找到具有以下格式的ftyp框:
其余数据已经是可选的,更多信息(英文)你可以在这里找到,主要类型列表在这里。
使用基于 ISO 的视频文件,您可以获得最大的类型,如下所示:
(此代码不应在生产系统中使用,应确保在出现错误时释放系统资源。)