从文本文件Javafx中顺序读取
Sequential reading from a textfile Javafx
正在尝试从文本文件中按顺序读取。但是,目前,单击按钮时只会读取最后一行。我想一个接一个地阅读文本文件中的所有问题。这是我的代码:
buttonNext.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent E){
java.io.File inFile = new java.io.File("QuestionSheet.txt");
try {
java.util.Scanner input = new java.util.Scanner(inFile);
while (input.hasNext()){
String[] lineOfCsv = input.nextLine().split(",");
questionLabel.setText(lineOfCsv[0]);
aRadio.setText(lineOfCsv[1]);
bRadio.setText(lineOfCsv[2]);
cRadio.setText(lineOfCsv[3]);
dRadio.setText(lineOfCsv[4]);
}
} catch (java.io.IOException ex){
System.out.println("Error reading file " + ex.toString());
}
buttonNext.setText("Next Question");
}
});
使用缓冲区reader和输入流逐行读取,原因是缓冲区reader包含一个默认的读取行函数。这很有帮助。
buttonNext.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent E){
try{
FileInputStream fstream = new FileInputStream("QuestionSheet.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) {
System.out.println (strLine);
String[] lineOfCsv = strLine.split(",");
questionLabel.setText(lineOfCsv[0]);
aRadio.setText(lineOfCsv[1]);
bRadio.setText(lineOfCsv[2]);
cRadio.setText(lineOfCsv[3]);
dRadio.setText(lineOfCsv[4]);
}
in.close();
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
要单独阅读每一行,请保留对 Scanner
的引用,并且每次单击按钮仅调用一次 nextLine
。但是,这很难确保 Scanner
始终正确关闭。将行读取到 List<String>
并遍历它可能会更简单:
Path filePath = Paths.get("QuestionSheet.txt");
List<String> lines = Files.readAllLines(filePath); // using nio for simplicity here
buttonNext.setOnAction(new EventHandler<ActionEvent>(){
// iterator for stepwise iterating through the list
private final Iterator<String> iterator = lines.iterator();
@Override
public void handle(ActionEvent event){
if (iterator.hasNext()) {
String[] lineOfCsv = iterator.next().split(",");
questionLabel.setText(lineOfCsv[0]);
aRadio.setText(lineOfCsv[1]);
bRadio.setText(lineOfCsv[2]);
cRadio.setText(lineOfCsv[3]);
dRadio.setText(lineOfCsv[4]);
buttonNext.setDisable(!iterator.hasNext());
}
}
});
正在尝试从文本文件中按顺序读取。但是,目前,单击按钮时只会读取最后一行。我想一个接一个地阅读文本文件中的所有问题。这是我的代码:
buttonNext.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent E){
java.io.File inFile = new java.io.File("QuestionSheet.txt");
try {
java.util.Scanner input = new java.util.Scanner(inFile);
while (input.hasNext()){
String[] lineOfCsv = input.nextLine().split(",");
questionLabel.setText(lineOfCsv[0]);
aRadio.setText(lineOfCsv[1]);
bRadio.setText(lineOfCsv[2]);
cRadio.setText(lineOfCsv[3]);
dRadio.setText(lineOfCsv[4]);
}
} catch (java.io.IOException ex){
System.out.println("Error reading file " + ex.toString());
}
buttonNext.setText("Next Question");
}
});
使用缓冲区reader和输入流逐行读取,原因是缓冲区reader包含一个默认的读取行函数。这很有帮助。
buttonNext.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent E){
try{
FileInputStream fstream = new FileInputStream("QuestionSheet.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) {
System.out.println (strLine);
String[] lineOfCsv = strLine.split(",");
questionLabel.setText(lineOfCsv[0]);
aRadio.setText(lineOfCsv[1]);
bRadio.setText(lineOfCsv[2]);
cRadio.setText(lineOfCsv[3]);
dRadio.setText(lineOfCsv[4]);
}
in.close();
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
要单独阅读每一行,请保留对 Scanner
的引用,并且每次单击按钮仅调用一次 nextLine
。但是,这很难确保 Scanner
始终正确关闭。将行读取到 List<String>
并遍历它可能会更简单:
Path filePath = Paths.get("QuestionSheet.txt");
List<String> lines = Files.readAllLines(filePath); // using nio for simplicity here
buttonNext.setOnAction(new EventHandler<ActionEvent>(){
// iterator for stepwise iterating through the list
private final Iterator<String> iterator = lines.iterator();
@Override
public void handle(ActionEvent event){
if (iterator.hasNext()) {
String[] lineOfCsv = iterator.next().split(",");
questionLabel.setText(lineOfCsv[0]);
aRadio.setText(lineOfCsv[1]);
bRadio.setText(lineOfCsv[2]);
cRadio.setText(lineOfCsv[3]);
dRadio.setText(lineOfCsv[4]);
buttonNext.setDisable(!iterator.hasNext());
}
}
});