将JSon数组写入输出流时出现OutOfMemoryError

时间:2017-03-08 02:53:08

标签: java json

我有Java程序,我正在阅读大小约为40GB的文件,并将数据传输和流式传输到DataOutputstream。

以下是我的代码

    JSONObject jsonObj= new JSONObject();
                JSONArray jsonArray = new JSONArray();
                 JSONObject properties = new JSONObject(); 

           while((strLine = in.readLine()) != null)
                {


            if (jsonArray.length()%100 == 0) {

                    printJsonData(jsonArray);
            //      sendJsonData(jsonArray, output);
                    jsonArray = new JSONArray();
                }

if (strLine.trim().contains("data")) {
                        jsonObj.put("properties",properties);
                        jsonArray.put(jsonObj);

    if (strLine.trim().contains("data1")) {
                String secondPart = strLine.split(":",2)[1];
                properties.put("data1", secondPart);    
                continue;
                }
            if (strLine.trim().contains("id")) {
                String secondPart = strLine.split(":",2)[1];
                jsonObj.put("id", secondPart ); 
            continue;

            }

    }

我有两种方法,一种是打印JSON数据,另一种是通过https发送Json数据。

private void printJsonData(JSONArray jsonArray) {
      int count = jsonArray.length(); // get totalCount of all jsonObjects
      for(int i=0 ; i< count; i++){   // iterate through jsonArray 
            JSONObject jsonObject = jsonArray.getJSONObject(i);  // get jsonObject @ i position 
            System.out.println("jsonObject " + i + ": " + jsonObject);
        }
    }

private void sendJsonData(JSONObject jsonObj,DataOutputStream   output) throws IOException {

    int count = jsonArray.length();     

    for(int i=0 ; i< count; i++) {   // iterate through jsonArray 
        JSONObject jsonObject = jsonArray.getJSONObject(i);  // get jsonObject @ i position 
        System.out.println("Sending Data-->" + jsonObject.toString());
        output.writeBytes(jsonObject.toString()); 
    }
}

当我打电话给打印方法时,每件事情都可以。但是当我调用sendJsonData方法时。我得到OutofMemoryerror。想知道如何解决它?

1 个答案:

答案 0 :(得分:1)

由于你没有以任何方式操纵json,我会将其视为文本文件并以此方式发送。找到一个大型JsonObject的可能性很大,所以你可能会过多地推动它。

除非存在巨大的物体,否则40gb的数组非常大。

**编辑**

或者您可以将单个json对象视为“文件”并单独推送这些字符串