Java BufferedReader行为奇怪
我一辈子都不明白bufferedreader为什么不读我文件的下一行。它不断返回一个空字符串。我以正确的格式将阅读器放入while循环中。我的文本文件不包含任何特殊字符。它只包含数字和一些由空格分隔的字符串。我不明白Java BufferedReader行为奇怪,java,file,bufferedreader,Java,File,Bufferedreader,我一辈子都不明白bufferedreader为什么不读我文件的下一行。它不断返回一个空字符串。我以正确的格式将阅读器放入while循环中。我的文本文件不包含任何特殊字符。它只包含数字和一些由空格分隔的字符串。我不明白 //Read from file method public void readFile(File x) throws IOException{ File rFile = x; String fileLine; Transaction holder;
//Read from file method
public void readFile(File x) throws IOException{
File rFile = x;
String fileLine;
Transaction holder;
int Type;
//This will destroy the current account to add in the new one
//Main.$acct.destroyTrans();
try {
// FileReader reads text files in the default encoding.
FileReader fileReader = new FileReader(rFile);
// Always wrap FileReader in BufferedReader.
BufferedReader bufferedReader = new BufferedReader(fileReader);
//Gathering initial information about account
Main.$acct.setName(bufferedReader.readLine());
Main.$acct.setBalance(Double.parseDouble(bufferedReader.readLine()));
Main.$acct.setTransCount(Integer.parseInt(bufferedReader.readLine()));
Main.$acct.setSC(Double.parseDouble(bufferedReader.readLine()));
//Adding the objects
while((fileLine = bufferedReader.readLine()) != null) {
//Tokenize the String to extract information
StringTokenizer st = new StringTokenizer(fileLine," ");
//Go through each token and put it into an arrayList
ArrayList<String> list = new ArrayList();
while(st.hasMoreTokens()) {
list.add(st.nextToken());
}
//Grab each piece of data
Type = Integer.parseInt(list.get(0));
//Route the proper objects to their proper places
switch(Type){
case 1:
{
holder = new Check(Integer.parseInt(list.get(1)), Type, Double.parseDouble(list.get(3)), Integer.parseInt(list.get(2)));
Main.$acct.addNewTrans(holder);
break;
}
case 2:
{
holder = new Deposit(Integer.parseInt(list.get(1)), Type, Double.parseDouble(list.get(5)), Double.parseDouble(list.get(3)),
Double.parseDouble(list.get(4)));
Main.$acct.addNewTrans(holder);
break;
}
case 3:
{
holder = new Transaction(Integer.parseInt(list.get(1)), Type, Double.parseDouble(list.get(4)));
Main.$acct.addNewTrans(holder);
break;
}
default:
{}
}
//End of switch
}
//End of while loop
bufferedReader.close();
}
//End of Try
//Exception handling portion
catch(FileNotFoundException ex) {
System.out.println(
"Unable to open file '" +
rFile.getName() + "'");
}
catch(IOException ex) {
System.out.println(
"Error reading file '"
+ rFile.getName() + "'");
// Or we could just do this:
// ex.printStackTrace();
}
}
//从文件读取方法
公共void readFile(文件x)引发IOException{
文件rFile=x;
字符串文件行;
交易持有人;
int型;
//这将销毁当前帐户以添加新帐户
//Main.$acct.trans();
试一试{
//FileReader以默认编码读取文本文件。
FileReader FileReader=新的FileReader(rFile);
//始终将文件读取器包装在BufferedReader中。
BufferedReader BufferedReader=新的BufferedReader(文件阅读器);
//收集有关帐户的初始信息
Main.$acct.setName(bufferedReader.readLine());
Main.$acct.setBalance(Double.parseDouble(bufferedReader.readLine());
Main.$acct.setTransCount(Integer.parseInt(bufferedReader.readLine());
Main.$acct.setSC(Double.parseDouble(bufferedReader.readLine());
//添加对象
而((fileLine=bufferedReader.readLine())!=null){
//标记字符串以提取信息
StringTokenizer st=新的StringTokenizer(文件行“”);
//检查每个令牌并将其放入arrayList中
ArrayList=新建ArrayList();
而(st.hasMoreTokens()){
添加(st.nextToken());
}
//抓取每一条数据
Type=Integer.parseInt(list.get(0));
//将适当的物体布置到适当的位置
开关(类型){
案例1:
{
holder=newcheck(Integer.parseInt(list.get(1)),Type,Double.parseDouble(list.get(3)),Integer.parseInt(list.get(2));
主帐户$acct.ADDNETRANS(持有人);
打破
}
案例2:
{
holder=新存款(Integer.parseInt(list.get(1)),类型,Double.parseDouble(list.get(5)),Double.parseDouble(list.get(3)),
Double.parseDouble(list.get(4));
主帐户$acct.ADDNETRANS(持有人);
打破
}
案例3:
{
holder=新事务(Integer.parseInt(list.get(1)),类型,Double.parseDouble(list.get(4));
主帐户$acct.ADDNETRANS(持有人);
打破
}
违约:
{}
}
//开关末端
}
//while循环结束
bufferedReader.close();
}
//尝试结束
//异常处理部分
捕获(FileNotFoundException ex){
System.out.println(
“无法打开文件”+
rFile.getName()+“'”);
}
捕获(IOEX异常){
System.out.println(
“读取文件“”时出错”
+rFile.getName()+“'”);
//或者我们可以这样做:
//例如printStackTrace();
}
}
示例文件:
比利
五百
四,
五,
101100
3.1 Srv。Chrg。0.15
2存款100 200
只要输入文件格式和编码是标准的,代码就可以正常运行。 确保输入文件没有多余的换行符(或文件末尾有额外的换行符); 我用ANSI编码的文件测试了你的代码,它按预期工作 修复您的异常处理以处理一般情况-它将帮助您调试错误 i、 e.在方法末尾执行类似操作:
} catch(Exception e) {
// Throw the exception here, or print it to the console...
e.printStackTrace();
}
祝你好运 共享您的文件示例。不要依赖于
文件阅读器的默认编码,这是一个正在底部咬您的bug。请创建一个!!!这组代码(格式非常糟糕)太多,无法分析。您需要向我们显示错误的确切位置,因为我运行了示例文件,它似乎工作得很好。好的,我和我的教授解决了这个问题。在这段代码中没有看到,我有一个toString()方法,可以写出每个account类的信息,在toString()的末尾有一个“\n”,我还使用了一个bufferedReader.newLine()。因此该文件有两个“\n”,因此它无法读取超过第一行的内容……Doh!