2013-09-25 57 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(); 

这将是巨大的,如果有人会提出任何解决方案,使文本显示完美。

编辑:

这是我试图将其追加到的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一个String)

我强烈反对使用BufferedReader.readLine,如许多地方所见,原因有两个:

  1. 您不知道文件中甚至有换行符。这可能是一个单一的数字字符长行。你必须等待它被完全缓冲,然后读取它,然后追加它。当你真的需要一个时,一次在内存中的三个实例。
  2. 你会不可逆转地释放一些字符。即,\ n和\ r。他们都将被视为一个换行符,没有任何可能让你知道它是什么。在某些情况下,您需要知道
  3. 担心其带宽的服务器将从JSON文件中删除所有无关字符。标签,空格,换行符。转到壳体1

BufferedReader从网络读取时很有趣,并且readLine读取界定尺寸线时,因为它限制了读出的呼叫的数量,当链路是缓慢的,并且允许线由行治疗。

+0

感谢您的帮助,但是如何将InputStreamReader附加到StringBuffer。我试图追加它,但我无法实现它。我将用我试过的代码编辑我的帖子。 –

+0

使用您已拥有的相同代码。 InputStreamReader.read返回一个完整的字符,因此'char c =(char)irs.read();'工作 – njzk2

+0

但InputStreamReader isr不具备像BufferInputStream一样的功能。没有isr.available();请帮忙。 –

0

虽然从文件中要读出的数据进行编码它

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

它不接受这种方式。 Eclipse给出了语法错误。 –

+0

你试图做什么?我编辑了我的代码...检查 –

+0

脏。你试着重新编码一个已经解码过的字符串。同样,错误,因为字符集解码ByteBuffers,而不是字符串 – njzk2