痞子374 2024-08-26 13:51 采纳率: 95%
浏览 5
已结题

Java获取指定文件大小

Java读取指定的文件,如果是压缩包就对它进行解压,加压后获取解压出来的文件大小,如果是文件或者文件夹,则直接获得大小,应该如何实现

  • 写回答

2条回答 默认 最新

  • 来一杯龙舌兰 优质创作者: 编程框架技术领域 2024-08-26 13:53
    关注

    以下内容为GPT与来一杯龙舌兰共同总结生成
    要实现这个功能,你可以使用 Java 的 java.util.zip 包来处理压缩包,和标准的文件操作来处理文件和文件夹。下面是一个示例代码,演示如何读取文件、检查它是否是压缩包、解压它并获取解压后的文件大小:

    import java.io.*;
    import java.util.zip.*;
    import java.nio.file.*;
    
    public class FileSizeCalculator {
    
        public static void main(String[] args) {
            File file = new File("path/to/your/file");
            try {
                long size = getFileSize(file);
                System.out.println("Size: " + size + " bytes");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static long getFileSize(File file) throws IOException {
            if (file.isDirectory()) {
                return getDirectorySize(file);
            } else if (file.isFile()) {
                if (isZipFile(file)) {
                    return getUnzippedFileSize(file);
                } else {
                    return file.length();
                }
            }
            throw new IllegalArgumentException("Unsupported file type");
        }
    
        private static boolean isZipFile(File file) throws IOException {
            try (FileInputStream fis = new FileInputStream(file);
                 BufferedInputStream bis = new BufferedInputStream(fis);
                 ZipInputStream zis = new ZipInputStream(bis)) {
                return zis.getNextEntry() != null;
            } catch (ZipException e) {
                return false;
            }
        }
    
        private static long getUnzippedFileSize(File zipFile) throws IOException {
            File tempDir = Files.createTempDirectory("temp").toFile();
            try (FileInputStream fis = new FileInputStream(zipFile);
                 ZipInputStream zis = new ZipInputStream(fis)) {
                ZipEntry entry;
                long totalSize = 0;
                while ((entry = zis.getNextEntry()) != null) {
                    File outFile = new File(tempDir, entry.getName());
                    if (!entry.isDirectory()) {
                        try (FileOutputStream fos = new FileOutputStream(outFile)) {
                            byte[] buffer = new byte[1024];
                            int len;
                            while ((len = zis.read(buffer)) > 0) {
                                fos.write(buffer, 0, len);
                            }
                            totalSize += outFile.length();
                        }
                    }
                    zis.closeEntry();
                }
                return totalSize;
            } finally {
                deleteRecursively(tempDir);
            }
        }
    
        private static long getDirectorySize(File dir) {
            return Files.walk(dir.toPath())
                        .mapToLong(p -> p.toFile().isFile() ? p.toFile().length() : 0)
                        .sum();
        }
    
        private static void deleteRecursively(File file) throws IOException {
            if (file.isDirectory()) {
                for (File subFile : file.listFiles()) {
                    deleteRecursively(subFile);
                }
            }
            Files.delete(file.toPath());
        }
    }
    

    代码解释

    1. 检查是否为压缩包

      • isZipFile 方法尝试读取文件并检查是否是 ZIP 格式。
    2. 解压并获取大小

      • getUnzippedFileSize 方法解压 ZIP 文件到临时目录,并计算所有解压文件的总大小。
    3. 获取文件或文件夹大小

      • getFileSize 方法根据文件类型决定使用不同的计算方法。
      • getDirectorySize 方法计算目录及其所有子文件的大小。
    4. 删除临时目录

      • deleteRecursively 方法删除临时目录及其内容。

    这个代码实现了你所需的功能,但需要注意处理大文件和性能问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月17日
  • 已采纳回答 9月9日
  • 创建了问题 8月26日