标签:
表示一个磁盘文件。可以是文件,也可以是文件夹。这个路径,可以存在,也可以不存在
方式一:File f = new File("d:\\1.txt") 等价于 File f = new File("d:/1.txt")
方式二:File f = new File("d:\\","1.txt")
一、属性相关:
getName() 得到文件名
getAbsolutePath() 得到完整路径
canRead() / canWrite() / canExecute() 是否可读可写可执行
isHidden() / exists() 是否隐藏,是否存在
isDirectory() / isFile() 是否是目录,是否是文件
lastModified() 最后修改时间
length()文件字节量,对目录无效
getTotalSpace() 所在磁盘空间总大小
getFreeSpace()所在磁盘可用空间
getParent() 得到父目录
二、操作相关(增、删、改)
createNewFile() 创建文件
mkdir() 创建单层目录,如:d:/abc
mkdirs() 创建多层目录,如:d:/abc/def/g
delete() 删除文件或"空目录",目录里有东西不能删除
renameTo() 改名
File.createTempFile()在系统临时目录创建临时文件
注意:所有操作相关函数返回boolean,表示操作是否成功
三、查询相关
list() 返回String[],包含子文件、子目录名称
listFiles() 返回File[],包含子文件、子目录的File对象
list(FilenameFileter) 通过接口过滤名字返回String[]
listFiles(FilenameFilter)
listFiles(FileFilter)
练习:
1.求目录大小(直接调用目录File的length是得不到的,需要一层层进入目录,累加)
private static void test1() { File dir = new File("d:/BaiduYunDownload"); long len = fileLength(dir); System.out.println(dir.getName()+"目录大小:"+len/1024D/1024/1024+"G"); } private static long fileLength(File dir) { if(dir == null) return 0; if(dir.isFile()) return dir.length(); File[] files = dir.listFiles(); long sum = 0; for(File file : files){ sum += fileLength(file); } return sum; }
2.在sdcard上搜索文件。(如音乐和图片)
以下两个都可以:
/sdcard/.. 下面真实路径的一个别名
/mnt/sdcard/.. sd卡的真实路径
protected void doMusic() { List<String> list = search("^.+\\.(mp3|wmv|ape|flac)$"); showList(list); } private List<String> search(String regex) { File file = new File("/sdcard"); return search(file,regex); } private List<String> search(File dir, final String regex) { List<String> list = new ArrayList<String>(); File[] arr = dir.listFiles(new FileFilter() { public boolean accept(File f) { //目录也要 if(f.isDirectory()) return true; //列出名字匹配的文件 return f.getName().toLowerCase().matches(regex); } }); //无法列出文件,直接返回空集合 if(arr == null) return list; for (File f : arr) { if(f.isFile()){ list.add(f.getAbsolutePath()); }else{ List<String> list2 = search(f,regex); //从子目录递归找到文件 list.addAll(list2); } } return list; } protected void doImage() { List<String> list = search("^.+\\.(jpg|png|gif)$"); showList(list); } private void showList(List<String> list) { ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1, list ); lv.setAdapter(adapter); }
读写文件,将文件看做是一个字节数组,按下标读写文件中的字节
用处:
1)读写文件中一段数据
2)直接在文件数据中修改
RandomAccessFile raf = new RandomAccessFile(文件,"r"); //只读
RandomAccessFile raf = new RandomAccessFile(文件,"rw"); //读写
write(int b) 将int 4个字节中,末尾最后一字节输出到文件,实际上是写了一个byte(8位)数据
write(byte[] arr) 输出数据中所有字节
write(byte[] arr,int offset,int n) 输出数据中,从offset开始的n个字节
writeInt(int i) 输出int的4字节
writeDouble(double d) 输出double的8字节
writeUTF(String s)输出两个字节,表示字符串的字节数量,再输出字符串的所有字节数量,使用utf-8编码,字符1位,汉子3位
read() 从文件读取一个字节,转为int类型,如果没有数据,返回-1,通常用这个来判断文件是否结束
read(byte[] buff)读取数组长度个字节,返回读取的数量,没有数据,返回-1
readInt() 读取4个字节的int
readDouble() 读取8个字节的double
readUTF()先读两个字节,确定字符串数量,再根据数量读取字符串
seek(int index) 将文件指针移动到指定下标位置
getFilePointer() 获得指针当前所在下标位置
setLength(字节量) 为文件分配空间,将文件扩充或裁剪为指定大小
练习:实现文件的加密解密
public static void main(String[] args) throws Exception { encript1("c:/1.txt",123); System.out.println("成功"); } //加密解密都这方法 private static void encript1( String path, int key) throws IOException { RandomAccessFile raf = new RandomAccessFile(path, "rw"); // 1 ^ 1 = 1 // 1 ^ 0 = 0 // 0 ^ 1 = 0 // 0 ^ 0 = 1 byte[] buf = new byte[8192];//1k 2k 4k 8k, 1024, 2048, 4096, 8192 int n;//每次放入 buf 数组的字节数量 while((n = raf.read(buf)) != -1) { //对前 n 个值加密 for (int i = 0; i < n; i++) { buf[i] ^= key; } raf.seek(raf.getFilePointer()-n); //将 buf 数组从 0 位置开始的 n 个写到文件 raf.write(buf,0,n); } raf.close(); }
此类为输入输出流的抽象方法
write(int b) 将int 4个字节中末尾字节输出到文件
write(byte[] arr)将数组中所有字节输出到文件
write(byte[] arr,int offset,int n)输出数组中offset开始的n个字节
flush() 输出,输出缓存数据
read() 从文件读取一个字节,前面补0转为int,返回读取的字节量,没有数据,返回-1
read(byte[] buff)一次读数组长度字节数据,返回读取的字节数量,没有数据,返回-1
available() 获得剩余可读取的字节数量。
1.FileOutputStream out = new FileOutputStream("d:/abc");
不管文件是否存在,都会创建一个新的空文件
2.FileOutputStream out = new FileOutputStream("d:/abc",true);
不存在->新建。 存在->追加
练习:实现文件的复制
private void copy( String from, String to) throws Exception { FileInputStream in = new FileInputStream(from); FileOutputStream out = new FileOutputStream(to); //改成批量读写 //批量读取,每次读到的一批数据,批量输出 byte[] buf = new byte[8192]; int n; while((n = in.read(buf)) != -1) { out.write(buf, 0, n); } in.close(); out.close(); }
与其它流相接,操作其它流来读写数据
*) 对单字节读写提高效率
BufferedInputStream in = new BufferedInputStream(与它相接的流)
读写固定格式的字节数据。
DataInputStream in = new DataInputStream(与其它相接的流);
将任何数据,转为字符串输出,只有输出流,没有输入流
out.print(97) => 输出"97"
out.print(new Point(3,2)) =>输出"tarena.day2104.Point@8af723"
标签:
原文地址:http://www.cnblogs.com/bobo110/p/5409407.html