我曾经使用此方法读取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文件?
答案 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的包装真的有效吗?