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

File 加入列表时避免java.lang.IndexOutOfBoundsException的好方法,file,arraylist,groovy,indexoutofboundsexception,File,Arraylist,Groovy,Indexoutofboundsexception,所以我试图将一个相当大的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.IndexOutO

所以我试图将一个相当大的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

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


我如何以不同的方式实现这一点,以便允许足够大的文件大小

关于
避免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
关于
大文件处理

如果需要遍历所有行并执行某些操作,以下是一个示例:

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方法可以帮助您处理大型文件,而无需将其加载到内存中:


文件有多大?难道你不能让用户直接将文件内容读入文本吗?这似乎是系统中其他地方的一些错误。不接受该格式。至于文件大小。它很大。我不能告诉你现在到底有多大。但是如果这很重要的话,我还可以回去。因为
content=newfile(filename)。getText('utf-8')
将获取文件内容。希望你知道。所以不需要读取行并将它们连接起来。我知道,但我想删除带有连接的第一行(问题中不清楚),这是读取行并将其连接回字符串的唯一原因吗。它是一种列名称在第一行的数据文件吗?这如何回答问题
在加入列表时避免java.lang.IndexOutOfBoundsException的好方法。关于您的问题
避免java.lang.IndexOutOfBoundsException的好方法
:我建议使用相对访问器,以最大限度地减少错误
xmlBodyList[1..-1]
在这种情况下剩下的唯一错误是
xmlBodyList
包含一个或零个元素,下面的代码可以涵盖这一点:
assert-xmlBodyList.size>1