我正在开发一个程序,在jlist中显示我的股票类的一个对象。我可以将这些信息写入一个文件,但当我试图从该文件中读取信息时,我的程序就会冻结。我想知道是否我的代码设置错了,因为这是我第一次尝试从文件中读取信息。我所要做的就是根据文件中保存的变量为我的股票对象设置变量。谢谢你
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);
}
}
你需要一个 if
砌块 while
块,因为您只想为一个对象设置值。Stock
对象。
替换
while(inputString != null)
与
if(inputString != null)
另外,将返回类型从 void
到 Stock
并返回 aStock
这样你就可以使用返回的值。
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;
}
你的循环设置不正确,因此永远不会退出。请注意,在你读取第一行之后,你永远不会再读取另一行新的内容,所以循环永远不会结束。
其次,如果你在读取文件的同时向文件写入内容,inputString永远不会为空--对inbuffer.readLine的调用会在返回之前等待更多的数据。你可能会更好地使用一个线程回调读取器,比如DataFetcher (https:/sourceforge.netptuscodeHEADtreetjacobsioDataFetcher.java。)
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();
}