Java csvWriter在unix机器(tomcat服务器)上处理大文件(大小5000 KB)时表现不同,它会创建空文件,同样的代码在windows上工作正常,为什么?

Java csvWriter在unix机器(tomcat服务器)上处理大文件(大小5000 KB)时表现不同,它会创建空文件,同样的代码在windows上工作正常,为什么?,java,csv,unix,opencsv,Java,Csv,Unix,Opencsv,我是在csvWriter(Java)的帮助下编写csv文件的,但在Unix Box上使用大量记录(约9000条)执行代码时,它会创建空文件。 当我尝试在本地(Eclipse)和windows上执行相同的代码时,它可以很好地处理相同的大文件。为什么? 我注意到一件事,若记录在3000左右,那个么它在unix机器上也可以正常工作 问题是只有巨大的文件 我也尝试使用writer.writeNext()方法代替writeAll(),但在UNIX Box中仍然发现了相同的问题:( 注意:文件没有任何特殊字

我是在csvWriter(Java)的帮助下编写csv文件的,但在Unix Box上使用大量记录(约9000条)执行代码时,它会创建空文件。 当我尝试在本地(Eclipse)和windows上执行相同的代码时,它可以很好地处理相同的大文件。为什么?

我注意到一件事,若记录在3000左右,那个么它在unix机器上也可以正常工作

问题是只有巨大的文件

我也尝试使用writer.writeNext()方法代替writeAll(),但在UNIX Box中仍然发现了相同的问题:( 注意:文件没有任何特殊字符,它是英文的

代码-->

CSVReader reader=new CSVReader(新文件读取器(inputFile),',','”;
List csvBody=reader.readAll();
int listSize=csvBody.size();
如果(列表大小>0){
字符串重命名FileNamePath=outputFolder+“/”+existingFileName.replaceFirst(“文件1”、“文件2”);
File newFile=新文件(重命名FileNamePath);
CSVWriter writer=new-CSVWriter(newfilewriter(newFile),',');
for(int row=1;row
一个数据错误。linux机器可能使用UTF-8 Unicode编码。这可能会在第一次遇到格式错误的UTF-8字节序列时引发错误,Windows编码只接受单字节

您使用的是旧的实用程序类
文件读取器
(也存在有缺陷的
文件编写器
),它使用默认的平台编码,这使得软件平台依赖

您需要执行以下操作:

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, ',');
以上假设采用单字节编码,但可能也适用于大多数其他单字节编码


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

数据错误。linux机器可能使用UTF-8 Unicode编码。这可能会在第一次遇到格式错误的UTF-8字节序列时引发错误,单字节Windows编码可以接受

您使用的是旧的实用程序类
文件读取器
(也存在有缺陷的
文件编写器
),它使用默认的平台编码,这使得软件平台依赖

您需要执行以下操作:

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, ',');
以上假设采用单字节编码,但可能也适用于大多数其他单字节编码


遗憾的是,该文件没有UTF-8格式,不允许使用任何脚本。

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

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

  • 免责声明-我是opencsv项目的维护者。因此,请认真对待“避免类似瘟疫”的问题。实际上,这只是因为大多数文件通常很小,可以放入内存中,但如果对数据集的大小有疑问,请避免将其全部放入内存中


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

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

  • 免责声明-我是opencsv项目的维护者。因此,请认真对待“避免类似瘟疫”的问题。实际上,这只是因为大多数文件通常很小,可以放入内存中,但如果对数据集的大小有疑问,请避免将其全部放入内存中


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


感谢大家的帮助和宝贵的建议。

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


感谢大家的帮助和宝贵的建议。

reader.readAll()
“巨大的“文件?我想不是……既然你是在复制文件,为什么还要使用OpenCSV?此外,你的资源管理非常糟糕;现在是2016年,请使用
尝试使用资源
。现在从OpenCSV更改为任何其他csv支持库都为时已晚。我在这里进行了远程调试,直到writer.writeAll(csvBody)注意到csvBody列表包含所有9000条记录和代码get execute SUCCESS。但是当我在UNIX机器上检查文件时,它是空的,为什么(为什么您需要CSV库?您只是在复制一个文件。您的评论与我所说的有什么关系?这似乎是我的代码中的问题,但无法识别它。因为相同的代码在Windows(在Eclipse)下工作正常。)对于同一文件,仅在Unix计算机上观察到问题。您正在将一个大文件读入内存;除非您将
Xmx
设置为某个大值,否则您的应用程序将崩溃。由于