加入列表时避免java.lang.IndexOutOfBoundsException的好方法

时间:2017-06-09 13:40:18

标签: file arraylist groovy indexoutofboundsexception

所以我试图将一个相当大的XML文件读入一个String。目前正在加入.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有任何解释,但我很难弄清楚如何围绕这个问题进行编程。

我如何以不同的方式实现它,因此它允许足够大的文件大小?

1 个答案:

答案 0 :(得分: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