关于阅读 java 中的 ZipInputStream/ZipEntry 的问题
Question about reading from a ZipInputStream/ZipEntry in java
场景:我有调用 soap Web 服务的代码,获取一个 zip 文件附件。然后解压,遍历所有文件,得到一个我想要的文件,是一个csv文件,得到csv文件的内容:
public static void unzipTry2(AttachmentPart att) throws IOException, SOAPException {
try (ZipInputStream zis = new ZipInputStream(att.getRawContent())) {
byte[] buffer = new byte[1024];
for (ZipEntry zipEntry = zis.getNextEntry(); zipEntry != null; zipEntry = zis.getNextEntry()) {
if (zipEntry.isDirectory()) {
continue;
}
if (!zipEntry.getName().equals("FileIwant.csv")) {
continue; //if it's not the file I want, skip this file
}
System.out.println(zipEntry.getName());
for (int len = zis.read(buffer); len > 0; len = zis.read(buffer)) {
//System.out.write(buffer, 0, len);
String testString = new String(buffer,0,len);
processCSVString(testString);
}
}
}
}
它工作得很好。然而,我得到的 CSV 文件只包含一行,这是现在预期的,但将来它可能包含多行。由于它是一个 CSV 文件,我需要逐行解析。此代码还必须适用于 CSV 文件包含多行的情况,这就是我不确定它是否有效的地方,因为无法测试它(我不控制此方法的输入,所有来自网络服务)。
你能告诉我内部for循环是否逐行读取文件的内容吗? :
for (int len = zis.read(buffer); len > 0; len = zis.read(buffer)) {
//System.out.write(buffer, 0, len);
String testString = new String(buffer,0,len);
processCSVString(testString);
}
BufferedReader
is the Java "thing" which can read a Reader
line-by-line. And the glue what you need is InputStreamReader
。然后你可以将 ZipInputStream
包装为
BufferedReader br=new BufferedReader(new InputStreamReader(zis))
(最好在 try-with-resources 块中),从 BufferedReader
读取的经典循环如下所示:
String line;
while((line=br.readLine())!=null){
<process one line>
}
场景:我有调用 soap Web 服务的代码,获取一个 zip 文件附件。然后解压,遍历所有文件,得到一个我想要的文件,是一个csv文件,得到csv文件的内容:
public static void unzipTry2(AttachmentPart att) throws IOException, SOAPException {
try (ZipInputStream zis = new ZipInputStream(att.getRawContent())) {
byte[] buffer = new byte[1024];
for (ZipEntry zipEntry = zis.getNextEntry(); zipEntry != null; zipEntry = zis.getNextEntry()) {
if (zipEntry.isDirectory()) {
continue;
}
if (!zipEntry.getName().equals("FileIwant.csv")) {
continue; //if it's not the file I want, skip this file
}
System.out.println(zipEntry.getName());
for (int len = zis.read(buffer); len > 0; len = zis.read(buffer)) {
//System.out.write(buffer, 0, len);
String testString = new String(buffer,0,len);
processCSVString(testString);
}
}
}
}
它工作得很好。然而,我得到的 CSV 文件只包含一行,这是现在预期的,但将来它可能包含多行。由于它是一个 CSV 文件,我需要逐行解析。此代码还必须适用于 CSV 文件包含多行的情况,这就是我不确定它是否有效的地方,因为无法测试它(我不控制此方法的输入,所有来自网络服务)。
你能告诉我内部for循环是否逐行读取文件的内容吗? :
for (int len = zis.read(buffer); len > 0; len = zis.read(buffer)) {
//System.out.write(buffer, 0, len);
String testString = new String(buffer,0,len);
processCSVString(testString);
}
BufferedReader
is the Java "thing" which can read a Reader
line-by-line. And the glue what you need is InputStreamReader
。然后你可以将 ZipInputStream
包装为
BufferedReader br=new BufferedReader(new InputStreamReader(zis))
(最好在 try-with-resources 块中),从 BufferedReader
读取的经典循环如下所示:
String line;
while((line=br.readLine())!=null){
<process one line>
}