|
|
package com.utils;
|
|
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
|
import java.io.File;
|
|
|
import java.io.FileInputStream;
|
|
|
import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
|
|
|
|
/**
|
|
|
* 文件操作工具类
|
|
|
*
|
|
|
* 核心职责:提供文件与字节数组之间的转换功能
|
|
|
*
|
|
|
* 技术特点:
|
|
|
* 1. 基于Java IO流实现文件读取
|
|
|
* 2. 使用缓冲区提高读取效率
|
|
|
* 3. 支持大文件的分块读取
|
|
|
* 4. 自动资源管理(需要改进)
|
|
|
*
|
|
|
* 使用场景:
|
|
|
* - 文件上传前的数据准备
|
|
|
* - 文件内容读取为二进制数据
|
|
|
* - 文件存储到数据库的BLOB字段
|
|
|
* - 文件传输和网络通信
|
|
|
*
|
|
|
* @author
|
|
|
* @version 1.0
|
|
|
*/
|
|
|
public class FileUtil {
|
|
|
|
|
|
/**
|
|
|
* 将文件转换为字节数组
|
|
|
*
|
|
|
* @param file 要转换的文件对象
|
|
|
* @return 文件的字节数组表示
|
|
|
* @throws IOException 当文件读取失败时抛出IO异常
|
|
|
*
|
|
|
* 方法说明:
|
|
|
* 1. 通过文件输入流读取文件内容
|
|
|
* 2. 使用字节数组输出流缓存数据
|
|
|
* 3. 采用缓冲区分块读取,避免内存溢出
|
|
|
* 4. 返回完整的文件字节数组
|
|
|
*/
|
|
|
public static byte[] FileToByte(File file) throws IOException {
|
|
|
// 创建文件输入流,用于读取文件内容
|
|
|
@SuppressWarnings("resource") // 抑制资源未关闭警告(需要改进)
|
|
|
InputStream content = new FileInputStream(file);
|
|
|
|
|
|
// 创建字节数组输出流,用于缓存读取的数据
|
|
|
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
|
|
|
|
|
|
// 创建缓冲区,每次读取100字节
|
|
|
byte[] buff = new byte[100];
|
|
|
int rc = 0; // 实际读取的字节数
|
|
|
|
|
|
// 循环读取文件内容,直到文件末尾
|
|
|
while ((rc = content.read(buff, 0, 100)) > 0) {
|
|
|
// 将读取到的数据写入字节数组输出流
|
|
|
swapStream.write(buff, 0, rc);
|
|
|
}
|
|
|
|
|
|
// 获得完整的二进制数组并返回
|
|
|
return swapStream.toByteArray();
|
|
|
}
|
|
|
|
|
|
// 可以添加的增强方法:
|
|
|
|
|
|
/**
|
|
|
* 增强版文件转字节数组(使用try-with-resources自动关闭流)
|
|
|
*
|
|
|
* @param file 要转换的文件对象
|
|
|
* @return 文件的字节数组
|
|
|
* @throws IOException 当文件读取失败时抛出IO异常
|
|
|
*/
|
|
|
public static byte[] fileToByteSafe(File file) throws IOException {
|
|
|
// 使用try-with-resources确保流正确关闭
|
|
|
try (FileInputStream content = new FileInputStream(file);
|
|
|
ByteArrayOutputStream swapStream = new ByteArrayOutputStream()) {
|
|
|
|
|
|
// 使用更大的缓冲区提高读取效率(8KB)
|
|
|
byte[] buff = new byte[8192];
|
|
|
int rc = 0;
|
|
|
|
|
|
// 循环读取文件内容
|
|
|
while ((rc = content.read(buff)) != -1) {
|
|
|
swapStream.write(buff, 0, rc);
|
|
|
}
|
|
|
|
|
|
return swapStream.toByteArray();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 文件转字节数组(指定缓冲区大小)
|
|
|
*
|
|
|
* @param file 要转换的文件对象
|
|
|
* @param bufferSize 缓冲区大小(字节)
|
|
|
* @return 文件的字节数组
|
|
|
* @throws IOException 当文件读取失败时抛出IO异常
|
|
|
*/
|
|
|
public static byte[] fileToByte(File file, int bufferSize) throws IOException {
|
|
|
try (FileInputStream content = new FileInputStream(file);
|
|
|
ByteArrayOutputStream swapStream = new ByteArrayOutputStream()) {
|
|
|
|
|
|
byte[] buff = new byte[bufferSize];
|
|
|
int rc = 0;
|
|
|
|
|
|
while ((rc = content.read(buff)) != -1) {
|
|
|
swapStream.write(buff, 0, rc);
|
|
|
}
|
|
|
|
|
|
return swapStream.toByteArray();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取文件大小(字节数)
|
|
|
*
|
|
|
* @param file 文件对象
|
|
|
* @return 文件大小(字节)
|
|
|
*/
|
|
|
public static long getFileSize(File file) {
|
|
|
if (file.exists() && file.isFile()) {
|
|
|
return file.length();
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 验证文件是否存在且可读
|
|
|
*
|
|
|
* @param file 文件对象
|
|
|
* @return 文件是否可读
|
|
|
*/
|
|
|
public static boolean isFileReadable(File file) {
|
|
|
return file != null && file.exists() && file.isFile() && file.canRead();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 将字节数组保存为文件
|
|
|
*
|
|
|
* @param data 字节数组
|
|
|
* @param file 目标文件
|
|
|
* @throws IOException 当文件写入失败时抛出IO异常
|
|
|
*/
|
|
|
public static void byteToFile(byte[] data, File file) throws IOException {
|
|
|
try (java.io.FileOutputStream fos = new java.io.FileOutputStream(file)) {
|
|
|
fos.write(data);
|
|
|
fos.flush();
|
|
|
}
|
|
|
}
|
|
|
} |