【Java】JDK——javaAPI【File类、RandomAccessFile类】

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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值