2016-04-01 37 views
0

これは私の状況です。私は<!ENTITY>宣言をXMLファイルに書いています。私はスキャナを使って元のXMLファイルを読みました。スキャナが入力ファイルを読み込むと、ラインがBufferedWriterに書き込まれます。スキャナが2行目にあるときは、メソッドに渡されたArrayListの値を<!ENTITY>と書きます。私の<!ENTITY>の値は問題ありません。私が抱えている問題は、出力ファイルに書き込まれるファイルが400行ほどしかないということです。Java BufferWriterがファイルの書き込みを完了していません

enter image description here

私はここBufferedWritersがファイルへの書き込みが完了していないに関する上のいくつかの記事を読んできた、とすべてが閉じているライターを確保することを指すように見えました。私は私の作家オブジェクトを閉じました。

private void addEntityRefs(Map<String, String> icns, File xml) 
{ 
    String path = xml.getAbsolutePath().substring(0,xml.getAbsolutePath().lastIndexOf(File.separator)+1); 
    ArrayList<String> list = new ArrayList<String>(); 
    Scanner reader = null; 
    BufferedWriter writer = null; 
    for(Map.Entry<String, String> e : icns.entrySet()) 
    { 
     list.add(e.getValue()); 
    } 
    try 
    { 
     reader = new Scanner(xml); 
     //standardOut.println("Reading " + xml.getName()); 
     //System.out.println(); 
     int c = 0; 
     String output = path + "out2.xml"; 
     writer = new BufferedWriter(new FileWriter(new File(output))); 

     while(reader.hasNextLine()) 
     { 
      c++; 
      if(c == 1) 
      { 
       writer.append(reader.nextLine().replaceAll("\\s", " ")); 
      } 
      else if(c == 2) 
      { 
       System.out.println("writing entities @ line 2"); 
       writer.append("\n<!DOCTYPE pm [\n"); 

       for(int i = 0; i < list.size(); i++) 
       { 
        writer.append("<!ENTITY " + list.get(i).trim() + " SYSTEM \"" + list.get(i).trim() + ".cgm\" NDATA cgm>\n"); 
       } 
       writer.append("<!NOTATION cgm PUBLIC \"cgm\" \"\">\n]>\n"); 
      } 
      else 
      { 
       System.out.println("Writing line " + c); 
       writer.append(reader.nextLine().replaceAll("\\s", " ")+ "\r"); 
      } 

     } 

    } 
    catch (FileNotFoundException ex) 
    { 
     Logger.getLogger(AARPdfGenUI.class.getName()).log(Level.WARN, null, ex); 
     JOptionPane.showMessageDialog(this, ex, "File Not Found Exception", JOptionPane.ERROR_MESSAGE); 
    } 
    catch (IOException ex) 
    { 
     Logger.getLogger(AARPdfGenUI.class.getName()).log(Level.WARN, null, ex); 
     JOptionPane.showMessageDialog(this, ex, "IO Exception", JOptionPane.ERROR_MESSAGE); 
    } 
    finally 
    { 
     try 
     { 
      reader.close(); 
      writer.close(); 
     } 
     catch(Exception e) 
     { 
      Logger.getLogger(AARPdfGenUI.class.getName()).log(Level.WARN, null, e); 
     JOptionPane.showMessageDialog(this, e, "Exception", JOptionPane.ERROR_MESSAGE); 
     } 
    } 
} 

ライターの出力は、PDFを生成するために使用されます。読み込まれたファイルと<!ENTITY>宣言が追加された行は約26,000行です。誰かが私が間違っているところへ私を向けることができますか?このメソッドは、NetBeansからアプリケーションを実行すると問題なく動作しますが、一度ビルドしてJARファイルから実行しようとすると、約400行後に停止します。

+0

関連するログメッセージはありますか? 'while'ループが正常に終了するか例外を伴って終了するかを知っていますか? –

+0

@StephenCいいえ、ログメッセージはありません。私はそれがIDEでうまく動作する方法については迷っていますが、ビルドすると書き込みが完了しません。 – twfurst

+0

あなたは2番目の質問に答えませんでした。 –

答えて

0

特定の行で停止する場合。これらの行でファイルが作成されているのが見えますか?バッファがその時点でフラッシュされ、その操作で失敗した可能性があります。

c == 2のときにポインタを次の行に移動せず、次の繰り返しで書き込みを続けます。 読み書きの際には、常に文字セットを使用する方が良いです。 最後にフラッシュしてみます。 、読み取りと書き込みの両方を依存して閉じます。 ArrayListを無駄に使用します。

これはマイナーチェンジしました。それがまだ動作するかどうかを確認してください。

private void addEntityRefs(Map<String, String> icns, File xml) { 
    Scanner reader = null; 
    BufferedWriter writer = null; 
    try { 
     reader = new Scanner(xml, "utf-8"); 
     // standardOut.println("Reading " + xml.getName()); 
     // System.out.println(); 
     int count = 0; 
     File targetFile = new File(xml.getParentFile(), "out2.xml"); 
     if (!targetFile.exists()) { 
      boolean created = targetFile.createNewFile(); 
      System.out.println("File created: " + created); 
     } 
     writer = new BufferedWriter(new FileWriter(targetFile)); 

     while (reader.hasNextLine()) { 
      count++; 
      if (count == 1) { 
       writer.append(reader.nextLine().replaceAll("\\s", " ")); 
      } else if (count == 2) { 
       System.out.println("writing entities @ line 2"); 
       writer.append("\n<!DOCTYPE pm [\n"); 

       for (String item : icns.keySet()) { 
        item = item.trim(); 
        writer.append("<!ENTITY " + item + " SYSTEM \"" + item + ".cgm\" NDATA cgm>\n"); 
       } 
       writer.append("<!NOTATION cgm PUBLIC \"cgm\" \"\">\n]>\n"); 
      } else { 
       System.out.println("Writing line " + count); 
       writer.append(reader.nextLine().replaceAll("\\s", " ")).append("\r"); 
      } 
     } 
     // done writing 
     writer.flush(); 

    } catch (FileNotFoundException ex) { 
     Logger.getLogger(AARPdfGenUI.class.getName()).log(Level.WARN, null, ex); 
     JOptionPane.showMessageDialog(this, ex, "File Not Found Exception", JOptionPane.ERROR_MESSAGE); 
    } catch (IOException ex) { 
     Logger.getLogger(AARPdfGenUI.class.getName()).log(Level.WARN, null, ex); 
     JOptionPane.showMessageDialog(this, ex, "IO Exception", JOptionPane.ERROR_MESSAGE); 
    } finally { 
     try { 
      reader.close(); 
     } catch (Exception e) { 
      Logger.getLogger(AARPdfGenUI.class.getName()).log(Level.WARN, null, e); 
      JOptionPane.showMessageDialog(this, e, "Exception", JOptionPane.ERROR_MESSAGE); 
     } 
     try { 
      writer.close(); 
     } catch (Exception e) { 
      Logger.getLogger(AARPdfGenUI.class.getName()).log(Level.WARN, null, e); 
      JOptionPane.showMessageDialog(this, e, "Exception", JOptionPane.ERROR_MESSAGE); 
     } 
    } 
} 
+0

これでファイルが処理されました。ありがとうございました。 Scannerでエンコーディングが必要であることが判明しました。そのファイルを削除した場合、ファイルは同じポイントで失敗します。 – twfurst

関連する問題