读取 nginx 服务的 CSV 文件时出错
Error reading CSV served by nginx
我正在使用 com.opencsv.CSVReader
从我的 nginx Web 服务器服务的 URL 读取 CSV。 CSV文件内容就是这样:
0.999,1.399,1.799,2.199,2.599,2.999,3.399,3.799,4.199,4.599,4.999,5.399
问题是,当我读取文件时,我没有得到任何 csv 值:
try (InputStreamReader in = new InputStreamReader(new URL(...csv).openStream(), "UTF-8"); CSVReader r = new CSVReader(in)) {
List<String[]> csv = r.readAll();
....
到此之后,csv已经取不到数据了(但是没有报错),csv.get(0).length
错误的是1
,一个空字符串。我不知道为什么。我为隔离问题所做的测试:
- 我已经尝试通过 http 和 https 从我的 nginx 获取文件,结果相似。我必须说这段代码不久前还运行良好,但现在却无缘无故地失败了。
我在阅读 csv 之前使用 BufferedReader
查看了 in
中的内容,我得到:
Date: Fri, 10 Aug 2018 03:11:13 GMT
Content-Type: text/plain
Content-Length: 71
Last-Modified: Wed, 12 Jul 2017 16:23:24 GMT
Connection: keep-alive
ETag: "..."
Strict-Transport-Security: max-age=31536000
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Accept-Ranges: bytes
0.999,1.399,1.799,2.199,2.599,2.999,3.399,3.799,4.199,4.599,4.999,5.399
所以我不确定 header 是否也被 csv reader 读取并以某种方式弄乱了它。
我使用相同的代码访问外部 CSV,而不是我的 nginx 提供的代码,它工作正常,使用 BufferedReader
和外部 CSV 的测试没有显示任何 header,仅显示 csv 值。
这就是为什么我也在考虑这可能是一个 nginx 问题,因为我最近也遇到了文件未完成下载的错误,我不得不将我之前工作正常的 keepalive_timeout 65
更改为 keepalive_timeout 0
。不知道为什么突然就这样了。
这很难调试,但解决方案是重新安装 nginx,因为我的副本已损坏。我的 nginx 实例正在发送额外的 \r
个字符,这些字符不会干扰 curl
或类似的但会中断 Java 实现。
顺便说一句 - 这可能突出了 .openStream()
实现中的一个错误。
我正在使用 com.opencsv.CSVReader
从我的 nginx Web 服务器服务的 URL 读取 CSV。 CSV文件内容就是这样:
0.999,1.399,1.799,2.199,2.599,2.999,3.399,3.799,4.199,4.599,4.999,5.399
问题是,当我读取文件时,我没有得到任何 csv 值:
try (InputStreamReader in = new InputStreamReader(new URL(...csv).openStream(), "UTF-8"); CSVReader r = new CSVReader(in)) {
List<String[]> csv = r.readAll();
....
到此之后,csv已经取不到数据了(但是没有报错),csv.get(0).length
错误的是1
,一个空字符串。我不知道为什么。我为隔离问题所做的测试:
- 我已经尝试通过 http 和 https 从我的 nginx 获取文件,结果相似。我必须说这段代码不久前还运行良好,但现在却无缘无故地失败了。
我在阅读 csv 之前使用
BufferedReader
查看了in
中的内容,我得到:Date: Fri, 10 Aug 2018 03:11:13 GMT Content-Type: text/plain Content-Length: 71 Last-Modified: Wed, 12 Jul 2017 16:23:24 GMT Connection: keep-alive ETag: "..." Strict-Transport-Security: max-age=31536000 X-Frame-Options: DENY X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Accept-Ranges: bytes 0.999,1.399,1.799,2.199,2.599,2.999,3.399,3.799,4.199,4.599,4.999,5.399
所以我不确定 header 是否也被 csv reader 读取并以某种方式弄乱了它。
我使用相同的代码访问外部 CSV,而不是我的 nginx 提供的代码,它工作正常,使用
BufferedReader
和外部 CSV 的测试没有显示任何 header,仅显示 csv 值。
这就是为什么我也在考虑这可能是一个 nginx 问题,因为我最近也遇到了文件未完成下载的错误,我不得不将我之前工作正常的 keepalive_timeout 65
更改为 keepalive_timeout 0
。不知道为什么突然就这样了。
这很难调试,但解决方案是重新安装 nginx,因为我的副本已损坏。我的 nginx 实例正在发送额外的 \r
个字符,这些字符不会干扰 curl
或类似的但会中断 Java 实现。
顺便说一句 - 这可能突出了 .openStream()
实现中的一个错误。