запись файла .json и чтение этого файла в Android

Я пишу файл .json, и я хочу прочитать этот файл, но проблема в том, что когда я пытаюсь прочитать весь файл как строку, он добавляет пробел до и после каждого символа и только из-за дополнительных символов он не может прочитать json.

формат Json

[{"description1":"The ThinkerA bronze sculpture by Auguste Rodin. It depicts a man in sober\nmeditation battling with a powerful internal struggle.","description2":"Steve JobsFounder of Apple, he is widely recognized as a charismatic pioneer of\nthe personal computer revolution.","description3":"Justin BieberBorn in 1994, the latest sensation in music industry with numerous\nawards in recent years."}]

но он дает странный ответ вроде: [{"d e s c r i p t i o n 1": "T h e .....

чтобы обрезать лишние пробелы, я сослался на это, но все равно не сработало: Java, как заменить 2 или более пробелов одним пробелом в строке и удалить только начальные пробелы

я использую этот код

File folderPath = Environment.getExternalStorageDirectory();
File mypath=new File(folderPath, "description.json");
StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader = null;
reader = new BufferedReader(new FileReader(mypath));
char[] buf = new char[1024];
int numRead=0;

while((numRead=reader.read(buf)) != -1)
{
    String readData = String.valueOf(buf, 0, numRead);
    fileData.append(readData);
    buf = new char[1024];
}
String response = fileData.toString();

строка "ответ" содержит странный ответ

так может ли кто-нибудь мне помочь?

для записи в файл я использую:

FileOutputStream fos = new FileOutputStream(mypath);
DataOutputStream dos = new DataOutputStream(fos);
dos.writeChars(response);

person SML    schedule 08.01.2013    source источник
comment
BufferedReader имеет readLine метод. Попробуйте использовать это.   -  person Mikita Belahlazau    schedule 08.01.2013
comment
Не могли бы вы опубликовать код, который вы используете для записи файла? Похоже, вы пишете символы в 16-битном формате.   -  person vaughandroid    schedule 08.01.2013
comment
Попробуйте открыть файл и посмотрите, есть ли в нем пробел или невидимый символ. Также попробуйте войти в журнал, чтобы увидеть, что возвращается в numRead и readData для каждой итерации. Это необходимо для того, чтобы убедиться, что проблема связана с чтением, а не с записью.   -  person RobGThai    schedule 08.01.2013
comment
@RobGThai, я писал с использованием writeChars, что приводит к записи пробелов перед каждым отдельным символом, теперь я использую writeUTF, и проблема решена. спасибо всем за то, что поделились своим мнением.   -  person SML    schedule 09.01.2013


Ответы (4)


writeChars записывает каждый символ как два байта.

http://docs.oracle.com/javase/6/docs/api/java/io/DataOutputStream.html#writeChars(java.lang.String)

http://docs.oracle.com/javase/6/docs/api/java/io/DataOutputStream.html#writeChar(int)

Writes a char to the underlying output stream as a 2-byte value, high byte first. If no exception is thrown, the counter written is incremented by 2.
person auselen    schedule 09.01.2013

Напишите ниже метод для записи файла Json, здесь params - имя файла, а mJsonResponse - ответ сервера.

Для создания файлов во внутренней памяти приложения

public void mCreateAndSaveFile(String params, String mJsonResponse) {
    try {
        FileWriter file = new FileWriter("/data/data/" + getApplicationContext().getPackageName() + "/" + params);
        file.write(mJsonResponse);
        file.flush();
        file.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Для чтения данных из файла Json здесь params - имя файла.

public void mReadJsonData(String params) {
    try {
        File f = new File("/data/data/" + getPackageName() + "/" + params);
        FileInputStream is = new FileInputStream(f);
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        String mResponse = new String(buffer);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
person Dipak Keshariya    schedule 09.01.2013

Мне нравится приведенный выше ответ и отредактировано: я просто люблю делиться, поэтому я поделился тем, что может быть полезно другим.

Скопируйте и вставьте следующий класс в свой пакет и используйте его, например:

Сохранить: MyJSON.saveData(context, jsonData);

Прочитано: String json = MyJSON.getData(context);

import android.content.Context;
import android.util.Log;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;

/**
 * Created by Pratik.
 */
public class MyJSON {

    static String fileName = "myBlog.json";

    public static void saveData(Context context, String mJsonResponse) {
        try {
            FileWriter file = new FileWriter(context.getFilesDir().getPath() + "/" + fileName);
            file.write(mJsonResponse);
            file.flush();
            file.close();
        } catch (IOException e) {
            Log.e("TAG", "Error in Writing: " + e.getLocalizedMessage());
        }
    }

    public static String getData(Context context) {
        try {
            File f = new File(context.getFilesDir().getPath() + "/" + fileName);
            //check whether file exists
            FileInputStream is = new FileInputStream(f);
            int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
            return new String(buffer);
        } catch (IOException e) {
            Log.e("TAG", "Error in Reading: " + e.getLocalizedMessage());
            return null;
        }
    }
}
person Pratik Butani    schedule 06.11.2015

Ваш код написания - это проблема. Просто используйте

FileWriter fos = new FileWriter(mypath);
fos.write(response);
person Henry    schedule 09.01.2013