2014-01-06 55 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是否公开? –

相关问题