当我调用 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;
}