从URL读取一个巨大的90 MB文件

时间:2014-01-06 19:39:04

标签: java json

如何从URL逐行读取大型json文件。我的json文件必须通过http从url中读取。一旦我读了网址,打开网址流,我必须逐行阅读。它是一个json格式的文件。请帮忙。 我试图从网址读取如下:

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");

然后我再次为每一行循环播放数组。这里有一些改进代码的建议。

2 个答案:

答案 0 :(得分:2)

根据您对该问题的评论:

  

我有一个名为Documents的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,虽然有些API比其他JSON库更加繁琐(例如,使用json.org JSONTokener,您必须自己处理:,分隔符明确地)。

答案 1 :(得分: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();
}