Android文件储存

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容