2017-01-10 26 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,大約45KB大小。但是我得到一個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數據確實應該是45KB整體而已,你的配置堆大小要麼太小,或者你打的JCO的錯誤(例如內部無盡的遞歸循環)。

如果還沒有使用最新的JCo補丁程序級別,我會安裝並首先嚐試這個補丁程序。也許這個潛在的bug已經被解決了。最新的JCo補丁程序目前是3.0.16。

如果這沒有幫助,請增加Java堆空間,例如,通過在啓動Java程序時指定JVM選項-Xmx1024m(或-Xmx2048m或更大)。

如果仍然無法解決問題,則可能需要將此解決方案解決給SAP支持。

此外,您可以打開JCo跟蹤級別8並檢查JCo跟蹤有多少數據實際傳輸/存儲在JCoFunction實例中。