2017-09-05 68 views
0

我有OpenCSV lib的问题;精确地说,将字符串写入文件本身。Java OpenCSV编写器 - 生成空文件

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()创建其登录到指定网站,并解析给定的字符串形式的表另一个类的对象:

(...) 
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<>(); 
        } 
       } 
      } 

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

任何帮助将不胜感激!

PS 有趣与向量是不重要的,需要为了显示一些值。

+0

什么是数据?即使该行是一个同步的Vector类,数据也需要同步,否则创建该行的一个线程将不会适当地发布它,以便其他线程可以看到它。最后,'矢量'是一个古老的类,不应该使用。请参阅:https://stackoverflow.com/questions/1386275/why-is-java-vector-class-considered-obsolete-or-deprecated – Gray

+0

向量不是真的我的问题(这已经解决了),但如果你需要要知道这是一个方便的例子 - 很容易从矢量中创建一个表格。这些在我的情况下并不是非常消耗。 – Canert

回答

0

假设任何时候你进入行动你想,我有以下几点建议文件的新版本:

  1. 把总结和CSVWriter声明actionPerformed方法里面只是尝试以上。你正在创建和关闭它的方法 - 为什么保持它?

  2. 把作家最后的声明放在最后。因为如果你的线程因为任何原因被中断,你的文件将不会被关闭(给你一个空文件)。

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

+0

是的,已经提到了我自己,但无论如何:在方法中打开/关闭,最后关闭和加入线程使其工作。不管怎么说,还是要谢谢你! – Canert