Java 将实例变量写入文本文件

Java 将实例变量写入文本文件,java,filewriter,printwriter,Java,Filewriter,Printwriter,我需要获取对象列表,并将它们的实例变量写入文本文件。它看起来像这样: Hot Dog,1.25,Grocery Store Gas,42.15,Gas Station etc. public void writeListToFile(String fileName, ArrayList<BudgetItem> writeList) throws Exception { PrintWriter out = null; for(int i = 0; i<write

我需要获取对象列表,并将它们的实例变量写入文本文件。它看起来像这样:

Hot Dog,1.25,Grocery Store
Gas,42.15,Gas Station
etc.
public void writeListToFile(String fileName, ArrayList<BudgetItem> writeList) throws Exception {
    PrintWriter out = null;
    for(int i = 0; i<writeList.size(); i++) {   
        if(writeList.get(i) instanceof Expense) {
            Expense writeExpense = (Expense) writeList.get(i);
            try {
                out = new PrintWriter(new FileWriter(fileName));
                dump(out, writeExpense);
            }
            finally {
            }
        }
        else if(writeList.get(i) instanceof Income) {
            Income writeIncome = (Income) writeList.get(i);
            try {
                out = new PrintWriter(new FileWriter(fileName));
                dump(out, writeIncome);
            }
            finally {
            }
        }
    }
    out.close();
}

public void dump(PrintWriter out, Expense writeExpense) {
    out.print(writeExpense.getDateOfTransaction().get(GregorianCalendar.YEAR));
    out.print(",");
    out.print(writeExpense.getDateOfTransaction().get(GregorianCalendar.MONTH));
    out.print(",");
    out.print(writeExpense.getDateOfTransaction().get(GregorianCalendar.DATE));
    out.print(",");
    out.print(writeExpense.getItemName());
    out.print(",");
    out.print(writeExpense.getMethodOfPay());
    out.print(",");
    out.print(writeExpense.getPlaceOfPurchase());
    out.print(",");
    out.print(writeExpense.getQuantity());
    out.print(",");
    out.print(writeExpense.getPrice());
    out.print("\n");
}

and one other method similar to the 2nd one.
public void writeListToFile(
    final String fileName,
    final List<BudgetItem> listBudgetItem)
throws Exception
{
    PrintWriter out = null;

    try
    {
        out = new PrintWriter(new FileWriter(fileName));
        for(BudgetItem current : listBudgetItem)
        {
            out.println(current.toBlammy());
        }
    }
    catch (... exceptions)
    {
    }
    finally
    {
        // close the PrintWriter.
    }
}
我有一些代码如下所示:

Hot Dog,1.25,Grocery Store
Gas,42.15,Gas Station
etc.
public void writeListToFile(String fileName, ArrayList<BudgetItem> writeList) throws Exception {
    PrintWriter out = null;
    for(int i = 0; i<writeList.size(); i++) {   
        if(writeList.get(i) instanceof Expense) {
            Expense writeExpense = (Expense) writeList.get(i);
            try {
                out = new PrintWriter(new FileWriter(fileName));
                dump(out, writeExpense);
            }
            finally {
            }
        }
        else if(writeList.get(i) instanceof Income) {
            Income writeIncome = (Income) writeList.get(i);
            try {
                out = new PrintWriter(new FileWriter(fileName));
                dump(out, writeIncome);
            }
            finally {
            }
        }
    }
    out.close();
}

public void dump(PrintWriter out, Expense writeExpense) {
    out.print(writeExpense.getDateOfTransaction().get(GregorianCalendar.YEAR));
    out.print(",");
    out.print(writeExpense.getDateOfTransaction().get(GregorianCalendar.MONTH));
    out.print(",");
    out.print(writeExpense.getDateOfTransaction().get(GregorianCalendar.DATE));
    out.print(",");
    out.print(writeExpense.getItemName());
    out.print(",");
    out.print(writeExpense.getMethodOfPay());
    out.print(",");
    out.print(writeExpense.getPlaceOfPurchase());
    out.print(",");
    out.print(writeExpense.getQuantity());
    out.print(",");
    out.print(writeExpense.getPrice());
    out.print("\n");
}

and one other method similar to the 2nd one.
public void writeListToFile(
    final String fileName,
    final List<BudgetItem> listBudgetItem)
throws Exception
{
    PrintWriter out = null;

    try
    {
        out = new PrintWriter(new FileWriter(fileName));
        for(BudgetItem current : listBudgetItem)
        {
            out.println(current.toBlammy());
        }
    }
    catch (... exceptions)
    {
    }
    finally
    {
        // close the PrintWriter.
    }
}
public void writeListFile(字符串文件名,ArrayList writeList)引发异常{
PrintWriter out=null;

对于(int i=0;i我认为问题在于每次迭代都要创建一个新的
PrintWriter
。您应该在循环之外声明它。发生的情况是,当创建一个新的
PrintWriter
时,它会覆盖文件中存储的以前的数据

PrintWriter out = null;
try {
    out = new PrintWriter(new FileWriter(fileName));
    for(int i = 0; i<writeList.size(); i++) {   
        if(writeList.get(i) instanceof Expense) {
            Expense writeExpense = (Expense) writeList.get(i);

            dump(out, writeExpense);
    }
 } finally {
 }
PrintWriter out=null;
试一试{
out=新的PrintWriter(新的FileWriter(文件名));

对于(int i=0;i这是因为您正在为列表中的每个对象实例化一个新的
PrintWriter
对象(和一个新的
FileWriter
对象)

您应该只实例化它一次,在
for
循环之前。替换

PrintWriter out = null;


只是一个旁注:用当前的代码,你可能会在代码< >代码> .CUBE()中得到一个<代码> Null PoExtExeals< /Cuth>;如果你的代码> ARARYLIST/<代码>是空的。

:你是在写java,不是C++。使用java结构和技术。 正如MadConan所提到的,您的实现有些过分。对每个对象类型(费用和收入)使用toString()(或toBlammy()-blammy不是string)来格式化输出

提示:任何时候你有一组<代码>(如果是BLAMMY)< /C> >你应该考虑多态性。

您的代码应该如下所示:

Hot Dog,1.25,Grocery Store
Gas,42.15,Gas Station
etc.
public void writeListToFile(String fileName, ArrayList<BudgetItem> writeList) throws Exception {
    PrintWriter out = null;
    for(int i = 0; i<writeList.size(); i++) {   
        if(writeList.get(i) instanceof Expense) {
            Expense writeExpense = (Expense) writeList.get(i);
            try {
                out = new PrintWriter(new FileWriter(fileName));
                dump(out, writeExpense);
            }
            finally {
            }
        }
        else if(writeList.get(i) instanceof Income) {
            Income writeIncome = (Income) writeList.get(i);
            try {
                out = new PrintWriter(new FileWriter(fileName));
                dump(out, writeIncome);
            }
            finally {
            }
        }
    }
    out.close();
}

public void dump(PrintWriter out, Expense writeExpense) {
    out.print(writeExpense.getDateOfTransaction().get(GregorianCalendar.YEAR));
    out.print(",");
    out.print(writeExpense.getDateOfTransaction().get(GregorianCalendar.MONTH));
    out.print(",");
    out.print(writeExpense.getDateOfTransaction().get(GregorianCalendar.DATE));
    out.print(",");
    out.print(writeExpense.getItemName());
    out.print(",");
    out.print(writeExpense.getMethodOfPay());
    out.print(",");
    out.print(writeExpense.getPlaceOfPurchase());
    out.print(",");
    out.print(writeExpense.getQuantity());
    out.print(",");
    out.print(writeExpense.getPrice());
    out.print("\n");
}

and one other method similar to the 2nd one.
public void writeListToFile(
    final String fileName,
    final List<BudgetItem> listBudgetItem)
throws Exception
{
    PrintWriter out = null;

    try
    {
        out = new PrintWriter(new FileWriter(fileName));
        for(BudgetItem current : listBudgetItem)
        {
            out.println(current.toBlammy());
        }
    }
    catch (... exceptions)
    {
    }
    finally
    {
        // close the PrintWriter.
    }
}
public void writeListToFile(
最终字符串文件名,
最终列表列表(M)
抛出异常
{
PrintWriter out=null;
尝试
{
out=新的PrintWriter(新的FileWriter(文件名));
对于(当前预算项:listBudgetItem)
{
out.println(current.toBlammy());
}
}
捕获(…异常)
{
}
最后
{
//关闭打印机。
}
}

未测试,但我认为问题在于为列表中的每个项目创建一个新的
PrintWriter
。尝试在
for
循环之外创建
PrintWriter
。为什么不将创建输出的责任放在
toString()上
每种类型的方法?那么您只需要为每个对象执行一次
System.out.println(writeExpense);
操作。它打印哪一行?循环中的第一行还是循环中的最后一行?它只打印循环中的第一行。确定吗?请尝试
System.out.println(writeList.get(writeList.size()-1)
。查看它打印出的内容。我感觉它打印出的是最后一行,而不是第一行。我可能错了,但如果我是对的,我想我知道问题所在。好的,这在一定程度上解决了问题。它现在每次都在写同一个对象,即使我在转储的末尾打印了一个换行字符,它也不会在新行上写每一个新对象方法。也可以使用回车符?1)您需要使用
println()
,而不是
print(“\n”);
和2)数组中的对象很可能引用了同一个对象。是否要显示填充列表的代码?您使用了两次e
BudgetItem bi=(BudgetItem)e;
为所有的BudgetItems做这件事。你所做的是引用同一个BudgetItem eLOL哈哈,谢谢你,否则我不会注意到的。我觉得很傻。谢谢你的帮助,我很感激你能花时间看我的东西,但我要说的是,我是一个努力学习的学生。因为我正在完成这个项目我正在学习各种各样的东西,包括多态性、序列化等。尽管我已经学会了这些,但我还有一个最后期限要赶,没有时间回去改变我的整个程序。我不理解你提出建议的背景。