// 获得dictionary.db文件的绝对路径 String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME; File dir = new File(DATABASE_PATH); // 如果/sdcard/dictionary目录中存在,创建这个目录 if (!dir.exists()) dir.mkdir(); // 如果在/sdcard/dictionary目录中不存在 // dictionary.db文件,则从res/raw目录中复制这个文件到 // SD卡的目录(/sdcard/dictionary) if (!(new File(databaseFilename)).exists()) { // 获得封装dictionary.db文件的InputStream对象 InputStream is = getResources().openRawResource( R.raw.dictionary); FileOutputStream fos = new FileOutputStream(databaseFilename); byte[] buffer = new byte[8192]; int count = 0; // 开始复制dictionary.db文件 while ((count = is.read(buffer)) > 0) { fos.write(buffer, 0, count); } fos.close(); is.close();
老根和大灰狼,thanks
Android支持四种数据存储方式,分别是Preference, File, DataBase, Content Provider 。这几天工作上的一个测试程序要求存储一个图像文件,用了用File的这种方式,有了一点小小的心得。
先说下,Preference,File, DataBase这三种方式分别对应的目录是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。
在Android中通常使用File存储方式是用Context.openFileOutput(String fileName, int mode)和Context.openFileInput(String fileName)。
Context.openFileOutput(String fileName, int mode)生成的文件自动存储在/data/data/Package Name/files目录下,其全路径是/data/data/Package Name/files/fileName 。注意下,这里的参数fileName不可以包含路径分割符(如"/")。
来源:(http://blog.sina.com.cn/s/blog_5599af670100cpxs.html) - Android的数据存储_jacob_新浪博客
通常来说,这种方式生成的文件只能在这个apk内访问。但这个结论是指使用Context.openFileInput(String fileName)的方式。使用这种方式,每个apk只可以访问自己的/data/data/Package Name/files目录下的文件,原因很简单,参数fileName中不可以包含路径分割符,Android会自动在/data/data/Package Name/files目录下寻找文件名为fileName的文件。
但是如果你直接使用这个File,那么这个File在其它apk中也是可以访问的,不过要注意在之前调用Context.openFileOutput(String file, int mode)时不要使用缺省的mode:MODE_PRIVATE ,而应该使用MODE_WORLD_READABLE 。使用缺省mode生成的文件的权限是“660”(也就是rw-rw----),而使用后者生成文件的权限是允许运行别的apk访问的。代码如下:
File file = new File("/data/data/Package Name/files/fileName");
另外还有一个方法可以改变这个生成文件的权限。可以直接在Java代码中执行Linux命令,毕竟Android归根到底也是Linux .代码如下:
Process process = Runtime.getProcess().exec("chmod 666 /data/data/Package Name/files/fileName");
process.waitFor();
//2012-2-24
关于Android2.2以下不能传大于1兆的文件,所以要分割后再合并。论坛中的解决方案,这里。
private Context context; private String rootDirectory = "/data/data/CrazyNovelV1_0.com/data/"; private final String DATABASE_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + "/crazynovel"; private final String DATABASE_FILENAME = "crazynovel.db"; //复制小于1M的数据库程序 public SQLiteDatabase openDatabase() { try { // 获得dictionary.db文件的绝对路径 String databaseFilename = DATABASE_PATH+ "/" + DATABASE_FILENAME; File dir = new File(DATABASE_PATH); // 如果/sdcard/dictionary目录不中存在,创建这个目录 if (!dir.exists()) dir.mkdir(); // 如果在/sdcard/dictionary目录中不存在 // dictionary.db文件,则从res\raw目录中复制这个文件到 // SD卡的目录(/sdcard/dictionary) if (!(new File(databaseFilename)).exists()) { //复制文件 copydb(R.raw.crazynovel1,DATABASE_PATH+ "/crazynovel1",944128); copydb(R.raw.crazynovel2,DATABASE_PATH+ "/crazynovel2",944128); copydb(R.raw.crazynovel3,DATABASE_PATH+ "/crazynovel3",944128); copydb(R.raw.crazynovel4,DATABASE_PATH+ "/crazynovel4",944128); copydb(R.raw.crazynovel5,DATABASE_PATH+ "/crazynovel5",944128); copydb(R.raw.crazynovel6,DATABASE_PATH+ "/crazynovel6",944128); copydb(R.raw.crazynovel7,DATABASE_PATH+ "/crazynovel7",944128); copydb(R.raw.crazynovel8,DATABASE_PATH+ "/crazynovel8",944128); copydb(R.raw.crazynovel9,DATABASE_PATH+ "/crazynovel9",944128); copydb(R.raw.crazynovel10,DATABASE_PATH+ "/crazynovel10",944128); copydb(R.raw.crazynovel11,DATABASE_PATH+ "/crazynovel11",944128); copydb(R.raw.crazynovel12,DATABASE_PATH+ "/crazynovel12",669696); //合并文件 File[] files = new File[12]; files[0] = new File(DATABASE_PATH+ "/crazynovel1"); files[1] = new File(DATABASE_PATH+ "/crazynovel2"); files[2] = new File(DATABASE_PATH+ "/crazynovel3"); files[3] = new File(DATABASE_PATH+ "/crazynovel4"); files[4] = new File(DATABASE_PATH+ "/crazynovel5"); files[5] = new File(DATABASE_PATH+ "/crazynovel6"); files[6] = new File(DATABASE_PATH+ "/crazynovel7"); files[7] = new File(DATABASE_PATH+ "/crazynovel8"); files[8] = new File(DATABASE_PATH+ "/crazynovel9"); files[9] = new File(DATABASE_PATH+ "/crazynovel10"); files[10] = new File(DATABASE_PATH+ "/crazynovel11"); files[11] = new File(DATABASE_PATH+ "/crazynovel12"); FileOutputStream fos = new FileOutputStream(databaseFilename); CreateFromRawDbFiles(files,fos); } catch (Exception e) { } } //复制文件 private void copydb(int dbint,String databaseFilename,int FileSize) { try { // 获得封装dictionary.db文件的InputStream对象 InputStream is = context.getResources().openRawResource(dbint); FileOutputStream fos = new FileOutputStream(databaseFilename); byte[] buffer = new byte[FileSize]; int count = 0; // 开始复制dictionary.db文件 while ((count = is.read(buffer)) > 0) { fos.write(buffer, 0, count); } fos.close(); is.close(); } catch(Exception e) {} } //合并并拷贝数据 private void CreateFromRawDbFiles(File[] filelist,FileOutputStream Fos) { try { for (File file : filelist) { InputStream inputFile = new FileInputStream(file); int TotalLength = 0; try { TotalLength = inputFile.available(); } catch (IOException e) { } // Reading and writing the file Method 1 : byte[] buffer = new byte[TotalLength]; int len = 0; try { len = inputFile.read(buffer); } catch (IOException e) { } Fos.write(buffer,0,len); inputFile.close(); } Fos.close(); } catch(IOException e) {} }