扫描仪和多线程问题?

时间:2015-03-06 06:27:50

标签: java multithreading java.util.scanner

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

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)

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

在我看来,您想要做的是将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);
    }
}