扫描仪和多线程问题?

Scanner and Multithreading issues?

我有以下代码来读取整个文件数据:

calling method(String zipFile){
            ZipInputStream zis =
                new ZipInputStream(new FileInputStream(zipFile));
            //get the zipped file list entry
            ZipEntry ze = zis.getNextEntry();
            while (ze != null) {
                String fileName = ze.getName();

            File newFile =
                new File(Constants.OUTPUT_FOLDER + File.separator +
                         fileName);

            if (ze.isDirectory()) {
                new File(newFile.getParent()).mkdirs();
            } else {
                new File(newFile.getParent()).mkdirs();
                            createBlobDomain(zFile,ze);

                }
            }
            ze = zis.getNextEntry();
        }

        zis.closeEntry();
        zis.close();
}


public String method(ZipFile zf, ZipEntry ze){
scan = new Scanner(zf.getInputStream(ze));
if(scan.hasNext())
    fullText = scan.useDelimiter("\A").next();
return fullText;
}

请从编译的角度忽略它,因为我删除了一些与此处无关的代码。当来自 webapp 的 运行 作为单个实例时,它工作正常。但是我 运行 它同时来自两个不同的浏览器,然后我遇到了以下异常。请告知可能出了什么问题以及如何解决它。

java.util.InputMismatchException
  at java.util.Scanner.throwFor(Scanner.java:840)
  at java.util.Scanner.next(Scanner.java:1347)

我认为 scan = new Scanner(zf.getInputStream(ze)); 行造成了问题。我从你的代码中了解到 scan 是一个实例变量,你正在为每个线程分配一个 new Scanner 。我建议在您的方法中将其作为局部变量。如果我误解了什么,请纠正我。

Scanner scan = new Scanner(zf.getInputStream(ze))

在我看来,您想要做的是将 zip 的内容复制到给定的文件夹中。

如果你使用Java 7+,其实很简单;此代码使用 java7-fs-more 来帮助您完成工作:

public static void extractZip(final String zipfile, final String dstdir)
    throws IOException
{
    final Map<String, ?> env = Collections.singletonMap("readonly", "true);
    final Path path = Paths.get(zipfile);
    final URI uri = URI.create("jar:" + path.toUri());

    try (
        final FileSystem zipfs = FileSystems.newFileSystem(uri, env);
    ) {
        MoreFiles.copyRecursive(zipfs.getPath("/"), Paths.get(dstdir),
            RecursionMode.FAIL_FAST);
    }
}