Java OpenCSV编写器 - 生成空文件

时间:2017-09-05 15:57:22

标签: java multithreading csv filewriter opencsv

我遇到了OpenCSV lib的问题;准确地说,将字符串写入文件本身。

public class Calc {
    public static Summary summary;
    public static CSVWriter writer;
    (...)
        someButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                (...)
                summary = new Summary();
                writer = summary.createCSV();
                someThreadedMethod();
                summary.closeWriter(writer);
                } catch (...) {}
            }
        }
    }
}

摘要课:

public class Summary {
    private static int version = 0;
    private static String name;

    public Summary() throws IOException {
        this.version += 1;
        this.name = "Summary" + Integer.toString(version) + ".csv";
    }

    public CSVWriter createCSV() throws IOException {
        CSVWriter writer = new CSVWriter(new FileWriter(name));
        return writer;
    }

    public void addInfo(CSVWriter writer, String info) {
        String[] record = info.split("#");
        writer.writeNext(record);
    }

    public void closeWriter(CSVWriter writer) throws IOException {
        writer.close();
    }
}

并且 someThreadedMethod()创建另一个类对象,这些对象登录到给定的网站并解析给定的Strings表格表:

(...)
ArrayList<String> contentStrToPrint = new ArrayList<>(Arrays.asList(someStringArray));

for (int i = 7; i < contentStrToPrint.size(); i += 7) {
                for (String aSomething : something) {
                    if (contentStrToPrint.get(i).contains(aSomething)) {
                        StringBuilder summary = new StringBuilder();
                        for (int j = i; j < i + 7; j++) {
                            row.add(contentStrToPrint.get(j));
                            if (j != i + 6)
                                summary.append(contentStrToPrint.get(j)).append("#");
                            else
                                summary.append(contentStrToPrint.get(j));
                        }
                        data.add(row);
                        Calc.summary.addInfo(Calc.writer, summary.toString());
                        row = new Vector<>();
                    }
                }
            }

我知道这不是最新的代码。 结果我得到空的“Summary N .csv”文件。我在这里看不到错误;此外,我在测试项目中重新创建了这个 - 更简单,只在buttonClick上编写来自给定ArrayList的字符串(也来自给定的String []) - 并且它可以工作。 此外,在任何可能的阶段打印输出值都会返回正确的字符串。有可能以某种方式(我不知道如何)与线程方法连接?

非常感谢任何帮助!

PS带有Vectors的 fun 并不重要,需要显示一些值。

1 个答案:

答案 0 :(得分:0)

假设您进入操作的任何时候都需要新版本的文件,我有以下建议:

  1. 将Summary和CSVWriter声明放在tryPerformed方法的上方。您正在方法中创建并关闭它 - 为什么要保留它?

  2. 将作者关闭语句放在最后。因为如果您的线程因任何原因被中断,您的文件将不会被关闭(给您一个空文件)。

  3. 创建线程后使用某种连接逻辑。否则,当您调用close时,您仍将处理线程,并且您将丢失数据(可能会给您一个空文件)。

相关问题