1、File类的构造方法
(1)File类的作用
用File类的对象来表示一个文件或目录
(2)File(String path)
通过指定文件或目录的路经来创建一个File对象
path:可以是相对路径,也可以是绝对路径
如:File noteFile = new File("note.txt");
System.out.println( file.exists() );
解释:
在java中的相对路径:参照物是启动JVM时所在的路径
通过Eclipse来运行Java程序时,相对路径的参照物为:工程目录
会把当前工程目录作为参照物,即note.txt在当前工程目录下就会输出true
(3)File(URI uri)
uri:统一资源定位标识
获得URI:任意类名.class.getResource("/抽象路径").toURI()
到classpath环境变量下搜索指定的子路径,得到URL对象通过toURI方法转换成URI对象
注意:
需要以"/"开头,"/"表示classpath路径
作用:
可定制搜索查找的路径,即添加classpath路径,而不用修改程序
例如:
File uri_File =new File( PathDemo.class.getResource("/res/uri-demo.txt").toURI() );
System.out.println( uri_File.exists() );
解释:第一个/代表的是classpath路径
在eclipse中的classpath路径是工程文件下的src或者bin目录,res代表包名,所以能去找文件
2、File类的常用方法
(1)File类操作文件
createNewFile:当文件对象所表示的文件不存在时,才能成功创建一个新的文件,否则没有任何效果
delete:立即删除
deleteOnExit:在程序正常退出时删除
exists 是否存在
isFile 判断是否是文件 如果文件对象在磁盘上本来就不存在时,返回false
length 获取文件大小
getName 获取文件
getAbsolutePath 获取绝对路径
(2)File类操作目录
mkdir:只能创建一层目录, 若存在多层则创建失败
mkdirs:单个或多层目录都可以创建
delete:删除空目录
判断目录是否存在:exists
判断是否是目录:isDirectory 当目录不存在时,返回false
获取目录内容列表:
list()
String[] f = file.list();//返回目录下所有的文件名和目录名
listFiles()
File[] f = file.listFiles();//返回目录下所有的文件和目录
listFiles( FileFilter filter )
File[] f = file.listFiles( new FileFilter(){ //文件过滤器,筛选出符合自己要求的文件和目录 public boolean accept(File f){ String fileName = f.getName(); if(fileName.toLowerCase().startsWith("a")){ return true; } return false; } } );
(3)举例:如何删除一个非空目录下的所有目录和文件
package file;
import java.io.File;
public class FileOprater {
/**
* 如何删除一个非空目录下的所有目录和文件
*/
public static void removeFile(File file) {
/**
* file为空或者file不是目录,都不符合题意
*/
if(file == null || !(file.isDirectory())) {
throw new RuntimeException(file+"不是一个有效的目录");
}
File[] files = file.listFiles();
for(File f : files) {
if(f.isFile()) {//f是文件就直接删除
f.delete();
}else {
removeFile(f);
}
}
file.delete();//删除递归回来的空目录
}
public static void main(String[] args) {
File file = new File("src/a");
removeFile(file);
}
}
3、RandomAccessFile类:提供了随机读写文件内容的功能(读取文件中任意位置的内容)
(1)构造方法
RandomAccessFile(File file, String mode)
RandomAccessFile(String name, String mode)
name:要访问的文件路径
mode:开始什么模式 "r" / "w" / "rw"
(2)文件指针
当前新建该对象后, 该对象的文件指针默认在第一个字节处;
文件指针的作用: 用来标记下一次读写发生的位置
seek:移动文件指针到文件头,并往后跳指定个数的字节数
skipBytes:从当前文件指针出往后跳指定个数的字节
readXxx
writeXxx
(3)举例:对视频加密
package file;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class CodeMP4 {
public static void main(String[] args){
try {
//加密视频文件
File file = new File("C:\\Users\\sun changxin\\Desktop\\abc.mp4");
RandomAccessFile raf = new RandomAccessFile(file, "rw");
//获得文件的字节数
long len = raf.length();
//设置变量记录文件指针的位置
long filePointerPOS = 0;
//一次读8k字节
byte[] datas = new byte[8*1024];
do {
//先判断文件是否大于8k,若大于则读8k数据到datas中,若不足8k则改变datas数组
if( len - filePointerPOS < datas.length ) {
datas = new byte[ (int)(len - filePointerPOS) ];
}
//从文件读取数据,读满datas数组,放到数组datas中
raf.readFully(datas);
filePointerPOS = raf.getFilePointer();
//修改datas数组中的每一个数
for( int i=0;i<datas.length;i++ ) {
datas[i] -= 1;//加密
}
//将修改后的datas数组覆盖文件中的那段数据
raf.seek(filePointerPOS - datas.length);
raf.write(datas);
}while( raf.getFilePointer() < len );
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}