一、獲取檔案大小
1、透過file的length()方法獲取;
二、檔案大小轉換
bytes--> KB,MB,GB,TB
/** * 轉換檔案大小 */ public static String formatFileSize(long fileSize) { DecimalFormat df = new DecimalFormat("#.00"); String fileSizeString = ""; String wrongSize = "0B"; if (fileSize == 0) { return wrongSize; } if (fileSize < 1024) { fileSizeString = df.format((double) fileSize) + "B"; } else if (fileSize < 1048576) { fileSizeString = df.format((double) fileSize / 1024) + "KB"; } else if (fileSize < 1073741824) { fileSizeString = df.format((double) fileSize / 1048576) + "MB"; } else if (fileSize < 1099511627776L){ fileSizeString = df.format((double) fileSize / 1073741824) + "GB"; }else { fileSizeString = df.format((double) fileSize / 1099511627776L) + "TB"; } return fileSizeString; }
三、OOM問題
首先要排查SpringMvc的配置檔案中對檔案上傳大小的限制是否過於小,未達到要求。
如果排查過配置檔案沒有問題後,那就去排查是否是tomcat的JVM記憶體設定過小導致記憶體溢位。
域名設定的大小
https://blog.csdn.net/Acompanys/article/details/105434370
其他文章:
https://blog.csdn.net/liyantianmin/article/details/45557609?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=2
四、判斷檔案型別
1. 透過字尾名,如exe,jpg,bmp,rar,zip等等。
2. 透過上傳請求的Content-type來判斷。
3. 透過檔案頭,根據檔案流中特定的一些位元組標識來區分不同型別的檔案。
對比:1和2的方式很容易被篡改,安全性低;3安全性更高
五、讀取檔案
5.1 讀到記憶體中
// 方法一:Files 是最簡潔直接的方式,一次性將檔案內容全部讀入記憶體,適用於檔案大小適中時 Files.readAllBytes(Paths.get("path/to/your/file.txt")) // 方法二:BufferedReader 和 Scanner 適用於逐行讀取檔案內容,尤其是當檔案較大時,避免一次性讀入記憶體 //方法三:Apache Commons IO 庫的 FileUtils工具類 byte[] fileContent = FileUtils.readFileToByteArray(new File("path/to/your/file.txt"));
5.2 讀到快取中(BufferReader),從快取中取資料
private String readFile(String file) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader (file));
String line = null;
StringBuilder stringBuilder = new StringBuilder();
String ls = System.getProperty("line.separator");
try {
while((line = reader.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append(ls);
}
return stringBuilder.toString();
} finally {
reader.close();
}
}
優點:比需要的時候再去檔案中讀取要快一些
5.3 使用工具類
public static List<String> readAllLines(Path path) throws IOException { return readAllLines(path, StandardCharsets.UTF_8); }