2013-09-25 2 views
0

У меня есть массив JSON, который я хочу записать в файл. Все прекрасно работает над написанием файла, но проблема в том, что когда я пытаюсь читать, он дает мне много некодированного текста как «...». Текст написан на арабском языке.Кодирование массива JSON

Это мой код, чтобы прочитать файл:

 FileInputStream fis = openFileInput("File"); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     StringBuffer sb = new StringBuffer(); 
     while(bis.available() != 0){ 
      char c = (char) bis.read(); 
      sb.append(c); 
     } 
     JSONArray read = new JSONArray(sb.toString());   
     for(int x = 0; x < read.length(); x++){ 
      JSONObject readOb = read.getJSONObject(x); 
      String id = readOb.getString("id"); 
      String name = readOb.getString("name"); 
      Toast.makeText(Main.this, "Id: " + id + "Name: " + name , Toast.LENGTH_LONG).show(); 
     } 
     bis.close(); 
     fis.close(); 

Было бы здорово, если бы кто-нибудь хотел бы предложить какое-либо решение, чтобы сделать текст появляются совершенно.

Edit:

Это то, что я пытался добавить его в StringBuffer.

  fis = openFileInput("Test"); 
     InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); 
     StringBuffer sb = new StringBuffer(); 
     while(isr.read() != 0){ 
      sb.append(isr.read()); 
     } 
+0

Пожалуйста, проверьте эту ссылку, может помочь вам http://www.mkyong.com/java/json-simple-example-read-and-write-json/ – Amit

+0

, потому что вы читаете байт и рассматриваете персонажа. что это не – njzk2

+0

@ njzk2 Что мне делать, чтобы закодировать? –

ответ

1

это

char c = (char) bis.read(); 

неправильно. JSON (в большинстве случаев) закодирован в UTF-8, то есть байт не является символом. Вам необходимо использовать Reader, который декодирует поток с использованием кодировки.

Например:

InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); 

Тогда вы можете прочитать, он будет возвращать полный UTF-8 символ, который может быть от 1 до 4 байт.

Вот как полностью и эффективно читать файл:

FileInputStream fis = openFileInput("My Books"); 
Reader reader = new InputStreamReader(fis, "UTF-8"); 
char[] buf = new char[1024]; 
int red = -1; 
StringBuffer sb = new StringBuffer(); 
while ((red = reader.read(buf)) != -1) { 
    sb.append(buf, 0, red); 
} 
fis.close(); 

(что довольно близко к реализации Apache EntityUtils на чтение InputStream в строку)

я сильно разочаровать использованием BufferedReader.readLine, как видно из многих мест, по двум причинам:

  1. Вы не знаете, что в вашем файле даже есть разрыв строки. Это может быть одна линия с длинным символом. Вам придется подождать, пока он будет полностью буферизован, затем прочитайте его, а затем добавьте его. 3 экземпляра в памяти сразу, когда вам это действительно нужно.
  2. Вы будете необратимо потерять некоторые символы. А именно, \ n и \ r. Они оба будут считаться перерывом в строке, без всякой возможности узнать, что это было. В некоторых случаях вам нужно знать
  3. Сервер, который обеспокоен своей пропускной способностью, удалит все посторонние символы из файла JSON. вкладки, пробелы, разрывы строк. Гото случай 1.

BufferedReader интересно, когда чтение из сети, и readLine при чтении строк ограниченного размера, поскольку оно ограничивает число прочитанных вызовов, когда связь происходит медленно, и позволяет линию построчно лечение.

+0

Благодарим вас за помощь, но как насчет добавления InputStreamReader в StringBuffer. Я попытался добавить его, но я не мог этого добиться. Я отредактирую сообщение с кодом, который я пробовал. –

+0

используйте тот же самый код, который у вас уже есть. InputStreamReader.read возвращает полный символ, поэтому 'char c = (char) irs.read();' works – njzk2

+0

Но InputStreamReader isr не имеет возможности делать то же, что и BufferInputStream. Нет isr.available(); Пожалуйста помоги. –

0

При чтении данных из файла пытаются закодировать его

Charset.forName("UTF-8").encode(sb.toString()) 
+0

Он не принимает его таким образом. Eclipse дает синтаксическую ошибку. –

+0

что ты сделал? Я отредактировал мой код ... проверьте –

+0

грязный. вы пытаетесь обновить уже декодированную строку. также, неправильно, поскольку Charset расшифровывает ByteBuffers, а не строки – njzk2

Смежные вопросы