gpt4 book ai didi

java - BufferedReader readLine 返回 null

转载 作者:行者123 更新时间:2023-12-02 09:59:51 24 4
gpt4 key购买 nike

我有一个 zip 文件,其中包含我想要读取的 9 个文件。所以我实现了以下功能:

public static Map<String, BufferedReader> unzipFile(InputStream zippedFile) throws IOException {
ZipInputStream zipInputStream = new ZipInputStream(zippedFile);
HashMap<String, BufferedReader> result = new HashMap<>(9);
for (ZipEntry zipEntry = zipInputStream.getNextEntry(); zipEntry != null; zipEntry = zipInputStream.getNextEntry()) {
if (zipEntry.isDirectory()) {
continue;
}
result.put(zipEntry.getName(), new BufferedReader(new InputStreamReader(zipInputStream)));
}
return result;
}

同一类中的其他签名(调用相同的方法):

  public static Map<String, BufferedReader> unzipFile(String zippedFile) throws IOException {
return unzipFile(new File(zippedFile));
}

public static Map<String, BufferedReader> unzipFile(File zippedFile) throws IOException {
return unzipFile(new FileInputStream(zippedFile));
}

我的想法是得到Map从此方法返回并能够在我的代码的其他地方读取它。问题是每次我调用 result.get("filename").readLine()for在此方法中循环,它返回 null .

这是此方法的一个简单单元测试 - 目前在最后 Assert.assertNotNull 中失败:

  @Test
public void unzipFileTest() throws Exception {
Map<String, BufferedReader> result = FileHandlerUtility.unzipFile(TestUtil.FILE_SAMPLE_NAME);
Assert.assertNotNull(result);
Assert.assertEquals(result.size(), 9);
Assert.assertNotNull(result.get("Car.txt"));
Assert.assertNotNull(result.get("Client.txt"));
Assert.assertNotNull(result.get("Client.txt").readLine());
}

我猜想可能与创建的变量的范围有关,因为在调试时,我注意到我可以在 for 中获取文件的内容环形。但是,我不想将此 zip 提取方法与获取内容并解析它的方法混合在一起。另外,我不想将提取的文件保存到光盘并稍后重新打开它们。

那么,我该如何填写这个MapBufferedReader不会在 readLine 上返回 null来电?

最佳答案

ZipInputStream

每次迭代入口指针时,都会丢失入口指针,因为每个 ZipInputStream 对象只允许有一个流。

try (ZipInputStream is = new ZipInputStream(Zippy.class.getResourceAsStream("file.zip"))) {
ZipEntry entry;
while ((entry = is.getNextEntry()) != null) {
if (!entry.isDirectory()) {
// do your logic here (get the entry name)
}
is.closeEntry();
}
}

来自 javadocs:

closeEntry() -关闭当前 ZIP 条目并定位流以读取下一个条目。

getNextEntry() - Reads the next ZIP file entry and positions the stream at the beginning of the entry data.

基本上,您在任何给定时间只能打开一个条目。

因此,如果您想做您正在做的事情,您能做的最好的事情就是保存 zip 条目的名称并迭代 ZipInputStream 将指针移动到正确的位置,然后您可以使用 ZipInputStream.read()获取字节。

压缩文件

如果您可以使用 ZipFile 对象(而不是 ZipInputStream),您就可以完成您想要完成的任务。

 static void loadMap() throws IOException {
ZipFile file = new ZipFile("testzip.zip");
Enumeration<? extends ZipEntry> entries = file.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
if (!entry.isDirectory()) {
streamMap.put(entry.getName(), new BufferedReader(new InputStreamReader(file.getInputStream(entry))));
}

}

}

public static void main(String[] args) throws IOException {
loadMap();

Iterator<BufferedReader> iter = streamMap.values().iterator();
while (iter.hasNext()) {
BufferedReader reader = iter.next();
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
}


OUTPUT:
file 2: First line!
file 2: Second Line!
file 1: First line!
file 1 : Second Line!
BUILD SUCCESSFUL (total time: 0 seconds)

您只需记住保留 zip 文件引用并在完成后调用 file.close(); 即可。

关于java - BufferedReader readLine 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55716286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com