有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我的Java代码不断向文本文件添加重复项

我正在用Java编写一些代码,能够读写股票投资组合项目的文本文件。我能够读和写,但是当我在同一个runner类中尝试两次读取文件时,它首先输出内容,然后输出两次内容,而不是两次输出相同的内容

相关类别为(请原谅其长度):

import java.util.ArrayList;
import java.io.*;

public class FileModifier {
    private String path;
    private int numOfLines;
    private ArrayList<String[]> arr;
    private BufferedReader br;
    private BufferedWriter bw;

    public FileModifier(String p){
        path = p;
        numOfLines = 0;
        arr = new ArrayList<String[]>();
    }

    public void read(){
        try{
            br = new BufferedReader(new FileReader(path));
            String line;
            while ((line = br.readLine()) != null) {
                String[] row = line.split("\t\t");
                arr.add(row);
                numOfLines++;
            }
            br.close();
        }
        catch(Exception e){
        }
    }

    public void write(){
        try{
            read();
            bw = new BufferedWriter(new FileWriter(path));
            String content = "";
            for (String[] line : arr) {
                for (int i = 0; i < line.length; i++) {
                    content += (line[i] + "\t\t");
                }
                content += "\r";
            }
            bw.write(content);
            bw.close();
        }
        catch(Exception e){
        }
    }

    public ArrayList<String[]> getContents(){
        read();
        return arr;
    }

    public int getNumberOfLines(){
        read();
        return numOfLines;
    }

    public String[] getLine(int n){
        read();
        return arr.get(n);
    }

    public void addLine(int n, String[] newLine){
        read();
        arr.set(n, newLine);
    }
}

import java.util.ArrayList;

abstract public class Account {
    private FileModifier file;

    public Account(String historyPath){
        file = new FileModifier(historyPath);
    }

    abstract public double getBalance();

    public void addToHistory(String[] newLine){
        ArrayList<String[]> contents = file.getContents();
        contents.add(newLine);
        file.write();
    }

    public String getHistory(){
        String history = "";
        for(String[] line: file.getContents()){
            for(String part: line){
                history += part + "\t\t";
            }
            history += "\n";
        }
        return history;
    }
}

import java.util.ArrayList;
import java.util.Date;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;

public class StockAccount extends Account{
    private ArrayList<String[]> arr;
    private DecimalFormat df;
    private SimpleDateFormat da;
    private int numOfShares;
    private double portfolioValue;
    private double balance;
    private FileModifier portfolio;

    public StockAccount(String p){
        super("C:\\stock_transaction_history.txt");
        portfolio = new FileModifier(p);
        numOfShares = portfolio.getNumberOfLines();
        arr = portfolio.getContents();
        portfolioValue = 10000;
        balance = 10000;
        df = new DecimalFormat(".##");
        da = new SimpleDateFormat("HH:mm:ss");
    }

    public String displayPortfolio(){
        String output = "";
        String[] temp;
        for(int i = 0; i < numOfShares; i++){
            temp = arr.get(i);
            for(int k = 0; k < temp.length; k++){
                output += temp[k];
                output += "\t\t";
            }
            if(i < numOfShares - 1)
                output += "\r";
        }
        return output;
    }

    public double getStockPrice(String symbol){
        for(String[] line: arr){
            if(line[0].equals(symbol))
                return Double.parseDouble(line[2]);
        }
        return -1;
    }

    public int getAmountOwned(String symbol){
        for(String[] line: arr){
            if(line[0].equals(symbol))
                return Integer.parseInt(line[1]);
        }
        return -1;
    }

    public double getStockValue(String symbol){
        int amt = getAmountOwned(symbol);
        double price = getStockPrice(symbol);
        if(amt == -1 || price == -1){
            return -1;
        }
        return amt * price;
    }

    public double getBalance(){
        double value = 0;
        for(int i = 0; i < arr.size()/2; i++){
            value += getStockValue(arr.get(i)[0]);
        }
        balance = Double.parseDouble(df.format(portfolioValue - value));
        return balance;
    }

}

现在,当我试着去做

StockAccount sa = new StockAccount("C:\\Result.txt");
System.out.println(sa.getHistory());
System.out.println();
System.out.println(sa.getHistory());

我明白了

Event       Symbol      Owned       Price       Value       Time        
Buy     GOOG        10      $577.49     $5774.90        09:40:07        
Buy     MSFT        100     $30.00      $3000.00        13:37:00        


Event       Symbol      Owned       Price       Value       Time        
Buy     GOOG        10      $577.49     $5774.90        09:40:07        
Buy     MSFT        100     $30.00      $3000.00        13:37:00        
Event       Symbol      Owned       Price       Value       Time        
Buy     GOOG        10      $577.49     $5774.90        09:40:07        
Buy     MSFT        100     $30.00      $3000.00        13:37:00

我已经仔细阅读了我的代码,但我没有看到任何地方的文件会被复制。是否有一些关于文件读取的事情我不知道


共 (2) 个答案

  1. # 1 楼答案

    此时,您应该使用调试器进入检测模式。为什么在第二次的时间里,实际内容是两次?内容存储在哪个变量中?它是什么时候附加的?你会因为偶然而做两次吗?故意的

    Take a good hard look at how you're interacting with FileModifier#arr.

  2. # 2 楼答案

    这与您实现public void read()的方式有关。您的getHistory()调用file.getContents(),后者调用read()。Read将元素添加到ArrayList<String[]> arrgetContents()然后返回arr。请注意arr将在每次调用getHistory时保持增长。如果您调用它一次,您将得到预期的结果,但是如果您多次调用它,您将开始看到代码中的异常

    我不知道你在用什么工具,但是here is a good tutorial on debugging with eclipse或者如果你喜欢视频教程,knock yourself out.