使用内部或外部存储(无论哪个),在Android中写入/读取字符串数组到文件

时间:2014-01-10 07:32:27

标签: android file-io

我正在从网络下载json响应数组字符串并使用此数据显示listview。我想将此响应首次存储在存储在内部/外部存储下的文件中,因此我不必再次下载数据未来。 如何将此响应存储在内部/外部存储文件中,并在我的应用程序重新启动时再次读取它。应该只在第一次创建文件,稍后再次启动应用程序时,检查文件是否存在应该是到位。 任何已完成此操作的示例/实用程序类?

这是我的代码...... 这段代码的问题是......它总是创建一个新目录和一个新文件。

public class FileCache {

    static File cacheDir;
    static final String DIRECTORY_ADDRESS = "/Android/data/com.example.savefiletostoragedemo/.newDirectory";
    static final String TAG="DEMO";
    public static void createDirectory(Context context){
        Log.i(TAG,"createDirectory() called...");

        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
             cacheDir = new File(Environment.getExternalStorageDirectory(),DIRECTORY_ADDRESS);
             Log.i(TAG,"cacheDir exists in ext storage?: "+cacheDir.exists());
        }

        else{
            cacheDir=context.getCacheDir();
            Log.i(TAG,"cacheDir exists in int storage?: "+cacheDir.exists());
        }


        if(!cacheDir.exists()){
             cacheDir.mkdirs();
             Log.i(TAG,"A New Directory is made[ "+cacheDir.getAbsolutePath());
        }
        else{
            Log.i(TAG,"Cache Dir already exists[ "+cacheDir.getAbsolutePath());
        }

    }    

    public static File getFile(String filename){
        //String filename=String.valueOf(url.hashCode());
        File f = new File(cacheDir, filename);
        return f;
    }

    public static void saveFile(String dataToWrite, File file){
        try {
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file));
            outputStreamWriter.write(dataToWrite);
            outputStreamWriter.close();
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }
    }
    public static String readFromFile(File file){
        try{
            InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file));
             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
             String receiveString = "";
             StringBuilder stringBuilder = new StringBuilder();

             while ( (receiveString = bufferedReader.readLine()) != null ) {
                 stringBuilder.append(receiveString);
             }
             bufferedReader.close();
             inputStreamReader.close();
             return stringBuilder.toString();
        }
        catch (FileNotFoundException e) {   
        } catch (IOException e) {
        }
        return null;

    }


public static void clear(){
    File[] files=cacheDir.listFiles();
    if(files==null)
        return;
    for(File f:files)
        f.delete();
}
}

我在Application类中调用createDirectory()

MainActivity.Java

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new DownloadUrsl().execute(null,null,null);
    }



    private class DownloadUrsl extends AsyncTask<String,String,String>{

        @Override
        protected String doInBackground(String... arg0) {
            File f = getJson("LISTVIEWDATA");
            //String jsonString =FileCache.readFromFile(f);
            //Log.i("DEMO", "DATA Read from file is:[ "+jsonString+" ]")
            return null;
        }
        private File getJson(String filename) {
            File f = FileCache.getFile(filename);
            if(f != null && f.isFile()) {
                String jsonString =FileCache.readFromFile(f);
                Log.i("DEMO", "DATA Read from file is:[ "+jsonString+" ]");
                return f;
            }

            try {
                Log.i("DEMO", "Starting data download...");
                HttpClient httpclient = new DefaultHttpClient();
                // make GET request to the given URL
                URI uri = new URI("");
                HttpResponse httpResponse = httpclient.execute(new HttpGet(uri));
                String response =EntityUtils.toString(httpResponse.getEntity());

                Log.i("DEMO", "DATA Received from net is:[ "+response+" ]");

                JSONArray array=new JSONArray(response);
                FileCache.saveFile(array.toString(), f);
                return f;                      
            } catch (Exception ex) {
                return null;
            }
        }
}

此代码的问题:此代码始终在应用程序启动时创建一个新目录...并且每次请求数据时都会创建一个新文件。我也尝试过isDirectory(),但没有用。

2 个答案:

答案 0 :(得分:1)

这是我怎么做的..谢谢你们的帮助.. :)

public static void createDirectory(Context context){         Log.i(TAG,“createDirectory()调用...”);

    if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
        File dataDir = new File(new File(Environment.getExternalStorageDirectory(), "Android"), "data");
        cacheDir = new File(new File(dataDir, context.getPackageName()), "cache");
        Log.i(TAG,"cacheDir exists in ext storage?: "+cacheDir.isDirectory());
    }

    else{
        cacheDir=context.getCacheDir();
        Log.i(TAG,"cacheDir exists in int storage?: "+cacheDir.isDirectory());
    }


    if(!cacheDir.isDirectory()){
         cacheDir.mkdirs();
         Log.i(TAG,"A New Directory is made[ "+cacheDir.getAbsolutePath());
    }
    else{
        Log.i(TAG,"Cache Dir already exists[ "+cacheDir.getAbsolutePath());
    }

}    

public static File getFile(String filename){
    //String filename=String.valueOf(url.hashCode());
    File f = new File(cacheDir, String.valueOf(filename.hashCode()));
    return f;
}

public static void saveFile(String dataToWrite, File file){
    try {
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file));
        outputStreamWriter.write(dataToWrite);
        outputStreamWriter.close();
    } catch (FileNotFoundException e) {
    } catch (IOException e) {
    }
}
public static String readFromFile(File file){
    try{
        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file));
         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
         String receiveString = "";
         StringBuilder stringBuilder = new StringBuilder();

         while ( (receiveString = bufferedReader.readLine()) != null ) {
             stringBuilder.append(receiveString);
         }
         bufferedReader.close();
         inputStreamReader.close();
         return stringBuilder.toString();
    }
    catch (FileNotFoundException e) {   
    } catch (IOException e) {
    }
    return null;

}

答案 1 :(得分:0)

    private static final String cacheDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + MyUtilClass.class.getPackage().getName();

    public static void cacheResponse(String name, List<String> data) throws IOException {
        File f = new File(cacheDir + "/" + name);
        if (f.exists())
            return;
        Writer fw = new FileWriter(f);
        for (String line : data) {
            fw.write(line);
        }
        fw.close();
    }