声明SD卡权限
<!-- 允许程序访问外部存储设备 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 允许创建和删除外部存储设备的文件 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
特别注意特别注意特别注意的坑
虽然声明了权限,但在运行过程会有异常,如下:
java.io.IOException: open failed: EACCES (Permission denied)
不要急,看下你是不是在应用设置的android:targetSdkVersion=”23”
改成22或以下就可以了,android:targetSdkVersion=”22”,具体原因查资料:
No declaring the permission is not enough when targeting Api23.
在SD卡下创建文件夹
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//SD卡可挂载
//获取扩展存储设备的文件目录
File rootFile = Environment.getExternalStorageDirectory();
String tmpFilePath = rootFile.getPath() + "/yuTest";
File tmpFile = new File(tmpFilePath);
if (!tmpFile.exists()) {
tmpFile.mkdir();
} else {
Log.i(TAG, "tmpFile exists");
}
}
附:
1)其实创建文件夹,就是创建一个目录(路径),所以用public File(String path)构造方法,表示构建新的File的路径
2)file.mkdir():创建此抽象路径名称指定的目录,只能创建一级目录,且父目录必须存在
3)file.mkdirs():创建此抽象路径指定的目录,可以创建多级目录,父目录可以不存在
在SD卡下创建文件
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File txtFile = new File (Environment.getExternalStorageDirectory(), "text.txt");
if (!txtFile.exists()) {
try {
FileOutputStream outputStream = new FileOutputStream(txtFile);
outputStream.write("hello".getBytes());
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
附:
1)public File(File dir, String name):File表示构建新的File的路径,name表示构建新的File的名字
2)public FileOutputStream (File file):创建一个文件,并向文件中写数据,如果该流在打开文件进行输出前,目标文件不存在,该流会自己创建目标文件
复制文件夹
public static int copyFile(String fromFilePath, String toFilePath) {
File fromFile = new File(fromFilePath);
if (!fromFile.exists()) {
return -1;
}
//获取子文件
File[] fromFiles = fromFile.listFiles();
File toFile = new File(toFilePath);
if (!toFile.exists()) {
toFile.mkdirs();
}
for (int i = 0; i < fromFiles.length; i++) {
if (fromFiles[i].isDirectory()) {
// 子文件是目录,循环
copyFile(fromFiles[i].getPath(), toFilePath + "/" + fromFiles[i].getName());
} else {
//复制文件
copyDirFile(fromFiles[i].getPath(), toFilePath + "/" + fromFiles[i].getName());
}
}
return 0;
}
public static int copyDirFile(String fromFilePath, String toFilePath) {
try {
InputStream inStream = new FileInputStream(fromFilePath);
OutputStream outStream = new FileOutputStream(toFilePath);
byte[] bytes = new byte[1024];
int i = 0;
while ((i = inStream.read(bytes)) > 0) {
outStream.write(bytes, 0, i);
}
inStream.close();
outStream.close();
return 0;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}