Java:当并非所有行都有新行时,从文件中读取行

Java:当并非所有行都有新行时,从文件中读取行,java,string,file,java.util.scanner,Java,String,File,Java.util.scanner,我正在开发一个程序,它打开一个数据文件,并使用while循环逐行读取文件,将数据存储在二进制搜索树中。但我唯一的问题是我不确定如何处理循环条件,因为文件的最后一行没有新行字符。我通常使用hasNextLine()和扫描仪来读取文件,但这会在我的程序中引发错误,我不能使用hasNext(),因为我需要获取整行内容,而不仅仅是其中的一部分。最好的办法是什么 public static BinaryTree getInventory(BinaryTree tree, Scanner input

我正在开发一个程序,它打开一个数据文件,并使用while循环逐行读取文件,将数据存储在二进制搜索树中。但我唯一的问题是我不确定如何处理循环条件,因为文件的最后一行没有新行字符。我通常使用hasNextLine()和扫描仪来读取文件,但这会在我的程序中引发错误,我不能使用hasNext(),因为我需要获取整行内容,而不仅仅是其中的一部分。最好的办法是什么

    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未来的例外情况!