【问题标题】:Good way to avoid java.lang.IndexOutOfBoundsException, when joining a list加入列表时避免 java.lang.IndexOutOfBoundsException 的好方法
【发布时间】:2017-06-09 13:40:17
【问题描述】:

所以我试图将一个相当大的 XML 文件读入一个字符串。目前加入 .readLines() 列表,如下所示:

def is = zipFile.getInputStream(entry)
def content = is.getText('UTF-8')
def xmlBodyList = content.readLines()
return xmlBodyList[1..xmlBodyList.size].join("")

但是我在控制台中得到了这个输出:

java.lang.IndexOutOfBoundsException: toIndex = 21859

我不需要关于 IndexOutOfBoundsExceptions 的任何解释,但我很难弄清楚如何围绕这个问题进行编程。

我怎样才能以不同的方式实现它,以便允许足够大的文件大小?

【问题讨论】:

  • 文件有多大?你不能直接把文件内容读成文本吗?
  • 这似乎是系统其他地方的一些错误。不接受该格式。至于文件大小。它非常大。我现在不能告诉你到底有多大。但如果这很重要,我可以回过头来。
  • 因为content = new File(filename).getText('utf-8') 会获取文件内容。希望你能知道。所以无需阅读线条并加入它们。
  • 我知道,但我想删除加入的第一行(问题中不清楚)
  • 这是读取行并重新加入字符串的唯一原因吗? max string size。是不是第一行有列名的数据文件?

标签: file arraylist groovy indexoutofboundsexception


【解决方案1】:

关于Good way to avoid java.lang.IndexOutOfBoundsException

错误在这里:

return xmlBodyList[1..xmlBodyList.size].join("")

在访问之前检查变量的好方法,您可以使用相对范围访问器:

assert xmlBodyList.size>1  //check value
return xmlBodyList[1..-1].join("")  //use relative indexes -1 = the last one

关于large files processing

如果您需要遍历所有行并执行一些操作,这里是一个示例:

def stream = zipFile.getInputStream(entry)
stream.eachLine("UTF-8"){line, index->
    if(index>1){ //skip first line
        //do something here with each line from file
        println "$line $index"
    }
}

在 java.io.InputStream 上有很多额外的 groovy 方法可以帮助您处理大文件而不将其加载到内存中:

http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/InputStream.html

【讨论】:

  • 这如何回答Good way to avoid java.lang.IndexOutOfBoundsException, when joining a list的问题
  • 我发现这个问题不是在加入列表中,而是在构建子列表中。关于您的问题Good way to avoid java.lang.IndexOutOfBoundsException:我建议使用相对访问器来最小化错误xmlBodyList[1..-1] 在这种情况下唯一剩下的错误是xmlBodyList 包含一个或零个元素,可以通过以下代码覆盖:assert xmlBodyList.size>1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2017-05-16
  • 1970-01-01
  • 2014-02-13
  • 2023-03-07
  • 2020-02-17
相关资源
最近更新 更多