Сериализация, как избежать исключения EOF и причины нерегулярного вывода [дубликат]

Библиотека org.json проста в использовании. Пример кода ниже:

import org.json.*;


JSONObject obj = new JSONObject(" .... ");
String pageName = obj.getJSONObject("pageInfo").getString("pageName");

JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++)
{
    String post_id = arr.getJSONObject(i).getString("post_id");
    ......
}

Вы можете найти больше примеров из: Parse JSON в Java

Загружаемый jar: http: // mvnrepository .com / артефакт / org.json / JSON

19
задан Tshepang 27 June 2014 в 07:08
поделиться

9 ответов

readObject() не возвращает null в EOF. Вы можете поймать EOFException и интерпретировать его как EOF, но это не сможет обнаружить отличную нормальную EOF из файла, который был усечен.

Лучшим подходом было бы использование некоторых метаданных. То есть вместо того, чтобы просить ObjectInput, сколько объектов находится в потоке, вы должны где-то хранить счетчик. Например, вы можете создать класс метаданных, который записывает счет и другие метаданные и сохраняет экземпляр как первый объект в каждом файле. Или вы можете создать специальный класс маркеров EOF и сохранить экземпляр как последний объект в каждом файле.

24
ответ дан erickson 24 August 2018 в 20:54
поделиться

Лучший возможный путь для завершения цикла можно сделать, добавив нулевой объект в конец. При чтении нулевого объекта можно использовать в качестве граничного условия для выхода из цикла. Захват EOFException также решает цель, но требуется несколько m

-1
ответ дан Aditya 24 August 2018 в 20:54
поделиться

Любопытно, что API не предлагает более элегантного решения. Я думаю, что EOFException будет работать, но мне всегда было предложено видеть исключения как неожиданные события, тогда как здесь вы часто ожидали, что поток объектов завершится. Я попытался обойти это, написав своего рода «маркерный» объект, чтобы обозначить конец потока объектов:

import java.io.Serializable;

public enum ObjectStreamStatus implements Serializable {
    EOF
}

Затем в коде, читающем объект, который я проверил для этого объекта EOF в объекте цикл считывания.

1
ответ дан Bosko Mijin 24 August 2018 в 20:54
поделиться

Если вы пишете нулевой объект в конце файла, когда вы его прочитаете, вы получите нулевое значение и можете завершить цикл.

Просто добавьте: out.writeObject (null);

при сериализации данных.

0
ответ дан C. Paul Bond 24 August 2018 в 20:54
поделиться

Доступный метод ObjectInputStream не может использоваться для завершения цикла, когда он возвращает 0, даже если в файле есть объекты, которые нужно прочитать. Написание нуля в файле doen't кажется хорошим решением, поскольку объекты могут быть нулевыми, которые затем будут интерпретироваться как конец файла. Я думаю, что уловка EOFException для прекращения циклов является лучшей практикой, поскольку, если возникает EOFException (либо из-за того, что вы достигли конца файла, либо по какой-либо другой причине), вы все равно должны завершить цикл.

0
ответ дан Eunwoo Song 24 August 2018 в 20:54
поделиться

Нет, вам нужно знать, сколько объектов есть в двоичном файле. Вы можете записать количество объектов в начале файла (например, с помощью writeInt) и прочитать его при загрузке.

Другой вариант - вызвать ois.available () и цикл до тех пор, пока он не вернет 0. Однако я не уверен, что это на 100%.

0
ответ дан Manuel Darveau 24 August 2018 в 20:54
поделиться

У меня была такая же проблема сегодня. Хотя вопрос довольно старый, проблема остается, и не было никакого чистого решения. Игнорирование EOFException следует избегать, поскольку оно может быть выброшено, если какой-либо объект был сохранен неправильно. Написание null, очевидно, не позволяет использовать нулевые значения для любых других целей. Наконец, использование available() в потоке объектов всегда возвращает ноль, так как количество объектов неизвестно.

Мое решение довольно просто. ObjectInputStream - это просто оболочка для другого потока, например FileInputStream. Хотя ObjectInputStream.available () возвращает ноль, FileInputStream.available вернет некоторое значение.

   FileInputStream istream = new FileInputStream(fileName);
   ObjectInputStream ois = new ObjectInputStream(istream);

   /** calculate number of items **/
   int line_count = 0;
   while( istream.available() > 0) // check if the file stream is at the end
   {
      (String)ois.readObject();    // read from the object stream,
                                   //    which wraps the file stream
      line_count++;
   }
18
ответ дан Sydwell 24 August 2018 в 20:54
поделиться

Похоже, проблема связана с данными, которые вы выписали. Предполагая, что данные записаны в соответствии с этим кодом, не должно быть проблем.

(Я вижу, что вы читаете String s. Это ObectInputStream не для чтения текстовых файлов. InputStreamReader и BufferedReader.readLine. Аналогично, если вы написали файл с DataOutputSteam.writeUTF, прочитайте его с помощью DataInputStream.readUTF)

0
ответ дан Tom Hawtin - tackline 24 August 2018 в 20:54
поделиться

Нет. Поймать EOFException и использовать это для завершения цикла.

6
ответ дан user207421 24 August 2018 в 20:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: