读取文本文件中的字符串
read a String in a text file
假设我的文本文件中有以下文本:
VOTED/1/hannah/18
NOT VOTING/2/janice/20
我有这个代码:
File Orig_outFile = new File("C:\voters.txt");
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile));
vNum=JOptionPane.showInputDialog("Enter voters number: ");
String line="";
String something="VOTED";
while(infile.readLine()!=null){
line=infile.readLine();
String [] info=line.split("/");
if(info[1].matches(vNum)){
while(info[0].matches(something)){
JOptionPane.showMessageDialog(null, "Voter already voted or Voter not registered. Please try again");
vNum=JOptionPane.showInputDialog("Enter voters number: ");
}
President();
}
}
infile.close();
任务是用户需要输入一个选民号码,然后读取文本文件,然后如果发现文本文件中的info[0]
包含VOTED
就会报错消息并需要再次输入其选民号码。我假设我在这里的错误是我使用了 while 循环两次?
实际上,您正在通过执行 infile.readLine()
读取 while
中的一行,然后再次执行 infile.readLine()
将下一行附加到字符串 line
。
您最终只读取了文件的第二行。您应该按如下方式更改 while 循环:
while((line = infile.readLine()) != null)
并删除以下语句:
line = infile.readLine();
这是更正后的代码片段:
File Orig_outFile = new File("C:\voters.txt");
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile));
vNum = JOptionPane.showInputDialog("Enter voters number: ");
String line = null;
String something = "VOTED";
while((line = infile.readLine()) != null) {
String [] info = line.split("/");
/* Assuming You Are Entering Voter's Number & Not Voter's Name */
if(info[1].equalsIgnoreCase(vNum)) {
if(info[0].equalsIgnoreCase(something)) {
JOptionPane.showMessageDialog(null, "Voter already voted or
Voter not registered. Please try again");
/* Please Note That You Are Currently Iterating File */
/* If You Do This Here, You'll End Up Checking Same Records */
/* You'll Have To Replace Outer `if` with `while` */
vNum = JOptionPane.showInputDialog("Enter voters number: ");
} else {
President();
break;
}
}
}
infile.close();
这里有一个更清晰的实现方法:
读取内存中的完整文件(最好是 Map
with key -> Voter Number)。
从用户那里获取选民编号并检查它是否存在于地图中。
如果Map中不存在或者值等于VOTED
则重复Step 2
.
这是代码片段:
File Orig_outFile = new File("C:\voters.txt");
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile));
Map<String,String> map = new HashMap<>();
String something = "VOTED";
String line = null;
while((line = infile.readLine()) != null) {
String [] info = line.split("/");
map.add(info[1],info[0]);
}
infile.close();
while(true) {
vNum = JOptionPane.showInputDialog("Enter Voter's Number: ");
if(map.contains(info[1]) && !map.get(info[1]).equalsIgnoreCase(something)) {
President();
break;
} else {
JOptionPane.showMessageDialog(null, "Voter already voted or
Voter not registered. Please try again");
}
}
调用infile.readLine()
实际上是从文件中读取一行,returns它并移动到下一行。您调用了两次,一次是在 while 循环条件中:
while(infile.readLine() != null)
在循环的第一行再次:
line = infile.readLine();
您应该只在 while 循环条件中调用一次并将值赋给 line
变量,如下所示:
while((line = infile.readLine()) != null)
假设我的文本文件中有以下文本:
VOTED/1/hannah/18
NOT VOTING/2/janice/20
我有这个代码:
File Orig_outFile = new File("C:\voters.txt");
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile));
vNum=JOptionPane.showInputDialog("Enter voters number: ");
String line="";
String something="VOTED";
while(infile.readLine()!=null){
line=infile.readLine();
String [] info=line.split("/");
if(info[1].matches(vNum)){
while(info[0].matches(something)){
JOptionPane.showMessageDialog(null, "Voter already voted or Voter not registered. Please try again");
vNum=JOptionPane.showInputDialog("Enter voters number: ");
}
President();
}
}
infile.close();
任务是用户需要输入一个选民号码,然后读取文本文件,然后如果发现文本文件中的info[0]
包含VOTED
就会报错消息并需要再次输入其选民号码。我假设我在这里的错误是我使用了 while 循环两次?
实际上,您正在通过执行 infile.readLine()
读取 while
中的一行,然后再次执行 infile.readLine()
将下一行附加到字符串 line
。
您最终只读取了文件的第二行。您应该按如下方式更改 while 循环:
while((line = infile.readLine()) != null)
并删除以下语句:
line = infile.readLine();
这是更正后的代码片段:
File Orig_outFile = new File("C:\voters.txt");
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile));
vNum = JOptionPane.showInputDialog("Enter voters number: ");
String line = null;
String something = "VOTED";
while((line = infile.readLine()) != null) {
String [] info = line.split("/");
/* Assuming You Are Entering Voter's Number & Not Voter's Name */
if(info[1].equalsIgnoreCase(vNum)) {
if(info[0].equalsIgnoreCase(something)) {
JOptionPane.showMessageDialog(null, "Voter already voted or
Voter not registered. Please try again");
/* Please Note That You Are Currently Iterating File */
/* If You Do This Here, You'll End Up Checking Same Records */
/* You'll Have To Replace Outer `if` with `while` */
vNum = JOptionPane.showInputDialog("Enter voters number: ");
} else {
President();
break;
}
}
}
infile.close();
这里有一个更清晰的实现方法:
读取内存中的完整文件(最好是
Map
with key -> Voter Number)。从用户那里获取选民编号并检查它是否存在于地图中。
如果Map中不存在或者值等于
VOTED
则重复Step 2
.
这是代码片段:
File Orig_outFile = new File("C:\voters.txt");
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile));
Map<String,String> map = new HashMap<>();
String something = "VOTED";
String line = null;
while((line = infile.readLine()) != null) {
String [] info = line.split("/");
map.add(info[1],info[0]);
}
infile.close();
while(true) {
vNum = JOptionPane.showInputDialog("Enter Voter's Number: ");
if(map.contains(info[1]) && !map.get(info[1]).equalsIgnoreCase(something)) {
President();
break;
} else {
JOptionPane.showMessageDialog(null, "Voter already voted or
Voter not registered. Please try again");
}
}
调用infile.readLine()
实际上是从文件中读取一行,returns它并移动到下一行。您调用了两次,一次是在 while 循环条件中:
while(infile.readLine() != null)
在循环的第一行再次:
line = infile.readLine();
您应该只在 while 循环条件中调用一次并将值赋给 line
变量,如下所示:
while((line = infile.readLine()) != null)