首页 > 解决方案 > Java ZipInputStream 在线程中中断,但不在主线程中

问题描述

我无法解决这个问题。以下代码完美运行:

public static void main(String[] args) {

    //new Thread(() -> {

        try {
            Path zipFile = Paths.get("C:\\path\\to\\zipfile.zip");
            Path outDir = Files.createDirectories(Paths.get("C:\\path\\to\\outDir"));

            try (ZipInputStream inputStream = new ZipInputStream(Files.newInputStream(zipFile))) {


                ZipEntry entry;
                while ((entry = inputStream.getNextEntry()) != null) {
                    Path outPath = outDir.resolve(entry.getName());
                    if (entry.isDirectory()) {
                        if (!Files.exists(outPath)) {
                            Files.createDirectory(outPath);
                        }
                    } else {
                        try (OutputStream outputStream = Files.newOutputStream(outPath)) {
                            inputStream.transferTo(outputStream);
                        }
                    }
                    System.out.println(entry.getName());
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    //}).start();

}

但是,取消注释线程代码会导致程序每次都挂在完全相同的文件上:

public static void main(String[] args) {

    new Thread(() -> {

        try {
            Path zipFile = Paths.get("C:\\path\\to\\zipfile.zip");
            Path outDir = Files.createDirectories(Paths.get("C:\\path\\to\\outDir"));

            try (ZipInputStream inputStream = new ZipInputStream(Files.newInputStream(zipFile))) {


                ZipEntry entry;
                while ((entry = inputStream.getNextEntry()) != null) {
                    Path outPath = outDir.resolve(entry.getName());
                    if (entry.isDirectory()) {
                        if (!Files.exists(outPath)) {
                            Files.createDirectory(outPath);
                        }
                    } else {
                        try (OutputStream outputStream = Files.newOutputStream(outPath)) {
                            inputStream.transferTo(outputStream);
                        }
                    }
                    System.out.println(entry.getName());
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }).start();

}

如果我尝试调试程序,它可以正常工作,只有在非调试模式下运行时,才会在线程内发生这种情况。此外,使用 Windows Explorer 和 7-Zip 可以毫无问题地提取 zip。我正在接近头发拉出水平,非常感谢任何帮助。

作为参考,我用于测试的 zip 文件(我正在开发 7 天的 mod 启动器)可以在这里找到:https ://github.com/KhaineGB/DarknessFallsBBM45/archive/refs/heads/大师.zip

标签: javamultithreadingzip

解决方案


推荐阅读