通过读取每行的第一个字符来模块化创建表单,从而将文件读入JavaFX网格?
我试图在JavaFX中创建一个方法,通过读取文本文件并基于每行的第一个字母构造它,可以模块化地创建表单 我已经到了可以用选项填写复选框的地步,但是我无法让readFile方法区分带有“Q”或“a”的行 如果没有我的歧视子句,它会返回文件的所有行,但是如果有这些行,它就不会读取任何一行,好像它们从来都不是真的,但我不明白为什么通过读取每行的第一个字符来模块化创建表单,从而将文件读入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
//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为答案添加了更现代的方法。