所以基本上我正在读一个有很多行的文本文件。我需要从文本文件中提取某些行,并将这些特定行添加到字符串数组中。我一直试图将每个newLine拆分为:“\ n”,“\ r”。这没用。我也一直收到这个错误:
线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:1 在A19010.main(A19010.java:47)
以下是代码:
Path objPath = Paths.get("dirsize.txt");
if (Files.exists(objPath)){
File objFile = objPath.toFile();
try(BufferedReader in = new BufferedReader(
new FileReader(objFile))){
String line = in.readLine();
while(line != null){
String[] linesFile = line.split("\n");
String line0 = linesFile[0];
String line1 = linesFile[1];
String line2 = linesFile[2];
System.out.println(line0 + "" + line1);
line = in.readLine();
}
}
catch(IOException e){
System.out.println(e);
}
}
else
{
System.out.println(
objPath.toAbsolutePath() + " doesn't exist");
}
答案 0 :(得分:3)
String[] linesFile = new String[] {line}; // this array is initialized with a single element
String line0 = linesFile[0]; // fine
String line1 = linesFile[1]; // not fine, the array has size 1, so no element at second index
String line2 = linesFile[2];
您正在使用一个元素String[] linesFile
创建line
,但之后尝试访问索引1和2处的元素。这将为您提供ArrayIndexOutOfBoundsException
你实际上并没有在这里拆分任何东西。正如方法所说,in.readLine();
从文件中读取整行。
编辑:您可以动态地将行(字符串)添加到列表而不是数组,因为您不知道大小。
List<String> lines = new LinkedList<String>(); // create a new list
String line = in.readLine(); // read a line at a time
while(line != null){ // loop till you have no more lines
lines.add(line) // add the line to your list
line = in.readLine(); // try to read another line
}
答案 1 :(得分:3)
readLine()
方法从输入中读取整行,但从中删除newLine字符。在\n
字符上拆分行时,您将无法在字符串中找到一行。因此,你得到了例外。
答案 2 :(得分:0)
您正在使用1个元素(即line)初始化String数组。 linesFile [0]因此是行,并且数组的其余部分超出范围。
答案 3 :(得分:0)
试试这个:
String[] linesFile = line.split("SPLIT-CHAR-HERE");
if(linesFile.length >= 3)
{
String line0 = linesFile[0];
String line1 = linesFile[1];
String line2 = linesFile[2];
// further logic here
}else
{
//handle invalid lines here
}
答案 4 :(得分:0)
您正在使用数组来存储字符串。而是使用Java中的ArrayList
作为ArrayList动态增长。在您的读取操作完成后将其转换为数组。
String line = in.readLine();
ArrayList<String> str_list = new ArrayList<String>();
String[] strArr = new String[str_list.size()];
while(line != null){
str_list.add(line);
line = in.readLine();
}
// at the end of the operation convert Arraylist to array
return str_list.toArray(strArr);
答案 5 :(得分:0)
这里的问题是,每次解析器读入新行时,您都要创建一个新的String
数组。然后,您只使用正在读入的String
填充该line
数组中的第一个元素:
String[] linesFile = new String[] {line};
由于每次String[]
循环从顶部开始运行时都会创建一个包含一个元素的新while
,因此会丢失从上一次迭代中存储的值。
解决方案是在进入while循环之前使用new String[];
。如果您不知道如何使用ArrayList
,那么我建议使用这样的while循环:
int numberOfLine = 0;
while (in.readLine() != null)
{
numberOfLine++;
}
String linesFile = new String[numberOfLine];
这样可以避免使用动态调整大小的ArrayList
,因为您知道文件包含多少行来自上面的while循环。然后你会保留一个额外的计数器(或重新使用numberOfLine
,因为我们已经不再使用它了)所以你可以填充这个数组:
numberOfLine = 0;
in = new BufferedReader(new FileReader(objFile)); // reset the buffer
while ((String line = in.readLine()) != null)
{
linesFile[numberOfLine] = line;
numberOfLine++;
}
此时linesFile
应正确填充文件中的行,以便linesFile[i]
可用于访问文件中的第i行。