如何通过带有相对路径的getResourceAsStream读取zip文件?

时间:2018-11-20 01:52:00

标签: java maven zip inputstream

我曾经使用此方法读取maven的resources /目录中的文本文件,以便可以使用相对路径:

public static BufferedReader fileReaderAsResource(String filePath) throws IOException {
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
        if (is == null) {
            throw new FileNotFoundException(" Not found: " + filePath);
        }
        return new BufferedReader(new InputStreamReader(is, DEFAULT_ENCODING));
    }

现在,由于大小原因,我需要阅读zip文件,但我仍想使用“ resources”目录中文件的相对路径。有办法吗?

我有这种方法来读取zip文件,但是它只能通过绝对路径读取文件:

public static BufferedReader fileZipReader(String fileName) throws IOException, URISyntaxException {
        URL zipUrl = IOUtils.class.getClassLoader().getResource(fileName);
        File zipFile = new File(zipUrl.toURI());
        ZipFile zip = new ZipFile(zipFile);
        for (Enumeration e = zip.entries(); e.hasMoreElements(); ) {
            ZipEntry zipEntry = (ZipEntry) e.nextElement();
            if (!zipEntry.isDirectory()) {
                return new BufferedReader(new InputStreamReader(zip.getInputStream(zipEntry)));
            }
        }
        throw new FileNotFoundException("File not found: " + fileName);
    }

如何通过相对于标准maven的resources /目录的相对路径读取zip文件?

1 个答案:

答案 0 :(得分:0)

您可以使用ZipInputStream包装InputStream,即:

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
if (is == null) {
    throw new FileNotFoundException(" Not found: " + filePath);
}
ZipInputStream zis = new ZipInputStream(is);

编辑:

使用上面称为“ fileReaderZipAsResource”的方法,我通常会读取文件:

try {
            BufferedReader br = fileReaderZipAsResource(qaFilePath);
            String line;
            while ((line = br.readLine()) != null) {
                if (line.isEmpty()) {
                    throw new RuntimeException("Invalid entry ... 2");
                }
                line = line.trim();
                textKGKB.add(line);
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

但是调试显示该程序没有进入循环。它只是简单地通过循环并继续逻辑,而不会抛出异常。我的文本文件是一个4列的文本文件,以Tab键分隔。我只是将其压缩并命名为xyy.zip,然后将其作为参数传递给上述方法。

出什么问题了? ZipInputStream的包装真的有效吗?