Java gzip输入流:Can';t逐行正确读取联机.gz文件

Java gzip输入流:Can';t逐行正确读取联机.gz文件,java,http,gzip,Java,Http,Gzip,我想逐行读取通过HTTP访问的GZIP文件(包括数千个数字id); 这是我目前的做法: BufferedReader br = null; List<Long> list = Lists.newArrayList(); URL url = new URL("xx.gz"); try{ br = new BufferedReader(new InputStreamReader(new GZIPInputStream(url.openStream()))); String l

我想逐行读取通过HTTP访问的GZIP文件(包括数千个数字id); 这是我目前的做法:

BufferedReader br = null;
List<Long> list = Lists.newArrayList();
URL url = new URL("xx.gz");
try{
   br = new BufferedReader(new InputStreamReader(new GZIPInputStream(url.openStream())));
   String line = null;
   while ((line = br.readLine()) != null){
       if (NumberUtils.isDigits(line)) {
           try {
               list.add(Long.valueOf(line));
           }catch (Exception e){
               logger.error("parse line:{} error:",line,e);
               continue;
           }
           if (list.size() == 20) {
             //batch handle
             list = Lists.newArrayList();
           }
       }
   }
}catch (Exception e){
   logger.error("handle file error:",e);
}finally {
   if(br != null){
      br.close();
   }
}
BufferedReader br=null;
List=Lists.newArrayList();
URL=新URL(“xx.gz”);
试一试{
br=新的BufferedReader(新的InputStreamReader(新的GZIPInputStream(url.openStream()));
字符串行=null;
而((line=br.readLine())!=null){
if(数字、数字、数字(行)){
试一试{
列表.添加(长值(行));
}捕获(例外e){
错误(“解析行:{}错误:”,行,e);
继续;
}
如果(list.size()==20){
//批处理
list=Lists.newArrayList();
}
}
}
}捕获(例外e){
logger.error(“处理文件错误:”,e);
}最后{
如果(br!=null){
br.close();
}
}
我发现很多“parse line”错误日志导致line大于Long.MaxValue(例如:103521945184172191946275178081807324456159564650138943);当我下载GZIP文件时,发现没有比Long.MaxValue更大的行

JAVA版本:1.8

操作系统版本:CentOS 6.9版(最终版)

前几百行可以正确读取,然后日志显示读取的无序NUM在文件中不存在

经过一些测试,在互联网上获得了一些信息

我猜服务器快速地将文件推送到内存中,然后客户端缓慢地读取和处理,这可能会导致内存泄漏。然后,服务器在tcp连接仍处于活动状态时主动关闭。此时,客户端可能会获取错误数据,直到读取内存中的所有数据

最后,这是我在stackoverflow中的第一个问题,很抱歉缺乏标准化的表示

我发现很多“解析行”错误日志,原因是行大于
Long.MaxValue
(例如:
103521945184172191946275178081807324456159564650138943

错误来自以下几行:

   if (NumberUtils.isDigits(line)) {
       try {
           list.add(Long.valueOf(line));
       }catch (Exception e){
           logger.error("parse line:{} error:",line,e);
           continue;
       }
       ...
   }
首先,您的诊断不正确。问题不是因为大于
Long.MaxValue
的行造成的。问题是这些行表示大于
Long.MaxValue
的数字。这导致
Long.valueOf
失败

因此,这不是GZipStream、HTTP、下载、文件编码或评论员猜测的其他问题,也不是(实际上)行太长的问题(该行只有55个字符)

问题可能是您选择了错误的方式来表示从文件中读取的数字(显然是有效的)

那么您应该使用什么表示法呢

这取决于这些数字的含义:

  • 如果它们确实是整数,请使用
    biginger
  • 如果它们实际上是以某种方式“叠加在一起”的多个整数,您可以尝试解析它们。这假设您了解格式和/或“叠加”过程
  • 如果它们实际上是某种标识符,请使用
    String

或者,生成您正在读取的文件的软件中可能存在错误。例如,可能(错误地)将两个或多个数字合并到一行中

但你应该比我们更了解这一点。我们不知道你的文件是什么意思……也不知道真正大的数字是否真的是有效数据



或者,可能是您误解了文件格式的说明、规格、示例、对话或其他内容。

压缩文件的真正正确内容是什么?可能无法识别新行字符(您从多行中得到一行数字)?当我尝试下载gzip文件并在本地读取文件时,它工作正常。但我仍然无法理解为什么不能使用stream process联机正确读取。每行都是一个带有行字符的num id(\n)文件使用UTF-8编码首先我使用LineIterator和UTF-8编码,然后得到相同的结果;代码是:LineIterator LineIterator=IOUtils.LineIterator(新的GZIPInputStream(url.openStream()),Charset.forName(“UTF-8”);我找到了如何重现这个问题。通过HTTP长时间读取GZIP文件(批处理花费一点时间).首先,它工作正常。几分钟后,逐行读取会出现错误。如果需要长时间阅读,建议先下载文件。但我仍然不知道它是如何发生的。