2017-09-05 5 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 funとVectorsはいくつかの値を表示するために重要ではありません。あなたは、私は以下の提案を持って、新しいバージョンのファイルたいアクションに入ることいつでも仮定し

+0

「データ」とは何ですか?行は同期された 'Vector'クラスですが、' data'も同期させる必要があります。それ以外の場合、行を作成するスレッドは適切にパブリッシュしないため、他のスレッドはそれを見ます。最後に、 'Vector'は古いクラスであり、使用すべきではありません。参照してください:https://stackoverflow.com/questions/1386275/why-is-java-vector-class-considered-obsolete-or-deprecated – Gray

+0

ベクトルは本当に私の問題ではありません(すでに解決済みです)が、必要ならばそれが便利なケースであることを知るためには、ベクトルからテーブルを作るのは簡単です。私の場合、これらはあまり使われていません。 – Canert

答えて

0

  1. はちょうど試しの上actionPerformedメソッドの内部でまとめとCSVWriter宣言を置きます。メソッドの中でそれを作成して閉じているのはなぜですか?

  2. 最終的にライタークローズステートメントを入れます。あなたのスレッドが何らかの理由で中断された場合、あなたのファイルは閉じられません(あなたに空のファイルを与えます)。

  3. スレッドの作成後、何らかの種類の結合ロジックを使用します。それ以外の場合は、closeを呼び出すとスレッド処理が行われ、データが失われます(おそらく空のファイルが返されます)。

+0

ええ、すでに自分自身に来たが、いずれかの方法:オープン/クローズメソッドでは、最後に閉じて、スレッドを結合して動作させた。とにかくありがとう! – Canert