csvWriter在unix机器(tomcat服务器)上的行为有很大的文件(大小为5000 KB),它创建了空文件,相同的代码在Windows工作正常,为什么?

时间:2016-10-06 10:13:41

标签: java csv unix opencsv

我在csvWriter(Java)的帮助下编写csv文件,但在Unix Box上执行带有大量记录(大约9000)的代码时,它会创建空文件。 当我尝试在Windows上的本地(Eclipse)执行相同的代码时,它适用于相同的大文件。为什么?

我注意到一件事,如果记录大约是3000,那么它也可以在unix框中正常工作。

问题只有大文件。

我也尝试使用writer.writeNext()方法而不是writeAll(),但在UNIX Box中仍然遇到同样的问题。 :( 注意:文件没有任何特殊字符,它是英文的。

代码 - >

CSVReader reader = new CSVReader(new FileReader(inputFile), ',','"');
List<String[]> csvBody = reader.readAll();
int listSize = csvBody.size();
if(listSize > 0){
String renameFileNamePath = outputFolder + "//"+ existingFileName.replaceFirst("file1", "file2");
File newFile = new File(renameFileNamePath);
CSVWriter writer = new CSVWriter(new FileWriter(newFile), ',');

   for(int row=1 ; row < listSize; row++){
      String timeKeyOrTransactionDate = null;
      timeKeyOrTransactionDate = year+"-"+month+"-"+day+" 00:00:00";
      csvBody.get(row)[0] = timeKeyOrTransactionDate ; 
      }

//Write to CSV file which is open
writer.writeAll(csvBody);
writer.flush();
writer.close();
}
reader.close();

3 个答案:

答案 0 :(得分:2)

readAll和writeAll方法只应与小数据集一起使用 - 否则就像瘟疫一样避免使用它。请改用readNext和writeNext方法,这样就不必将整个文件读入内存。

  • 请注意,一旦您没有更多数据(Stream结束或文件结束),readNext将返回null。我将不得不更新javadocs来提及。

  • 免责声明 - 我是opencsv项目的维护者。所以请认真对待“避免瘟疫”。真的只是放在那里因为大多数文件通常都很小并且可以放在内存中,但是如果怀疑数据集有多大会避免将它全部放在内存中。

答案 1 :(得分:0)

数据错误。 Linux机器可能使用UTF-8 Unicode编码。这可能会在第一个遇到格式错误的UTF-8字节序列时抛出错误,单字节Windows编码只接受。

您正在使用旧的实用程序类FileWriter(也存在缺陷的Charset charset = Charset.forName("Windows-1252"); // Windows Latin-1 ),它使用默认的平台编码,这使得软件平台依赖。

你需要这样做:

BufferedReader br = Files.newBufferedReader(inputFile.toPath(), charset);

阅读

Path newFile = Paths.get(renameFileNamePath);
BufferedWriter bw = Files.newBufferedWriter(newFile, charset);
CSVWriter writer = new CSVWriter(bw, ',');

写作

 <groupId>this.that</groupId>
 <artifactId>build.root</artifactId>
 <name>A name</name>
 <packaging>pom</packaging>
 <modules>
  <module>../a.b</module>
  <module>../a.c</module>

以上假设采用单字节编码,但也可能适用于大多数其他单字节编码。

遗憾的是该文件不是UTF-8,允许任何脚本。

答案 2 :(得分:0)

问题已经解决。实际上输出目录也是通过加载器应用程序共享的,并且加载器在每分钟都保持检查文件,这就是为什么在编写csv文件之前,加载器选择它并在DB中加载零kb。 因此我使用缓冲编写器而不是文件编写器,并且首先在tmp文件中写入数据,然后用file2重命名它并且它工作。

感谢各位的帮助和宝贵的建议。