美文网首页
Android文件储存

Android文件储存

作者: APOLOIZE | 来源:发表于2017-04-10 22:26 被阅读117次

    Android 文件储存分为两种:Internal Storage(自带内存储存),External Storage(SD卡储存)

    Internal Storage(自带内存储存):

    当保存文件到internal storage时,你可以通过执行下面两个方法之一来获取合适的目录作为 FILE 的对象:

    getFilesDir() : 返回一个File,代表了你的app的internal目录。

    getCacheDir() : 返回一个File,代表了你的app的internal缓存目录。请确保这个目录下的文件在一旦不再需要的时候能

    够马上被删除,并对其大小进行合理限制,例如1MB 。如果系统的内部存储空间不够,会自行选择删除缓存文件。

    为了在那些目录下创建一个新的文件,你可以使用File() 构造器,如下:

    File file = new File(context.getFilesDir(), filename);

    同样,你也可以执行openFileOutput() 来获取一个 FileOutputStream 用于写文件到internal目录。如下:

    ```

    String filename = "myfile";

    String string = "Hello world!";

    FileOutputStream outputStream;

    try {

    outputStream = openFileOutput(filename, Context.MODE_PRIVATE);

    outputStream.write(string.getBytes());

    outputStream.close();

    } catch (Exception e) {

    e.printStackTrace();

    }

    ```

    如果,你需要缓存一些文件,你可以使用createTempFile()。例如:下面的方法从URL中抽取了一个文件名,然后再在程序的

    internal缓存目录下创建了一个以这个文件名命名的文件。

    public File getTempFile(Context context, String url) {

    File file;

    try {

    String fileName = Uri.parse(url).getLastPathSegment();

    file = File.createTempFile(fileName, null, context.getCacheDir());

    catch (IOException e) {

    // Error while creating file

    }

    return file;

    }

    Note: 你的app的internal storage 目录是以你的app的包名作为标识存放在Android文件系统的特定目录下

    [data/data/com.example.xx]。 从技术上讲,如果你设置文件为可读的,那么其他app就可以读取你的internal文件。然

    而,其他app需要知道你的包名与文件名。若是你没有设置为可读或者可写,其他app是没有办法读写的。因此只要你

    使用MODE_PRIVATE ,那么这些文件就不可能被其他app所访问。


    External Storage(SD卡储存):

    为了写数据到external storage, 你必须在你的manifest文件中请求WRITE_EXTERNAL_STORAGE权限:所有的apps都可以在不指定某个专门的权限下做读external storage的动作。但是,这在以后的版本中会有所改变。如果你的app只需要读的权限(不是写), 那么你将需要声明 READ_EXTERNAL_STORAGE 权限。为了确保你的app能持续地正常工作,你需要现在就声明读权限。

    1: getDataDirectory() 获取到Android中的data数据目录(sd卡中的data文件夹)

    2:getDownloadCacheDirectory() 获取到下载的缓存目录(sd卡中的download文件夹)

    3:getExternalStorageDirectory() 获取到外部存储的目录 一般指SDcard(/storage/sdcard0)

    4:getExternalStorageState() 获取外部设置的当前状态 一般指SDcard,比较常用的应该是 MEDIA_MOUNTED(SDcard存在并且可以进行读写)还有其他的一些状态,可以在文档中进行查找。

    5:getRootDirectory()  获取到Android Root路径

    好,以下是具体操作,直接看代码:

    1,判断SD卡是否存在

    /**

    * 判断SDCard是否存在 [当没有外挂SD卡时,内置ROM也被识别为存在sd卡]

    *

    * @return

    */

    public static boolean isSdCardExist() {

    return Environment.getExternalStorageState().equals(

    Environment.MEDIA_MOUNTED);

    }

    2,获取SD卡根目录

    /**

    * 获取SD卡根目录路径

    *

    * @return

    */

    publicstaticString getSdCardPath() {

    booleanexist = isSdCardExist();

    String sdpath ="";

    if(exist) {

    sdpath = Environment.getExternalStorageDirectory()

    .getAbsolutePath();

    }else{

    sdpath ="不适用";

    }

    returnsdpath;

    }

    3,获取默认的文件存放路径

    /**

    * 获取默认的文件路径

    *

    * @return

    */

    publicstaticString getDefaultFilePath() {

    String filepath ="";

    File file =newFile(Environment.getExternalStorageDirectory(),

    "abc.txt");

    if(file.exists()) {

    filepath = file.getAbsolutePath();

    }else{

    filepath ="不适用";

    }

    returnfilepath;

    }

    4-1,使用FileInputStream读取文件

    try{

    le file =newFile(Environment.getExternalStorageDirectory(),

    "test.txt");

    FileInputStream is =newFileInputStream(file);

    byte[] b =newbyte[inputStream.available()];

    is.read(b);

    String result =newString(b);

    System.out.println("读取成功:"+result);

    }catch(Exception e) {

    e.printStackTrace();

    }

    4-2,使用BufferReader读取文件

    try{

    File file =newFile(Environment.getExternalStorageDirectory(),

    DEFAULT_FILENAME);

    BufferedReader br =newBufferedReader(newFileReader(file));

    String readline ="";

    StringBuffer sb =newStringBuffer();

    while((readline = br.readLine()) !=null) {

    System.out.println("readline:"+ readline);

    sb.append(readline);

    }

    br.close();

    System.out.println("读取成功:"+ sb.toString());

    }catch(Exception e) {

    e.printStackTrace();

    }

    httpConnection读取流保存成String数据

    URL url =newURL(getForwardUrl("/queryUserByUNorIP"));

    HttpURLConnection conn = (HttpURLConnection) url.openConnection();

    InputStream is = conn.getInputStream();

    BufferedReader br =newBufferedReader(newInputStreamReader(is));

    StringBuilder sb =newStringBuilder();

    String readline =null;

    while((readline = br.readLine()) !=null) {

    sb.append(readline);

    }

    System.out.println("result"+sb.toString());

    等效于使用ByteArrayOutputStream

    InputStream is = conn.getInputStream();

    ByteArrayOutputStream bos =newByteArrayOutputStream();

    byte[] buffer =newbyte[1024];

    intlen =-1;

    while((len=is.read(buffer))!=-1) {

    bos.write(buffer,0, len);

    }

    is.close();

    bos.close();

    String result =newString(bos.toByteArray());

    System.out.println("result"+result);

    5-1,使用FileOutputStream写入文件

    try{

    File file =newFile(Environment.getExternalStorageDirectory(),

    DEFAULT_FILENAME);

    FileOutputStream fos =newFileOutputStream(file);

    String info ="I am a chinanese!";

    fos.write(info.getBytes());

    fos.close();

    System.out.println("写入成功:");

    }catch(Exception e) {

    e.printStackTrace();

    }

    5-2,使用BufferedWriter写入文件

    try{

    File file =newFile(Environment.getExternalStorageDirectory(),

    DEFAULT_FILENAME);

    //第二个参数意义是说是否以append方式添加内容

    BufferedWriter bw =newBufferedWriter(newFileWriter(file,true));

    String info =" hey, yoo,bitch";

    bw.write(info);

    bw.flush();

    System.out.println("写入成功");

    }catch(Exception e) {

    e.printStackTrace();

    }

    BufferedWriter

    使用BufferedWriter,在构造BufferedWriter时,把第二个参数设为true(追加数据)

    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(

    new FileOutputStream(file, true)));

    out.write(conent);

    FileWriter

    构造函数中的第二个参数true表示以追加形式写文件

    FileWriter writer = new FileWriter(fileName, true);

    writer.write(content);

    writer.close();

    // 打开一个随机访问文件流,按读写方式

    RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");

    // 文件长度,字节数

    long fileLength = randomFile.length();

    // 将写文件指针移到文件尾。

    randomFile.seek(fileLength);

    randomFile.writeBytes(content);

    randomFile.close();

    相关文章

      网友评论

          本文标题:Android文件储存

          本文链接:https://www.haomeiwen.com/subject/dnmeattx.html