Java 从URL读取一个90 mb的大文件

Java 从URL读取一个90 mb的大文件,java,json,Java,Json,如何从URL逐行读取大型json文件。我的json文件必须通过http从url读取。一旦我阅读了url,打开url流,我必须逐行阅读。它是一个json格式的文件。请帮忙。 我已尝试从url中读取以下内容: InputStream is = new URL(url).openStream(); BufferedReader reader = new BufferedReader(new InputStreamReader( is, Charset.forName("

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

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

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

以下是我从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();
}

根据你对这个问题的评论:

我有一个名为Documents的json数组。然后在这个数组中,我有多行,每行都有对象操作和文件名(指向其他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,一次处理一行。例如,使用API可以执行以下操作:

这样,一次只需在内存中保留一行


在其他JSON库中也有类似的API,尽管有些API比其他API更精细(例如,在JSON.org
JSONTokener
中,您必须自己明确地处理
分隔符)。

您的代码有问题吗?代码有什么问题?文件只是一个大的json对象吗?您在这里使用的是哪个json库?如果您知道所期望的JSON的一般格式,大多数库都有一些流式API,您可以使用它们?它是您想要立即加载的东西还是如何加载的?一行一行?向用户显示?
results+=行会造成伤害。。。您可以从使用StringBuilder开始,而不是使用字符串。您不太可能通过调整此代码来提高性能,最终您仍在通过网络传输一个90mb的文件。我的内存不足,而且现在它也没有改进代码。因此,任何建议都将不胜感激。您使用此代码会出现内存不足错误吗?我可以看到您的原始代码内存不足,但我发布的代码不应该。你从公众那里读取的URL是吗?@an Roberts在那里可以完全获得数组文档的大小。只是想知道r处理了多少行。出于监控目的。@user3161879不在前面,您必须声明一个计数器变量,每次在
while
循环中递增该计数器变量来计算它们。@an Roberts ok,谢谢。“您的程序非常有用。@安·罗伯茨:代码成功运行了很长时间,结果出现了一些异常,如com.google.gson.jsoniexception:java.io.IOException:PrematureEOF@user3161879堆栈跟踪和错误消息应该为您提供一些错误确切位置的指示。您确定JSON文件确实格式正确吗?记住,我给出的代码只是一个示例,您可能需要调整它以适合真实数据的格式,JsonReader有一个skipValue方法,您可以使用它跳过您不感兴趣的位。
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();