Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编码JSON数组_Java_Android - Fatal编程技术网

Java 编码JSON数组

Java 编码JSON数组,java,android,Java,Android,我有一个JSON数组,我想把它写到一个文件中。关于编写文件,一切都很完美,但问题是当我尝试读取它时,会给我大量未编码的文本作为“alpha”。文本为阿拉伯语 这是我读取文件的代码: FileInputStream fis = openFileInput("File"); BufferedInputStream bis = new BufferedInputStream(fis); StringBuffer sb = new StringBuffer

我有一个JSON数组,我想把它写到一个文件中。关于编写文件,一切都很完美,但问题是当我尝试读取它时,会给我大量未编码的文本作为“alpha”。文本为阿拉伯语

这是我读取文件的代码:

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

从文件中读取数据时,尝试对其进行编码

Charset.forName("UTF-8").encode(sb.toString())
这个

这是错误的
JSON
在大多数情况下是以
UTF-8
编码的,这意味着字节不是字符。您需要使用
读取器
,它使用编码对流进行解码

例如:

InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
然后您可以读取,它将返回一个完整的
UTF-8
字符,可以是1到4个字节

以下是如何完整有效地读取文件:

        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();
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();
(这与将InputStream读取为字符串的Apache EntityUtils实现非常接近)

我强烈反对使用BufferedReader.readLine,这在很多地方都可以看到,原因有二:

  • 你甚至不知道你的文件中有一个换行符。它可能是一个亿万字符的长线。您必须等待它被完全缓冲,然后读取它,然后追加它。当您确实需要一个实例时,立即在内存中创建3个实例
  • 你会不可逆转地失去一些角色。即,\n和\r。它们都将被视为断线,你不可能知道是哪一个。在某些情况下,你会想知道
  • 担心带宽的服务器将从JSON文件中删除所有无关字符。制表符、空格、换行符。转到案例1

  • BufferedReader
    在从网络读取时很有趣,而
    readLine
    在读取大小有界的行时很有趣,因为它限制了链接速度慢时的读取调用次数,并允许逐行处理。

    请检查此链接可能会对您有所帮助,因为您正在读取一个字节并考虑一个字符。就是这样not@njzk2我该怎么做才能把它编码?嗯,读我的答案?它不接受这种方式。Eclipse给出了一个语法错误.dirty。您正在尝试重新编码已解码的字符串。同样,错误的是,当字符集解码ByteBuffers时,不是Strings感谢您的帮助,而是如何将InputStreamReader附加到StringBuffer。我试图附加它,但没能实现。我将用我尝试过的代码编辑我的帖子。使用你已经拥有的代码。InputStreamReader.read返回一个完整字符,因此
    char c=(char)irs.read()工作,但InputStreamReader isr没有与like BufferInputStream相同的功能。没有可用的isr();请帮助。您不需要可用性(如果您真的需要,可以将其包装在BufferedReader中)。你可以简单地一直读到-1(如果你读了文档,这表示流的结束),如果我错了,你能纠正我的代码吗?对不起,我在JSON方面没有足够的经验。我将编辑我的帖子。