首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将实例变量写入文本文件

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

Stack Overflow用户
提问于 2013-12-06 15:51:03
回答 3查看 970关注 0票数 1

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

代码语言:javascript
运行
复制
Hot Dog,1.25,Grocery Store
Gas,42.15,Gas Station
etc.

我有一些代码如下所示:

代码语言:javascript
运行
复制
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.

当我运行它时,它只写出一行,列表中的第一个对象,而没有其他任何东西。我搞不清到底怎么回事。我知道对象序列化是一个更快的选择,但是对于这个项目,由于我还在学习,我想使用这种方式。

其中一个答案所要求的主要方法:

代码语言:javascript
运行
复制
public static void main(String[] args) throws Exception {
    String itemName = "Hot Dog";
    int quantity = 1;
    String placeOfPurchase = "Weiner Stand";
    String methodOfPay = "Credit";
    BigDecimal price = new BigDecimal(1.25);
    GregorianCalendar g = new GregorianCalendar(2013,11,1);
    Expense e = new Expense(g, price, itemName, quantity, placeOfPurchase, methodOfPay);
    BudgetItem bi = (BudgetItem) e;
    String itemName2 = "Gun";
    int quantity2 = 1;
    String placeOfPurchase2 = "Weiner Stand";
    String methodOfPay2 = "Credit";
    BigDecimal price2 = new BigDecimal(1.25);
    GregorianCalendar g2 = new GregorianCalendar(2013,11,1);
    Expense e2 = new Expense(g, price, itemName, quantity, placeOfPurchase, methodOfPay);
    BudgetItem bi2 = (BudgetItem) e2;
    ArrayList<BudgetItem> abi = new ArrayList<BudgetItem>();
    abi.add(bi);
    abi.add(bi2);
    RegisterFileIO rfio = new RegisterFileIO();
    rfio.writeListToFile(System.getProperty("user.dir") + "/data.out", abi);


    BufferedReader in = new BufferedReader(new FileReader(System.getProperty("user.dir") + "/data.out"));
    Scanner lineScanner = new Scanner(in);
    lineScanner.useDelimiter(",");
    while(lineScanner.hasNext()) {
        System.out.println(lineScanner.next());
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-06 15:53:53

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

代码语言:javascript
运行
复制
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 {
 }
票数 2
EN

Stack Overflow用户

发布于 2013-12-06 16:11:45

这是因为您正在为列表中的每个对象实例化一个新的PrintWriter对象(和一个新的FileWriter对象)。

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

代码语言:javascript
运行
复制
PrintWriter out = null;

使用

代码语言:javascript
运行
复制
PrintWriter out = new PrintWriter(new FileWriter(fileName));

请注意:使用当前代码,如果您的NullPointerException是空的,那么您可能会在out.close();行中得到一个ArrayList

票数 0
EN

Stack Overflow用户

发布于 2013-12-06 16:32:31

首先:您正在编写java,而不是C++。使用Java结构和技术。

正如MadConan所提到的,您的实现过度了。在每个对象类型(费用和收入)上使用toString() (或toBlammy() --不是字符串)来格式化输出。

提示:只要有一堆if (instanceof blammy),就应该考虑多态性。

您的代码应该如下所示:

代码语言:javascript
运行
复制
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.
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20428104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档