通过16进制获取图片视频等文件的类型

复制粘贴即可用

我写的不全,像JPG这种文件类型的实现有好多种,按照自己的需求添加,下载UltraEdit,把文件拖进去就能获取16进制,前4个byte就能确定文件类型

public class FileTypeUtil {
private static Map<String, Integer> fileTypeIdMap = new HashMap<>();
private static Map<Integer, String> fileTypeValueMap = new HashMap<>();
static {
/

* 图片
*/

	 	fileTypeIdMap.put("FFD8FFE0",1);
        fileTypeIdMap.put("FFD8FFE2", 1);
        fileTypeValueMap.put(1, "jpg");
        fileTypeIdMap.put("89504E47", 2);
        fileTypeValueMap.put(2, "png");
        fileTypeIdMap.put("47494638", 3);
        fileTypeValueMap.put(3, "gif");
        fileTypeIdMap.put("424D50AE", 5);
        fileTypeValueMap.put(5, "bmp");
	/**
	 * 视频
	 */
	fileTypeIdMap.put("41564920", 13);
	fileTypeValueMap.put(13, "avi");
	fileTypeIdMap.put("00000020", 20);
	fileTypeValueMap.put(20, "mp4");

}

    public static String getFileType(MultipartFile multipartFile){
        try {
          InputStream inputStream = multipartFile.getInputStream();
          FileInputStream  fileInputStream = (FileInputStream) inputStream;
          byte[] bytes = new byte[4];
          fileInputStream.read(bytes, 0, bytes.length);
          String value = bytesToHexString(bytes);
          String type =  fileTypeValueMap.get(fileTypeIdMap.get(value));
          fileInputStream.close();
          if(type==null)return "error";
          return type;
        } catch (IOException e) {
        	return "error";
        }
    }

    private static String bytesToHexString(byte[] src) {
        StringBuilder builder = new StringBuilder();
        if (src == null  || src.length == 0) {
            return "error";
        }
        String hv;
        for (byte aSrc : src) {
            // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
            hv = Integer.toHexString(aSrc & 0xFF).toUpperCase();
            if (hv.length() !=  2) {
                builder.append(0);
            }
            builder.append(hv);
        }
        return builder.toString();
    }

}
**

`ByteBuffer` 是 Java 中用于处理原始字节数据的工具,它提供了一种高效的方式来操作内存块,无需直接访问操作系统级的内存映射。这使得它成为处理二进制数据、如图片文件等的理想选择。 当你想要将一张图片保存到磁盘上时,你通常会从 `ImageIO.read()` 或其他图片读取函数中获取图片的数据,得到的是一个二维像素数组(通常是 RGB 数据)。为了把这样的数据写入到文件中,你需要通过 `FileOutputStream` 将这个像素数组转换成字节流,并最终写入到磁盘上。而在这个过程中,`ByteBuffer` 可以帮助提高性能和内存管理效率: ### 以下是简单的步骤: 1. **创建 `BufferedImage`**:加载图片并将其封装为 `BufferedImage` 类型,这样可以利用其高效的内存管理特性。 2. **获取图像数据**:使用 `getRGB()` 方法获取图像的像素信息。 3. **创建 `ByteBuffer` 实例**:初始化一个 `ByteBuffer` 对象,用于存储图片数据。通常会使用标准缓冲区大小,例如使用默认的容量。 4. **填充 Buffer**:遍历图片的每个像素,并将它们的 RGB 值放入到 `ByteBuffer` 中。由于 `BufferedImage` 的像素数据通常是以行顺序排列的,因此在填充 `ByteBuffer` 时也需要考虑到这一点。 5. **写入到文件**:最后,你可以使用 `DataOutputStream` 来将 `ByteBuffer` 中的内容写入到文件中。通常需要先清空缓冲区以便进行有效的写入操作,然后将整个缓冲区内容写入到文件输出流中。 这里有一个简化的示例说明如何将一个 BufferedImage 写入到 `.png` 文件中: ```java import java.io.*; import javax.imageio.*; public class WriteImageToFile { public static void main(String[] args) { try { // 加载图片 BufferedImage image = ImageIO.read(new File("path/to/image.jpg")); // 创建一个文件输出流 FileOutputStream fileOut = new FileOutputStream("path/to/output.png"); // 初始化ByteBuffer,这里我们使用默认的容量 ByteBuffer buffer = ByteBuffer.allocateDirect(image.getWidth() * image.getHeight() * 3); // 获取图片数据,并将数据填充至ByteBuffer int[] pixels = new int[image.getWidth() * image.getHeight()]; image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); for (int y = 0; y < image.getHeight(); y++) { for (int x = 0; x < image.getWidth(); x++) { int pixelIndex = x + y * image.getWidth(); int r = (pixels[pixelIndex] >> 16) & 0xFF; int g = (pixels[pixelIndex] >> 8) & 0xFF; int b = pixels[pixelIndex] & 0xFF; buffer.put((byte)r); buffer.put((byte)g); buffer.put((byte)b); } } // 关闭buffer并准备写入文件 buffer.flip(); DataOutputStream outStream = new DataOutputStream(fileOut); outStream.write(buffer.array()); // 清理资源 outStream.close(); fileOut.close(); System.out.println("图片已成功保存"); } catch (IOException e) { e.printStackTrace(); } } } ``` ### 相关问题: 1. **如何优化图片写入过程的性能?** - 使用更高效的编码格式,比如 JPEG 而不是 PNG,在保持相似质量的同时减少文件大小。 - 避免不必要的复制,尽量原地修改 `ByteBuffer`。 - 合理管理内存分配和释放,避免内存泄漏。 2. **为什么选择使用 `ByteBuffer` 而不是简单地将像素值直接写入文件?** - `ByteBuffer` 提供了更好的内存管理和性能。它可以作为内存映射,减少对系统文件缓存的影响。 - 它允许并发访问,对于多线程应用更为合适。 - 它支持不同类型的数据布局,便于数据传输和序列化操作。 3. **在哪些场景下,使用 `ByteBuffer` 来写图片可能不是一个好选择?** - 当不需要高度优化的性能需求较低时,简单 I/O 操作可能就足够了。 - 对于非图片二进制数据的处理,如音频、视频等,专门针对这些类型的库可能会提供更优解。 - 如果应用程序只需要基本的文件读写功能,并且对于内存管理和性能要求不高,则使用传统 I/O 流可能更简单有效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值