通过读取每行的第一个字符来模块化创建表单,从而将文件读入JavaFX网格?

通过读取每行的第一个字符来模块化创建表单,从而将文件读入JavaFX网格?,java,file,javafx,Java,File,Javafx,我试图在JavaFX中创建一个方法,通过读取文本文件并基于每行的第一个字母构造它,可以模块化地创建表单 我已经到了可以用选项填写复选框的地步,但是我无法让readFile方法区分带有“Q”或“a”的行 如果没有我的歧视子句,它会返回文件的所有行,但是如果有这些行,它就不会读取任何一行,好像它们从来都不是真的,但我不明白为什么 //Method reads files into a string and then returns the result, which should be the co

我试图在JavaFX中创建一个方法,通过读取文本文件并基于每行的第一个字母构造它,可以模块化地创建表单

我已经到了可以用选项填写复选框的地步,但是我无法让readFile方法区分带有“Q”或“a”的行

如果没有我的歧视子句,它会返回文件的所有行,但是如果有这些行,它就不会读取任何一行,好像它们从来都不是真的,但我不明白为什么

//Method reads files into a string and then returns the result, which should be the completed string
//Currently trying a modular solution based on a mode system with 'Q' being the input for Question reading
// and 'A' being the input for Answer reading
public String readFile(String file, char mode) throws IOException {
    //in = new FileInputStream(s);
    br = new BufferedReader(new FileReader(file)); //Buffered reader for reading file
    String i = "";
    while ((br.read()) != -1) {
        /*This doesn't work
        if (mode == 'Q' && br.readLine().charAt(0) == 'Q') {
            i += br.readLine() + "\n";
        }
        if (mode == 'A' && br.readLine().charAt(0) == 'A') {
            i += br.readLine() + "\n";
        }*/
    }
    return i;//return statement
}
在while条件下调用br.read时,它将读取一个字符,即行的第一个字符。因此,当您随后调用readLine时,您将获得该行上的剩余字符,即不是第一个字符。类似地,在测试中调用readLine一次,然后在连接文本时再次调用它,因此将在测试的行之后连接该行,而不是实际测试的行

还要注意的是,通过在循环中串联来构建字符串是非常糟糕的做法。在循环的每次迭代中,创建一个新字符串,并从上一个字符串复制现有字符。由于字符串的大小在增长,这将以二次时间运行,可能会给垃圾收集器带来额外的负担。改用StringBuilder

你能行

public String readFile(String file, char mode) throws IOException {
    //in = new FileInputStream(s);
    br = new BufferedReader(new FileReader(file)); //Buffered reader for reading file
    StringBuilder result = new StringBuilder();
    String line ;
    while ((line = br.readLine()) != null) {
        if (mode == 'Q' && line.charAt(0) == 'Q') {
            result.append(line).append("\n");
        }
        if (mode == 'A' && line.charAt(0) == 'A') {
            result.append(line).append("\n");
        }
    }
    return result.toString(); //return statement
}
针对这一点,更具Java 8风格的方法是:

public String readFile(String file, char mode) {
    if (mode != 'Q' && mode != 'A') return "" ; 

    return Files.lines(Paths.get(file))
        .filter(line -> line.charAt(0) == mode)
        .collect(Collectors.joining("\n"));
}
要从返回的字符串中删除第一个字符,请在第一个版本中将result.appendline替换为result.appendline.substring1。在第二个版本中添加行

.map(line -> line.substring(1))

在.filter和.collect之间。

谢谢你,这很有效。你知道我怎么能忽略第一个角色吗?使用此解决方案,它会像是和否一样输出它,只是不附加第一个字符。例如,将result.appendline替换为result.appendline.substring1。非常感谢。这非常有帮助。@BenBoudreau为答案添加了更现代的方法。