我的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
我已经仔细阅读了我的代码,但我没有看到任何地方的文件会被复制。是否有一些关于文件读取的事情我不知道
# 1 楼答案
此时,您应该使用调试器进入检测模式。为什么在第二次的时间里,实际内容是两次?内容存储在哪个变量中?它是什么时候附加的?你会因为偶然而做两次吗?故意的
# 2 楼答案
这与您实现
public void read()
的方式有关。您的getHistory()
调用file.getContents()
,后者调用read()。Read将元素添加到ArrayList<String[]> arr
getContents()
然后返回arr
。请注意arr
将在每次调用getHistory
时保持增长。如果您调用它一次,您将得到预期的结果,但是如果您多次调用它,您将开始看到代码中的异常我不知道你在用什么工具,但是here is a good tutorial on debugging with eclipse或者如果你喜欢视频教程,knock yourself out.