1,概念
1)存储模式
①Context.MODE_PRIVATE
默认操作模式,代表该文件是私有数据,只能被本应用本身访问。
写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Context.MODE_APPEND。
②Context.MODE_APPEND
该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
③Context.MODE_WORLD_READABLE和_WRITEABLE
用来控制其他应用读写该文件的权限。
Context.MODE_WORLD_WRITEABLE:表示文件可以被其他应用写入。
④Context.MODE_READABLE
表示当前文件可以被其他应用读取。
⑤举例
希望文件可以被其他应用写入:
openFileOutput("itcast.txt",Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
2)权限
<!--在SD卡中创建于删除文件权限-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--在SD卡中写入数据权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2,IO
手机存储器、SD卡内文件的读写
1)断点续传和断点下载
都是用的RandomAccessFile, 它具有移动指定的文件大小的位置的功能seek 。
断点续传是由服务器给客户端一个已经上传的位置标记position,然后客户端再将文件指针移动到相应的position,通过输入流将文件剩余部分读出来传输给服务器。
断点下载 是由客户端告诉服务器已经下载的大小,然后服务器会将指针移动到相应的position,继续读出,把文件返回给客户端。 当然为了下载的更快一下,也可以多线程下载,那么基本实现就是给每个线程分配固定的字节的文件,分别去读。
3,基本操作
1)SD卡
①判断手机是否插入了SD卡
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
②获取SD卡目录:
File sdDir = Environment.getExternalStorageDirectory();
③使用IO流读写SD卡上的文件:
deleteFile("auto.txt");//删除指定的文件
String f[] = fileList();//查看目录下的所有文件
File file = getDir("mydir",Context.MODE_PRIVATE);//创建子目录
String path = file.getCanonicalPath();//获取绝对路径
2)创建
①判断文件夹是否存在,不存在则创建
static boolean isFolderExists(String strFolder) {
File file = new File(strFolder);
if (!file.exists()) {
if (file.mkdirs()) {
return true;
} else {
return false;
}
}
return true;
}
3)删除
①删除文件夹及文件夹中的内容
public static boolean delFolder(String dir) {
// 如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dir.endsWith(File.separator))
dir = dir + File.separator;
File dirFile = new File(dir);
// 如果dir对应的文件不存在,或者不是一个目录,则退出
if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
System.out.println("删除目录失败:" + dir + "不存在!");
return false;
}
boolean flag = true;
// 删除文件夹中的所有文件包括子目录
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
// 删除子文件
if (files[i].isFile()) {
flag = deleteFile(files[i].getAbsolutePath());
if (!flag)
break;
}
// 删除子目录
else if (files[i].isDirectory()) {
flag = delFolder(files[i]
.getAbsolutePath());
if (!flag)
break;
}
}
if (!flag) {
System.out.println("删除目录失败!");
return false;
}
// 删除当前目录
if (dirFile.delete()) {
System.out.println("删除目录" + dir + "成功!");
return true;
} else {
return false;
}
}
②删除单个文件
/**
* 删除单个文件
*
* @param fileName 要删除的文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
private static boolean deleteFile(String fileName) {
File file = new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
System.out.println("删除单个文件" + fileName + "成功!");
return true;
} else {
System.out.println("删除单个文件" + fileName + "失败!");
return false;
}
} else {
System.out.println("删除单个文件失败:" + fileName + "不存在!");
return false;
}
}
3)文件打开
①通过其它软件打开文件
public void openFile(String filePath) {
File file = new File(filePath);
if (file.exists()) {
Uri path = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, FileUtil.getFileType(filePath.substring(filePath.lastIndexOf("."), filePath.length())));
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
}else{
basalView.showToastShort("文件不存在或已被删除");
}
}
②根据后缀名查看intent类型
/**
* @param suffix 后缀 如: txt
* @return
*/
public static String getFileType(String suffix) {
switch (suffix) {
// case "evy":
// return "application/envoy";
// case "fif":
// return "application/fractals";
// case "spl":
// return "application/futuresplash";
// case "hta":
// return "application/hta";
// case "acx":
// return "application/internet-property-stream";
// case "hqx":
// return "application/mac-binhex40";
case "doc":
case "dot":
return "application/msword";
// case "*":
// case "bin":
// case "class":
// case "dms":
// case "exe":
// case "lha":
// case "lzh":
// return "application/octet-stream";
// case "oda":
// return "application/oda";
// case "axs":
// return "application/olescript";
case "pdf":
return "application/pdf";
// case "prf":
// return "application/pics-rules";
// case "p10":
// return "application/pkcs10";
// case "crl":
// return "application/pkix-crl";
// case "ai":
// case "eps":
// case "ps":
// return "application/postscript";
// case "rtf":
// return "application/rtf";
// case "setpay":
// return "application/set-payment-initiation";
// case "setreg":
// return "application/set-registration-initiation";
case "xla":
case "xlc":
case "xlm":
case "xls":
case "xlt":
case "xlw":
return "application/vnd.ms-excel";
// case "msg":
// return "application/vnd.ms-outlook";
// case "sst":
// return "application/vnd.ms-pkicertstore";
// case "cat":
// return "application/vnd.ms-pkiseccat";
// case "stl":
// return "application/vnd.ms-pkistl";
// case "pot":
// case "pps":
// case "ppt":
// return "application/vnd.ms-powerpoint";
case "mpp":
return "application/vnd.ms-project";
// case "wcm":
// case "wdb":
// case "wks":
// case "wps":
// return "application/vnd.ms-works";
// case "hlp":
// return "application/winhlp";
// case "bcpio":
// return "application/x-bcpio";
// case "cdf":
// return "application/x-cdf";
// case "z":
// return "application/x-compress";
// case "tgz":
// return "application/x-compressed";
// case "cpio":
// return "application/x-cpio";
// case "csh":
// return "application/x-csh";
// case "dcr":
// case "dir":
// case "dxr":
// return "application/x-director";
// case "dvi":
// return "application/x-dvi";
// case "gtar":
// return "application/x-gtar";
// case "gz":
// return "application/x-gzip";
// case "hdf":
// return "application/x-hdf";
// case "ins":
// case "isp":
// return "application/x-internet-signup";
// case "iii":
// return "application/x-iphone";
// case "js":
// return "application/x-javascript";
// case "latex":
// return "application/x-latex";
// case "mdb":
// return "application/x-msaccess";
// case "crd":
// return "application/x-mscardfile";
// case "clp":
// return "application/x-msclip";
// case "dll":
// return "application/x-msdownload";
// case "m13":
// case "m14":
// case "mvb":
// return "application/x-msmediaview";
// case "wmf":
// return "application/x-msmetafile";
// case "mny":
// return "application/x-msmoney";
// case "pub":
// return "application/x-mspublisher";
// case "scd":
// return "application/x-msschedule";
// case "trm":
// return "application/x-msterminal";
// case "wri":
// return "application/x-mswrite";
// case "nc":
// return "application/x-netcdf";
// case "pma":
// case "pmc":
// case "pml":
// case "pmr":
// case "pmw":
// return "application/x-perfmon";
// case "p12":
// case "pfx":
// return "application/x-pkcs12";
// case "p7b":
// case "spc":
// return "application/x-pkcs7-certificates";
// case "p7r":
// return "application/x-pkcs7-certreqresp";
// case "p7c":
// case "p7m":
// return "application/x-pkcs7-mime";
// case "p7s":
// return "application/x-pkcs7-signature";
// case "sh":
// return "application/x-sh";
// case "shar":
// return "application/x-shar";
// case "swf":
// return "application/x-shockwave-flash";
// case "sit":
// return "application/x-stuffit";
// case "sv4cpio":
// return "application/x-sv4cpio";
// case "sv4crc":
// return "application/x-sv4crc";
// case "tar":
// return "application/x-tar";
// case "tcl":
// return "application/x-tcl";
// case "tex":
// return "application/x-tex";
// case "texi":
// return "application/x-texinfo";
// case "texinfo":
// return "application/x-texinfo";
// case "roff":
// case "t":
// case "tr":
// return "application/x-troff";
// case "man":
// return "application/x-troff-man";
// case "me":
// return "application/x-troff-me";
// case "ms":
// return "application/x-troff-ms";
// case "ustar":
// return "application/x-ustar";
// case "src":
// return "application/x-wais-source";
// case "cer":
// case "crt":
// case "der":
// return "application/x-x509-ca-cert";
// case "pko":
// return "application/ynd.ms-pkipko";
// case "zip":
// return "application/zip";
// case "au":
// case "snd":
// return "audio/basic";
// case "mid":
// case "rmi":
// return "audio/mid";
// case "mp3":
// return "audio/mpeg";
// case "aif":
// case "aifc":
// case "aiff":
// return "audio/x-aiff";
// case "m3u":
// return "audio/x-mpegurl";
// case "ra":
// case "ram":
// return "audio/x-pn-realaudio";
// case "wav":
// return "audio/x-wav";
// case "bmp":
// return "image/bmp";
// case "cod":
// return "image/cis-cod";
// case "gif":
// return "image/gif";
// case "ief":
// return "image/ief";
case "jpe":
case "jpeg":
case "jpg":
return "image/jpeg";
// case "jfif":
// return "image/pipeg";
// case "svg":
// return "image/svg+xml";
// case "tif":
// case "tiff":
// return "image/tiff";
// case "ras":
// return "image/x-cmu-raster";
// case "cmx":
// return "image/x-cmx";
// case "ico":
// return "image/x-icon";
// case "pnm":
// return "image/x-portable-anymap";
// case "pbm":
// return "image/x-portable-bitmap";
// case "pgm":
// return "image/x-portable-graymap";
// case "ppm":
// return "image/x-portable-pixmap";
// case "rgb":
// return "image/x-rgb";
// case "xpm":
// case "xbm":
// return "image/x-xbitmap";
// case "xwd":
// return "image/x-xwindowdump";
// case "mht":
// case "mhtml":
// case "nws":
// return "message/rfc822";
// case "css":
// return "text/css";
// case "323":
// return "text/h323";
// case "htm":
// case "html":
// case "stm":
// return "text/html";
// case "uls":
// return "text/iuls";
// case "bas":
// case "c":
// case "h":
case "txt":
return "text/plain";
// case "rtx":
// return "text/richtext";
// case "sct":
// return "text/scriptlet";
// case "tsv":
// return "text/tab-separated-values";
// case "htt":
// return "text/webviewhtml";
// case "htc":
// return "text/x-component";
// case "etx":
// return "text/x-setext";
// case "vcf":
// return "text/x-vcard";
// case "mp2":
// case "mpa":
// case "mpe":
// case "mpeg":
// case "mpg":
// case "mpv2":
// return "video/mpeg";
// case "mov":
// return "video/quicktime";
// case "qt":
// return "video/quicktime";
// case "lsf":
// return "video/x-la-asf";
// case "lsx":
// case "asf":
// case "asr":
// case "asx":
// return "video/x-la-asf";
// case "avi":
// return "video/x-msvideo";
// case "movie":
// return "video/x-sgi-movie";
// case "flr":
// case "vrml":
// case "wrl":
// case "wrz":
// case "xaf":
// case "xof":
// return "x-world/x-vrml";
}
return "text/plain";
}
4)获取文件大小
file.length() //单位为KB
/**
* 格式化单位
*
* @param size
*/
public String getFormatSize(double size) {
double kiloByte = size / 1024;
double megaByte = kiloByte / 1024;
if (megaByte < 1) {
BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
return result1.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "KB";
}
double gigaByte = megaByte / 1024;
if (gigaByte < 1) {
BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
return result2.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "MB";
}
double teraBytes = gigaByte / 1024;
if (teraBytes < 1) {
BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
return result3.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "GB";
}
BigDecimal result4 = new BigDecimal(teraBytes);
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
+ "TB";
}
5)zip的压缩和解压
用过java做压缩或解压的都知道,jdk提供的zip只能按UTF-8格式处理,所有jdk提供的zip不能支持中文文件名,可以采用Apache的zip包解决中文文件名问题。
下载地址:apache-ant-zip.jar
package cn.tzz.zip;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
* ZIP工具包(支持中文)
* 依赖:ant-1.9.6.jar
*/
public class CHZipUtils {
/**使用GBK编码可以避免压缩中文文件名乱码*/
private static final String CHINESE_CHARSET = "GBK";
/**文件读取缓冲区大小*/
private static final int CACHE_SIZE = 1024;
/**
* 压缩文件
* @param sourceFolder 压缩文件夹
* @param zipFilePath 压缩文件输出路径
*/
public static void zip(String sourceFolder, String zipFilePath) {
OutputStream os = null;
BufferedOutputStream bos = null;
ZipOutputStream zos = null;
try {
os = new FileOutputStream(zipFilePath);
bos = new BufferedOutputStream(os);
zos = new ZipOutputStream(bos);
// 解决中文文件名乱码
zos.setEncoding(CHINESE_CHARSET);
File file = new File(sourceFolder);
String basePath = null;
if (file.isDirectory()) {//压缩文件夹
basePath = file.getPath();
} else {
basePath = file.getParent();
}
zipFile(file, basePath, zos);
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
if (zos != null) {
zos.closeEntry();
zos.close();
}
if (bos != null) {
bos.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 递归压缩文件
* @param parentFile
* @param basePath
* @param zos
* @throws Exception
*/
private static void zipFile(File parentFile, String basePath, ZipOutputStream zos) throws Exception {
File[] files = new File[0];
if (parentFile.isDirectory()) {
files = parentFile.listFiles();
} else {
files = new File[1];
files[0] = parentFile;
}
String pathName;
InputStream is;
BufferedInputStream bis;
byte[] cache = new byte[CACHE_SIZE];
for (File file : files) {
if (file.isDirectory()) {
pathName = file.getPath().substring(basePath.length() + 1) + File.separator;
zos.putNextEntry(new ZipEntry(pathName));
zipFile(file, basePath, zos);
} else {
pathName = file.getPath().substring(basePath.length() + 1);
is = new FileInputStream(file);
bis = new BufferedInputStream(is);
zos.putNextEntry(new ZipEntry(pathName));
int nRead = 0;
while ((nRead = bis.read(cache, 0, CACHE_SIZE)) != -1) {
zos.write(cache, 0, nRead);
}
bis.close();
is.close();
}
}
}
/**
* 解压压缩包
* @param zipFilePath 压缩文件路径
* @param destDir 解压目录
*/
public static void unZip(String zipFilePath, String destDir) {
ZipFile zipFile = null;
try {
BufferedInputStream bis = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
zipFile = new ZipFile(zipFilePath, CHINESE_CHARSET);
Enumeration<ZipEntry> zipEntries = zipFile.getEntries();
File file, parentFile;
ZipEntry entry;
byte[] cache = new byte[CACHE_SIZE];
while (zipEntries.hasMoreElements()) {
entry = (ZipEntry) zipEntries.nextElement();
if (entry.isDirectory()) {
new File(destDir + entry.getName()).mkdirs();
continue;
}
bis = new BufferedInputStream(zipFile.getInputStream(entry));
file = new File(destDir + entry.getName());
parentFile = file.getParentFile();
if (parentFile != null && (!parentFile.exists())) {
parentFile.mkdirs();
}
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos, CACHE_SIZE);
int readIndex = 0;
while ((readIndex = bis.read(cache, 0, CACHE_SIZE)) != -1) {
fos.write(cache, 0, readIndex);
}
bos.flush();
bos.close();
fos.close();
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
// String sourceFolder = "D:/test/1.txt";
// String sourceFolder = "D:/test/中文名.txt";
String sourceFolder = "D:/test/cms";
String zipFilePath = "D:/test/zip/压缩文件.zip";
String destDir = "D:/test/zip/";
CHZipUtils.zip(sourceFolder, zipFilePath);
// CHZipUtils.unZip(zipFilePath, destDir);
System.out.println("********执行成功**********");
}
}
4,demo
1)递归遍历文件目录结构,打印所有的目录名和文件名
public class FileDemo {
public static void getFileListame(String strPath) {
File dir = new File(strPath);
File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
if (files != null) {
for (int i = 0; i < files.length; i++) {
System.out.println(files[i].getName());
if (files[i].isDirectory()) { // 判断是文件还是文件夹
getFileListame(files[i].getAbsolutePath()); // 获取文件绝对路径
System.out.println(files[i].getAbsolutePath() + files[i].getName());
}
}
}
}
}