我尽量不打错别字,用词准确,不造成阅读障碍。
本篇讲述一般情况下的文件操作,如不理解外部存储和内部存储的概念,请阅读我之前的一篇文章:http://blog.csdn.net/Fly_li_sir/article/details/79496933;Android文件操作就是java的文件操作,不同之处就是你要知道Android的文件结构才能做到” 存哪里“、”读哪里“。
一般文件操作对象为简单文件存放和媒体数据(语音、视频、图片等)存放,数据媒体的存放在初始化设备的时候就指定了存放地址,你只要会创建临时文件就好了,所以本文主要以简单文件结合Android手机的内部存储和外部存储来讲解。
一.外部存储
一般情况下我们的文件操作是指对外部存储的操作,所以要设置文件路径,网上有很多案例是直接写文件名及后缀的,那是存储在内部存储中的。
public static final String APPLICATION_DIRECTORY = "/fileManagerDemo"; // “/”别忘了
先判断外部存储是否可用:
public static boolean isSDCardAvailable() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
创建文件夹
//fileName = "/fileManagerDemo";
public boolean createDir(String fileName) {
//首先要判断外部存储是否可用,此处用SDCard代替外部存储
if (isSDCardAvailable()) {
File file = new File(Environment.getExternalStorageDirectory() + fileName);
if (!file.exists()) {
return file.mkdirs();
}
}
return false;
}
顺便提一下mkdirs();和mkdir();的区别:
mkdir():只能创建一级目录且父目录必须存在,否则文件夹不会创建并返回false。
mkdirs():可以创建多级目录,父目录可以不存在,没有父目录会自动创建,所以一般直接写路径就好,开发中我用的比较多。
创建文件
文件名请带后缀,下同
//fileName = "/test.txt";
public boolean createFile(String fileName) {
if (isSDCardAvailable()) {
File mkDir = new File(Environment.getExternalStorageDirectory() + APPLICATION_DIRECTORY, fileName);
if (!mkDir.exists()) {
try {
return mkDir.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
写文件
写文件的方法有很多,这里介绍两种:
一.FileOutputStream形式
这是最基本的Java文件流操作形式:
//若路径详细,无文件时自动创建 fileName = "/test.txt";
public void writeFileToOutStorageOne(String content, String fileName) {
if (isSDCardAvailable()) {
try {
File file = new File(Environment.getExternalStorageDirectory() + APPLICATION_DIRECTORY + fileName);
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(content.getBytes()); //会覆盖文件内容
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二.RandomAccessFile形式
这个是随机读取类,File类更倾向于对文件本身进行操作,RandomAccessFile可以对文件内容进行更多操作,比如在文件的任意位置读取或写入,实际开发中本人更喜欢用这种。
//无文件时不会自动创建文件 fileName = "/test.txt";
public void writeFileToOutStorageTwo(String content, String fileName) {
if (isSDCardAvailable()) {
try {
File file = new File(Environment.getExternalStorageDirectory() + APPLICATION_DIRECTORY + fileName);
// file.delete();
// file.createNewFile();
RandomAccessFile raf = null;
if (file.canWrite()) {
raf = new RandomAccessFile(file, "rw"); //"rw"为读写,"r"为只读
raf.seek(raf.length()); //设置文件的写入位置,否则将覆盖内容
raf.write(content.getBytes());
raf.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
读文件
//fileName = "/test.txt";
public String readFile(String fileName) {
String result = null;
if (isSDCardAvailable()) {
try {
File file = new File(Environment.getExternalStorageDirectory() + APPLICATION_DIRECTORY, fileName);
FileInputStream fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream baso = new ByteArrayOutputStream();
while ((len = fileInputStream.read(buffer)) != -1) {
baso.write(buffer, 0, len);
}
result = baso.toString();
fileInputStream.close();
baso.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
删除文件
public boolean deleteFile(String fileName) {
if (isSDCardAvailable()) {
File file = new File(Environment.getExternalStorageDirectory() + APPLICATION_DIRECTORY + fileName);
return file.delete();
}
return false;
}
二.内部存储
想了一下,还是把内部存储的部分也写一写,只写读文件和写文件就可以了,因为写文件时文件会创建,删除文件与外部存储一摸一样。
写文件
public boolean createFile(String content) {
try {
FileOutputStream fos = mContext.openFileOutput("a.txt",Context.MODE_PRIVATE);
byte[] bytes = content.getBytes();
fos.write(bytes);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
读文件
public String readFile(){
String content = null;
try {
FileInputStream fis= mContext.openFileInput("a.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte [] buffer = new byte[1024];
int len = 0;
while ((len=fis.read(buffer))!=-1) {
baos.write(buffer, 0, len);
}
content = baos.toString();
fis.close();
baos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return content;
}
根据情况稍稍修改一下就好了。本文介绍的都是基础的用法,实际开发中会有很多方法可以用:附上File的一些方法:
方法名 | 作用 |
---|---|
File.getName(); | 获得文件或文件夹的名称 |
File.getParent(); | 获得文件或文件夹的父目录 |
File.getAbsoultePath(); | 获取绝对路径 |
File.getPath(); | 获取相对路径 |
File.createNewFile(); | 创建文件 |
File.mkDir(); /File.mkdirs(); | 创建文件夹 |
File.isDirectory(); | 判断是否是文件或文件夹 |
File.listFiles(); | 列出文件夹下的所有文件和文件夹名 |
File.renameTo(dest); | 修改文件夹和文件名 |
File.delete(); | 删除文件夹或文件 |
可以看出File类主要是对文件本身的操作;
如有不对的地方欢迎指正。