当我调用我的BufferedReader时,我的程序冻结了。

问题描述 投票:1回答:2

我正在开发一个程序,在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);
    }

}
java bufferedreader
2个回答
2
投票

你需要一个 if 砌块 while 块,因为您只想为一个对象设置值。Stock 对象。

替换

while(inputString != null)

if(inputString != null)

另外,将返回类型从 voidStock 并返回 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;
}

1
投票

你的循环设置不正确,因此永远不会退出。请注意,在你读取第一行之后,你永远不会再读取另一行新的内容,所以循环永远不会结束。

其次,如果你在读取文件的同时向文件写入内容,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();

    }
© www.soinside.com 2019 - 2024. All rights reserved.