扫描程序无法从zipinputstream中读取数据

时间:2019-08-16 00:41:12

标签: java java.util.scanner zipinputstream

我有一段代码可以从zipInputStream读取CSV文件。我正在尝试读取zipInputStream的所有条目,因此,如果有txt,pdf。我不需要它们,应该只有一个CSV文件留下深刻印象的zip文件,如果没有,则抛出错误。

int CSVFile = 0;
Scanner scanner = null;
String line = "";
while((entry = zipinputstream.getNextEntry())!=null){
  if(entry.getName.endsWith(".csv")){
    CSVFile += 1;
    scanner = new Scanner(zipinputstream);
  }
}
if(CSVFile > 1 || CSVFile == 0){
  throw new Exception("error");
}
if(scanner.hasNextLine()){
 System.out.println(scanner.nextLine()); 
} else {
  throw new Exception("there is no newline")
}

但是,我已经用pdf和CSV表示的zip文件对它进行了测试,CSV不为空。它应该打印出一个新行,但是却给我“没有换行”。我没有看到任何逻辑问题吗?

1 个答案:

答案 0 :(得分:-1)

尝试此代码。它接受zip文件的路径,并返回其中包含CSV文件内容的字节数组。如果ZIP内还有更多文件或找不到CSV文件,则会引发异常。

public byte[] readCSVFileAsInputStream(String filePath) {
  File file = new File(filePath);

  try (ZipFile zipFile = new ZipFile(file))
  {
     Enumeration<? extends ZipEntry> entries = zipFile.entries();
     ZipEntry entry = entries.nextElement();

     if(entry == null){
        throw new IllegalArgumentException("no files found inside: " + filePath);
     }

     if (entries.hasMoreElements())
     {
        throw new IllegalArgumentException("only one CSV file is accepted inside: " + filePath);
     }

     if (!FilenameUtils.getExtension(entry.getName()).equalsIgnoreCase("csv"))
     {
        throw new IllegalArgumentException("only one CSV file is accepted inside: " + filePath);
     }

     try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream())
     {
        IOUtils.copy(zipFile.getInputStream(entry), byteArrayOutputStream);
        return byteArrayOutputStream.toByteArray();
     }
  }
  catch (IOException exception)
  {
     throw new UncheckedIOException(MessageFormat.format("error while reading {0}", filePath), exception);
  }}