05 檔案操作

zhegeMaw發表於2024-08-15

一、獲取檔案大小

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);
    }