当我调用 BufferedReader 时,我的程序冻结了
When I call my BufferedReader my programs freezes
我正在开发一个程序,在 jlist 中显示我的 Stock class 中的一个对象。我让它工作,我可以把这些信息写入一个文件,但是当我试图从同一个文件中读取时,我的程序就死机了。我想知道我的代码是否设置错误以从文件中读取,因为这是我第一次尝试这样做。我要做的就是从文件中保存的变量中为我的 Stock 对象设置变量。谢谢
public void getData(){
StringTokenizer row;
Stock aStock = new Stock();
try{
BufferedReader inbuffer = new BufferedReader(new FileReader(fileName));
String inputString;
inputString = inbuffer.readLine();
while(inputString != null){
row = new StringTokenizer(inputString, DELIMTER);
aStock.setStockName(row.nextToken());
aStock.setStockQuantity(Integer.parseInt(row.nextToken()));
aStock.setPurchasePrice(Double.parseDouble(row.nextToken()));
aStock.setCurrentPrice(Double.parseDouble(row.nextToken()));
}
inbuffer.close();
}
catch(IOException ioe){
JOptionPane.showMessageDialog(null, ioe.getMessage(), "File Read Error", JOptionPane.ERROR);
}
}
您的循环设置不正确,因此永远不会退出。请注意,在您阅读第一行之后,您永远不会再阅读另一行,因此循环永远不会结束。
其次,如果您在读取文件的同时写入文件,inputString 将永远不会为空 - 对 inbuffer.readLine 的调用将在返回之前等待更多数据。使用像 DataFetcher (https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io/DataFetcher.java)
这样的线程回调 reader 可能会做得更好
inputString = inbuffer.readLine();
while(inputString != null){
row = new StringTokenizer(inputString, DELIMTER);
aStock.setStockName(row.nextToken());
aStock.setStockQuantity(Integer.parseInt(row.nextToken()));
aStock.setPurchasePrice(Double.parseDouble(row.nextToken()));
aStock.setCurrentPrice(Double.parseDouble(row.nextToken()));
inputString = inbuffer.readLine();
}
您需要 if
块而不是 while
块,因为您只想将值设置为一个 Stock
对象。
替换
while(inputString != null)
和
if(inputString != null)
此外,将 return 类型从 void
更改为 Stock
和 return aStock
以便您可以使用 returned值。
public Stock getData() {
StringTokenizer row;
Stock aStock = new Stock();
try {
BufferedReader inbuffer = new BufferedReader(new FileReader(fileName));
String inputString;
inputString = inbuffer.readLine();
if (inputString != null) {
row = new StringTokenizer(inputString, DELIMTER);
aStock.setStockName(row.nextToken());
aStock.setStockQuantity(Integer.parseInt(row.nextToken()));
aStock.setPurchasePrice(Double.parseDouble(row.nextToken()));
aStock.setCurrentPrice(Double.parseDouble(row.nextToken()));
}
inbuffer.close();
} catch (IOException ioe) {
JOptionPane.showMessageDialog(null, ioe.getMessage(), "File Read Error", JOptionPane.ERROR);
}
return aStock;
}
我正在开发一个程序,在 jlist 中显示我的 Stock class 中的一个对象。我让它工作,我可以把这些信息写入一个文件,但是当我试图从同一个文件中读取时,我的程序就死机了。我想知道我的代码是否设置错误以从文件中读取,因为这是我第一次尝试这样做。我要做的就是从文件中保存的变量中为我的 Stock 对象设置变量。谢谢
public void getData(){
StringTokenizer row;
Stock aStock = new Stock();
try{
BufferedReader inbuffer = new BufferedReader(new FileReader(fileName));
String inputString;
inputString = inbuffer.readLine();
while(inputString != null){
row = new StringTokenizer(inputString, DELIMTER);
aStock.setStockName(row.nextToken());
aStock.setStockQuantity(Integer.parseInt(row.nextToken()));
aStock.setPurchasePrice(Double.parseDouble(row.nextToken()));
aStock.setCurrentPrice(Double.parseDouble(row.nextToken()));
}
inbuffer.close();
}
catch(IOException ioe){
JOptionPane.showMessageDialog(null, ioe.getMessage(), "File Read Error", JOptionPane.ERROR);
}
}
您的循环设置不正确,因此永远不会退出。请注意,在您阅读第一行之后,您永远不会再阅读另一行,因此循环永远不会结束。
其次,如果您在读取文件的同时写入文件,inputString 将永远不会为空 - 对 inbuffer.readLine 的调用将在返回之前等待更多数据。使用像 DataFetcher (https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io/DataFetcher.java)
这样的线程回调 reader 可能会做得更好 inputString = inbuffer.readLine();
while(inputString != null){
row = new StringTokenizer(inputString, DELIMTER);
aStock.setStockName(row.nextToken());
aStock.setStockQuantity(Integer.parseInt(row.nextToken()));
aStock.setPurchasePrice(Double.parseDouble(row.nextToken()));
aStock.setCurrentPrice(Double.parseDouble(row.nextToken()));
inputString = inbuffer.readLine();
}
您需要 if
块而不是 while
块,因为您只想将值设置为一个 Stock
对象。
替换
while(inputString != null)
和
if(inputString != null)
此外,将 return 类型从 void
更改为 Stock
和 return aStock
以便您可以使用 returned值。
public Stock getData() {
StringTokenizer row;
Stock aStock = new Stock();
try {
BufferedReader inbuffer = new BufferedReader(new FileReader(fileName));
String inputString;
inputString = inbuffer.readLine();
if (inputString != null) {
row = new StringTokenizer(inputString, DELIMTER);
aStock.setStockName(row.nextToken());
aStock.setStockQuantity(Integer.parseInt(row.nextToken()));
aStock.setPurchasePrice(Double.parseDouble(row.nextToken()));
aStock.setCurrentPrice(Double.parseDouble(row.nextToken()));
}
inbuffer.close();
} catch (IOException ioe) {
JOptionPane.showMessageDialog(null, ioe.getMessage(), "File Read Error", JOptionPane.ERROR);
}
return aStock;
}