2017-01-10 8 views
0

ファイルに保存しようとしている間に、大きな生成文字列に苦労しています。大きな文字列を管理する方法

この文字列はcom.sap.conn.jco.JCoFunction.toXML()からの文字列です。方法。

が、私はこれをしようとしている:

public static void writeXML(JCoFunction jcoFunction, String path){ 
    File f = new File("C:/XMLFile.xml"); 

    try { 
     BufferedWriter bw = new BufferedWriter(new FileWriter(f)); 
     bw.write("<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?> "); 
     bw.write(jcoFunction.toXML()); 
     bw.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

これは、XML、約45キロバイトのサイズを作成する必要があります。しかし、私はJavaのヒープスペースエラーを取得します。私は上記のエラーを回避するために、効率的な方法を作るために助けが必要です。

ありがとうございます!

+0

この問題の原因はバッファリングされた書き込みか 'toXML'ですか? –

+0

'toXML'コール –

+0

参照http://stackoverflow.com/questions/6452765/how-to-increase-heap-size-of-jvm –

答えて

0

JCoFunctionについてよくわかりません。しかし、このコードを試してみてください。

private final static int BUFFER_SIZE = 1024; 

public static void writeXML(JCoFunction jcoFunction, String path) { 
    BufferedInputStream bis = null; 
    BufferedOutputStream bos = null; 

    try { 
     bis = new BufferedInputStream(new FileInputStream(new File("C:/XMLFile.xml"))); 
     bos = new BufferedOutputStream(new FileOutputStream(path)); 

     byte[] buf = new byte[BUFFER_SIZE]; 
     int len = 0; 
     while((len = bis.read(buf)) >= 0) { 
      bos.write(buf, 0, len); 
     } 

    } catch (FileNotFoundException e1) { 
     e1.printStackTrace(); 
    } catch (IOException e2) { 
     e2.printStackTrace(); 
    } finally { 
     try { 
      if(bis != null) bis.close(); 
      if(bos != null) bos.close(); 
     } catch (Exception e) {} 
    } 
} 
0

XMLデータは、実際には全体の45キロバイトにする必要がある場合は、設定済みのヒープサイズはどちらか小さすぎるか、JCoのバグ(例えば、内部の無限再帰ループ)を直撃しています。

最新のJCoパッチレ​​ベルをまだ使用していない場合は、まずこれをインストールして試してみてください。この潜在的なバグはすでに解決されているかもしれません。最新のJCoパッチレ​​ベルは現在3.0.16です。

これで解決できない場合は、Javaヒープ領域を増やしてください。 Javaプログラムを起動するときにJVMオプション-Xmx1024m(または-Xmx2048m以上)を指定します。

これでも問題が解決しない場合は、SAPのサポートに対処する必要があります。

また、JCoトレースレベル8をオンにして、実際にJCoFunctionインスタンスに転送/格納されているデータの量をJCoトレースでチェックインすることができます。

関連する問題