1、相对路径和绝对路径:
绝对路径就是把路径全都写出来,虽然明确但不灵活。比如
C://aaa//text.txt
相对路径灵活但不明确,用点表示当前目录,所以可以写成:
./text.txt
注意,这种形式相当于绝对路径,因为这个点就相当于C://aaa
或
text.txt
其中默认是当前文件夹
2、用File对象表示一个文件夹或文件
File mFile=new File(路径字符串);
File mFile=new File(".");//表示当前目录
String fileName=mFile.getName();//获取文件名
long fileLength=mFile.length();//文件所占字节b大小
boolean cw=mFile.canWrite();//可写
boolean cr=mFile.canRead();//可读
boolean h=mFile.isHadden();//隐藏
mFile.exists();//文件是否已存在
if(!exists()){
//mFile.delete();//删除文件
mFile.createNewFile();//创建文件
System.out.println("成功创建新文件!");
}else{
System.out.println("文件已存在!");
}
mFile.isFile();//是否文件
mFile.isDirection();//是否文件夹
//注:文件是没有子项的,文件夹才有。
if(isDirection()){
File[] subs=mFile.listFiles();//获取文件夹的子项的File表示(文件夹、文件)
}
//删除文件夹思路:先删除文件,再删除文件夹。
//注意:文件夹只有它的所有子项个数=0才能被删除。即文件夹是空的才能被删除。delete无效。
public static void deleteFile(File f){
/*思路:如果是文件夹,就获取它的全部子项,然后循环进入遍历递归……
如果还是文件夹,记住一点:每次执行deleteFile都必然执行一次f.delete()
也就是说,其实实际上循环很多次,凡是遇到可以f.delete()的都会删除空文件夹或文件
这样下来,就实现了删除最终的文件夹或文件,所以你会看到,其实使用递归就是一种无脑的
遍历,所以循环遍历次数会很多,所以一般性能可能会不太好,但是不用不行。*/
if(f.isDirection()){
File[] subs=f.listFiles();
for(int i=0;i<subs.length;i++){
deleteFile(subs[i]);//递归删除
}
}
f.delete();
}
//listFile(FileFilter ff)————文件过滤器接口,可以更精确的拿到我们的子项
//这里使用匿名内部类:
File[] subs=mFile.listFiles(new FileFilter(){
public boolean accept(File f){
return f.getName().startsWith("a");//选择以a开头的文件名。
}
});
//使用lambda表达式替代上面匿名内部类式子:JDK8版本以上可使用
File[] subs=mFile.listFiles((f)->{
return f.getName().startsWith("a");//选择以a开头的文件名。
}
});
3、RandomAccessFile读写文件:
这个类是基于指针对文件数据进行读写的,类似于C语言,所以可以很灵活。
//说明:只有写权限的时候,没有文件的时候才创建新文件,这和C语言是一样的。
RandomAccessFile raf=new RandomAccessFile(
"",//第一个参数:文件路径字符串或者File对象
"" //第二个参数:指定文件的权限:r表示只读,rw表示读写
);
/*void write(int a):其实只写一个字节(低8位)int:4字节32位,也就是一个字符
vvvvvvvv
0符号位 0000000 00000000 00000000 00000010//只写这后8位
8位的范围:0-255
解释一下负数的二进制:
符号位1+数值位。这里的数值位越大,表示越接近0.最接近0的整数是-1吧,所以-1:
1 1111111 11111111 11111111 11111111,这里用到了补码的知识,你只要记住,
负数的补码就是非常反常。
*/
raf.write(2);//每次只写一个字节,再调用一次即可再写一个字节。相当于只写一个C语言字符
int b=raf.read();//其实也是只读低8位。返回-1表示文件末尾。
raf.close();//别忘了关闭,释放各种资源。
//使用上面介绍的读写字节操作,可以实现赋值图片视频等操作:
//但是这样的随机读写会增加读写硬盘的次数,可能会比较慢
int a=-1;
while((a=raf1.read())!=-1){//从文件1中读
raf2.write(a);//往文件2中写
}
raf1.close();
raf2.close();
//使用上面介绍的读写字节操作,可以实现赋值图片视频等操作:
//块读写:多字节读写:void write(byte[] data/*,start,length*/)
//int read(byte[] data)//文件末尾还是返回-1,否则返回byte数组长度,即字节量
int length=-1;
byte[] data=new byte[1024*10];//10kb
while((length=raf1.read())!=-1){//从文件1中读
raf2.write(data,0,length);//往文件2中写,读多少,写多少,保证读写对齐
}
raf1.close();
raf2.close();
//读写字符串:原理还是转换为字节读写:
String mStr="世界,你好!";
byte[] data = mStr.getBytes("UTF-8");//字符集,也可以用GBK
raf.write(data);
//读:
byte[] data2=new byte[(int) raf.length()];
raf.read(data);//从文件中读取相应长度的字节
String mStr2=new String(data,"UTF-8");//读到内存中
raf.close();
//使用移位读写int数据类型:
raf.write(data>>>24);//将高8为移动到第八位。
raf.write(data>>>16);
raf.write(data>>>8);
raf.write(data);
//系统已经为你封装的方法:同理,还有其他数据类型。还有read
raf.writeInt(data);//连写四个字节
//移动文件指针:
raf.seek(long pos);//移动到pos的位置,一个字节表示一个位置,第一个位置是0,和数组下标一样。
//获取文件指针位置:
long getFilePoiter();