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)数组中的对象很可能引用了同一个对象。是否要显示填充列表的代码?您使用了两次eBudgetItem bi=(BudgetItem)e;
为所有的BudgetItems做这件事。你所做的是引用同一个BudgetItem eLOL哈哈,谢谢你,否则我不会注意到的。我觉得很傻。谢谢你的帮助,我很感激你能花时间看我的东西,但我要说的是,我是一个努力学习的学生。因为我正在完成这个项目我正在学习各种各样的东西,包括多态性、序列化等。尽管我已经学会了这些,但我还有一个最后期限要赶,没有时间回去改变我的整个程序。我不理解你提出建议的背景。