Java:当并非所有行都有新行时,从文件中读取行
我正在开发一个程序,它打开一个数据文件,并使用while循环逐行读取文件,将数据存储在二进制搜索树中。但我唯一的问题是我不确定如何处理循环条件,因为文件的最后一行没有新行字符。我通常使用hasNextLine()和扫描仪来读取文件,但这会在我的程序中引发错误,我不能使用hasNext(),因为我需要获取整行内容,而不仅仅是其中的一部分。最好的办法是什么Java:当并非所有行都有新行时,从文件中读取行,java,string,file,java.util.scanner,Java,String,File,Java.util.scanner,我正在开发一个程序,它打开一个数据文件,并使用while循环逐行读取文件,将数据存储在二进制搜索树中。但我唯一的问题是我不确定如何处理循环条件,因为文件的最后一行没有新行字符。我通常使用hasNextLine()和扫描仪来读取文件,但这会在我的程序中引发错误,我不能使用hasNext(),因为我需要获取整行内容,而不仅仅是其中的一部分。最好的办法是什么 public static BinaryTree getInventory(BinaryTree tree, Scanner input
public static BinaryTree getInventory(BinaryTree tree, Scanner input) {
String line, title = "";
int available = -1, rented = -1, comma = 0;
boolean quote = true;
// While not the end of file
while (input.hasNextLine()) {
line = input.nextLine();
for (int i = 1; i < line.length(); i++) {
if (line.charAt(i) == '"') {
title = line.substring(1, i);
comma = i + 1;
quote = false;
i++;
}
else if (line.charAt(i) == ',' && !quote) {
available = Integer.parseInt(line.substring(comma + 1, i - 1));
comma = i;
i++;
}
else if (i + 1 == line.length()) {
rented = Integer.parseInt(line.substring(comma + 1, i));
}
}
tree.insert(new Node(title,available,rented));
}
return tree;
}
publicstaticbinarytreegetinventory(BinaryTree树,扫描器输入){
字符串行,title=“”;
int available=-1,rendered=-1,逗号=0;
布尔引号=真;
//而不是文件的结尾
while(input.hasNextLine()){
line=input.nextLine();
对于(int i=1;i
您可以通过捕获NoTouchElementException
来避免需要hasNext()
。此外,根据文件的结构(似乎是“title”,XX,YY
),您可以避免使用这样的代码在行字符上循环
try {
while (true) {
String line = input.nextLine();
int rdquo = line.indexOf('"', 1);
String title = line.substring(1, rdquo);
String[] avail = line.substring(rdquo+2).split(",");
tree.insert(new Node(title, Integer.parseInt(avail[0]) , Integer.parseInt(avail[1]));
}
} catch (NoSuchElementException reachedEndOfFile) { }
公认的答案应该可以很好地解决您的问题,但我认为值得指出一些东西,以便您(或从您的帖子中学习的人)正确理解扫描仪的工作原理 给定一个输入源,如
第1行\nLine 2
,其中第2行不以换行符结尾,下面的代码将打印这两行而不会抛出任何错误
while (input.hasNextLine()) {
System.out.println(input.nextLine());
}
这也将打印两行
while (input.hasNext()) {
System.out.println(input.nextLine());
}
根据您的示例代码,我认为您的某个标题很可能包含逗号,这将导致Integer.parseInt试图解析一些非整数文本。当请求帮助排除抛出错误的代码时,共享异常以及可能的堆栈跟踪是很有帮助的。请提供一些代码请显示您当前的实现。如果使用BufferedReader(如果愿意,可以读取文件并创建BufferedReader),则可以使用lines()方法,该方法将为您提供一个对应于文件每一行的流,看看它是否有助于您完成此任务。@YoungMillie抱歉,添加了我当前的代码。您确定for循环
for(int i=1;i
。因此i
?这不应该是吗?这太完美了。非常感谢!这种方法还有一个额外的好处,就是支持包含逗号的标题。@Sergio就风格和易读性而言,最好避免在没有异常发生时故意触发异常。在这种情况下,您可以在(true)时替换
和while(input.hasNextLine())
并删除try-catch。我同意,出于流量控制的原因,我通常不会故意抛出catch和异常。哦,好吧,对不起,这个论坛还是有点新鲜。实际上我猜测标题中可能会有逗号,因为我不知道输入是什么。我会确保包含任何可能的e未来的例外情况!