2014-01-06 84 views
0

如何從URL中逐行讀取大的json文件。我的json文件必須通過http從url中讀取。一旦我讀了網址,打開網址流,我必須逐行閱讀。它是一個json格式文件。請幫忙。 我曾嘗試從如下網址爲:從URL中讀取一個巨大的90 MB文件

InputStream is = new URL(url).openStream(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, Charset.forName("UTF-8"))); 
String line, results = ""; 
while ((line = reader.readLine()) != null) { 
results += line; 
     } 
reader.close(); 
is.close(); 
JSONObject json = new JSONObject(results); 
JSONArray fileArray = json.getJSONArray("Documents"); 

然後再次的IAM循環數組每個line.Any建議,以改善這裏的代碼。

+2

你的代碼有問題嗎? – MxyL

+0

你的代碼有什麼問題?該文件只是一個大的JSON對象? –

+0

你在使用哪個JSON庫?如果您知道您期望的JSON的一般格式,大多數圖書館都可以使用某種流API。 –

回答

2

從對這個問題您的意見:

我有一個名爲文檔一個JSON數組。然後在這個數組中,我有多行,其中每行都有對象Action和Filenames(指向其他文件位置,這是html格式)。基本上我想要逐行閱讀這個json文件,並單獨處理這個動作和文件名。因爲動作和文件名在每行中都不相同。

據我瞭解,你正在使用的格式是這樣的:

{"Documents":[ 
    {"Action":"action 1", "Filenames":["file 1a", "file 1b"]}, 
    {"Action":"action 2", "Filenames":["file 2a", "file 2b"]}, 
    // and so on for thousands more array entries 
]} 

而不是試圖一次性加載整個頂層JSON對象,它會更有意義使用某種流媒體API並一次處理一個「行」。例如,使用Gson你可以做這樣的事情與JsonReader API:

InputStream is = new URL(url).openStream(); 
BufferedReader r = new BufferedReader(new InputStreamReader(
       is, Charset.forName("UTF-8"))); 
JsonReader reader = new JsonReader(r); 
JsonParser parser = new JsonParser(); 

reader.beginObject(); // the initial '{' 
String name = reader.nextName(); 
assert "Documents".equals(name); 
reader.beginArray(); // the opening '[' of the Documents array 
while(reader.hasNext()) { 
    JsonObject doc = parser.parse(reader).getAsJsonObject(); 
    String action = doc.get("Action").getAsString(); 
    JsonArray filenames = doc.getAsJsonArray("Filenames"); 
    // do something with the document here 
    // ... 
} 

reader.endArray(); // ending ']' of Documents 
reader.endObject(); // final '}' 
reader.close(); 

這樣,你只能有一個時間保留在內存中一個「行」。

還有其他JSON庫類似的API,儘管有些人比其他人更繁瑣(例如與json.org JSONTokener你必須處理:,分離自己明確)。

+0

@an Roberts無論如何都可以完全獲得數組Document的大小。只是想知道處理了多少行。用於監視目的。 – user3161879

+0

@ user3161879不在前面,你必須通過聲明一個計數器變量來計算它們,你每次在while循環中增加一個計數器變量。 –

+0

@an Roberts好的謝謝。您的計劃非常有幫助。 – user3161879

0

這是我用什麼來從URL中讀取JSON:

public static String readJsonFromUrl(String url) throws IOException 
{ 
    InputStream is = new URL(url).openStream(); 
    try { 
     BufferedReader rd = new BufferedReader(
       new InputStreamReader(is, Charset.forName("UTF-8"))); 
     String jsonText = readAll(rd); 
     return jsonText; 
    } finally { 
     is.close(); 
    } 
    return ""; 
} 

private static String readAll(Reader rd) throws IOException 
{ 
    StringBuilder sb = new StringBuilder(); 
    int cp; 
    while ((cp = rd.read()) != -1) { 
     sb.append((char) cp); 
    } 
    return sb.toString(); 
} 
+0

您不太可能通過調整此代碼來提高性能,在當天結束時您仍然通過網絡傳輸90mb文件。 –

+0

我的內存不足,現在也沒有改善代碼。所以,任何建議將不勝感激。 – user3161879

+0

您使用此代碼出現內存不足錯誤?我可以看到你的原始代碼耗盡內存,但我發佈的代碼不應該。您正在閱讀的URL是否公開? –

相關問題