我正在通过文件进行非常基本的循环。该文件包含许多条目,但是,它似乎在第3个循环之后中断,它肯定包含超过25个字符。简单的循环如下:
public static void organiseFile() throws FileNotFoundException {
ArrayList<String> lines = new ArrayList<>();
String directory = "C:\\Users\\hussainm\\Desktop\\Files\\ex1";
Scanner fileIn = new Scanner(new File(directory + "_temp.txt"));
PrintWriter out = new PrintWriter(directory + "_ordered.txt");
while (fileIn.hasNextLine() == true) {
if (!fileIn.nextLine().isEmpty()) {
lines.add(fileIn.nextLine());
String test = fileIn.nextLine().substring(12, 25);
System.out.println(test);
}
}
我不确定问题是什么,但它一直在抛出:
线程“main”中的异常java.lang.StringIndexOutOfBoundsException: 字符串索引超出范围:在java.lang.String.substring中为25(未知 来源)at fedOrganiser.fedOrganiser.organiseFile(fedOrganiser.java:41)at at fedOrganiser.fedOrganiser.main(fedOrganiser.java:31)
不确定它的问题是什么。
文件如下:
答案 0 :(得分:1)
对nextLine()
的每次调用都会从流中读取下一行。它是nextLine()
,而不是hasNextLine()
,它会使流前进一行的文本。你每循环读3行。
在循环中第一次调用nextLine
时,将其分配给变量并在循环的其余部分引用该变量。
String line = fileIn.nextLine();
if (!line.isEmpty()) {
lines.add(line);
String test = line.substring(12, 25);
System.out.println(test);
}
顺便说一句,您无需将boolean
(例如hasNextLine()
返回的内容与true
进行比较。只需使用boolean
本身,例如:
while (fileIn.hasNextLine()) {
答案 1 :(得分:0)
您假设每行中至少包含25个字符:
String test = fileIn.nextLine().substring(12, 25);
我猜你有一些较短或空白的行。
答案 2 :(得分:0)
在进行子字符串之前,您需要检查字符串length()
。
答案 3 :(得分:0)
对scanner.nextLine()
的调用前进到下一行。你应该这样做,如果你确定每行至少有25个字符:
public static void organiseFile() throws FileNotFoundException {
ArrayList<String> lines = new ArrayList<>();
String directory = "C:\\Users\\hussainm\\Desktop\\Files\\ex1";
Scanner fileIn = new Scanner(new File(directory + "_temp.txt"));
PrintWriter out = new PrintWriter(directory + "_ordered.txt");
while (fileIn.hasNextLine()) {
String line = fileIn.nextLine();
if (!line.isEmpty()) {
lines.add(line);
String test = line.substring(12, 25);
System.out.println(test);
}
}
...
}
我不明白你要用line.isEmpty()
来测试的是什么,因为只要有线就会一直存在。即使看似空的行也至少包含一个换行符。
答案 4 :(得分:0)
如果要解析的行长度少于25个字符,则抛出异常。
备注强>
使此扫描程序超过当前行并返回该输入 被跳过了。
也许这就是你要做的事情:
Scanner in = null;
PrintWriter out = null;
try {
URL url = this.getClass().getResource("/test_in.txt");
File file = new File(url.getFile());
ArrayList<String> lines = new ArrayList<>();
in = new Scanner(file);
out = new PrintWriter("/test_out.txt");
int lineNumber = 0;
while (in.hasNextLine()) {
String line = in.nextLine();
lineNumber++;
if (line != null && line.trim().length() > 0) {
lines.add(line);
String test = line.substring(12, line.length()<25?line.length():25);
System.out.println(String.format("line# %d: \t\"%s\"", lineNumber, test));
}
}
System.out.println(String.format("last line number: %d", lineNumber));
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
in.close();
out.close();
}