1. java.io.File File的每一个实例可以表示文件系统中的一个文件或目录。使用File可以:
1.访问文件或目录的属性,如大小、名字、修改时间等
2.操作文件或目录。如创建、删除文件和目录
3.访问目录中的所有内容
但是不可以:访问文件数据
public static void main(String[] args) {
File file=new File("."+File.separator+"demo.txt");//点表示根目录
//获取名字
String name=file.getName();
System.out.println("name:"+name);
//大小
long length=file.length();
System.out.println("大小:"+length+"字节");
//是否为文件
boolean isFile=file.isFile();
System.out.println("是文件:"+isFile);
//是否为目录
boolean isDir=file.isDirectory();
System.out.println("是目录:"+isDir);
//是否为隐藏文件
boolean isHidden=file.isHidden();
System.out.println("是否隐藏:"+isHidden);
//最后修改时间
long time=file.lastModified();
Date date=new Date(time);
SimpleDateFormat sdf=new SimpleDateFormat("yyy年M月d日 HH:mm:ss");
System.out.println(sdf.format(date));
boolean canWrite=file.canWrite();//可写
System.out.println("可写:"+canWrite);
file.canRead();//可读
file.canExecute();//可运行
}
2. 创建一个文件
public static void main(String[] args) throws IOException {
/*
* 在当前目录下创建文件test.txt
* 默认路径就是当前目录,即“./”,所以可以不写
*/
File file=new File("./test.txt");
/*
* boolean exists()
* 判断该文件是否真实存在
*/
if(!file.exists()){
file.createNewFile();
System.out.println("创建完毕!");
}else{
System.out.println("该文件已存在");
}
}
3. 删除一个文件
public static void main(String[] args) {
/*
* 删除当前目录下的test.txt文件
*/
File file=new File("test.txt");
if(file.exists()){
file.delete();
System.out.println("删除完毕!");
}else{
System.out.println("文件不存在");
}
}
4. 创建一个新目录
public static void main(String[] args) {
/*
* 在当前目录下创建一个名为demo的目录
*/
File dir=new File("demo");
if(!dir.exists()){
dir.mkdir();
System.out.println("创建目录完毕");
}else{
System.out.println("目录已经存在");
}
}
5. 创建一个多级目录
public static void main(String[] args) {
/*
* 在当前目录下创建 ./a/b/c/d/e/f
*/
File dir=new File("a"+File.separator+"b"+File.separator+"c"+File.separator+"d"+File.separator+"e"+File.separator+"f");
if(!dir.exists()){
/*
* 在创建当前目录的同时将所有不存在的父目录一起创建出来
*/
dir.mkdirs();
System.out.println("创建完毕");
}else{
System.out.println("目录已存在");
}
}
6. 删除目录, delete方法可以删除一个目录,但是前提是该目录必须是一个空目录
public static void main(String[] args) {
File dir=new File("demo");
if(dir.exists()){
dir.delete();
System.out.println("删除完毕");
}
}
7. 获取一个目录中的所有子项
public static void main(String[] args) {
/*
* 获取当前目录的所有子项
*/
File dir=new File(".");
/*
* boolean isFile() 判断是否为一个文件
* boolean isDirectory() 判断是否为一个目录
*/
if(dir.isDirectory()){
/*
* File[] listFiles()
* 获取所有子项
*/
File[] subs=dir.listFiles();
for(File sub:subs){
if(sub.isFile()){
System.out.print("文件:");
}else{
System.out.print("目录:");
}
System.out.println(sub.getName());
}
}
}
8. 获取一个目录中符合条件的部分子项 使用重载的listFiles方法,需要传入一个额外的文件过滤器 ,文件过滤器是一个接口:FileFilter
public static void main(String[] args) {
File dir=new File(".");//获取当前目录
/*
* 获取名字以“.”开头的子项
*/
File[] subs=dir.listFiles(new FileFilter(){
public boolean accept(File file) {
return file.getName().startsWith(".");
}
});
for(File sub:subs){
System.out.println(sub.getName());
}
}
9. 复制文件
public static void main(String[] args) throws IOException {
/*
* 创建一个RAF读取原文件,再创建一个RAF向目标文件中写出。
* 顺序从原文件中读取每一个字节并写入到目标文件即可
*/
RandomAccessFile src=new RandomAccessFile("aaa.txt", "r");
RandomAccessFile desc=new RandomAccessFile("aaa_cp.txt", "rw");
//用来保存读取的每一个字节
int d=-1;
long start=System.currentTimeMillis();
while((d=src.read())!=-1){
desc.write(d);
}
long end=System.currentTimeMillis();
System.out.println("复制完毕,耗时:"+(end-start)+"ms");
src.close();
desc.close();
}
10. 若想提高读写效率,可以通过提高每次读写的数据量来减少读写次数达到
public static void main(String[] args) throws IOException {
RandomAccessFile src=new RandomAccessFile("aaa.txt", "r");
RandomAccessFile desc=new RandomAccessFile("aaa_cp.txt", "rw");
/*
* int read(byte[] data)
* 一次性尝试读取给定的字节数组总长度的字节量并存入到该数组中,返回值为实际读取到的字节量,
* 若返回值为-1,则表示本次没有读取到任何数据(文件末尾)
*/
//10k
byte[] buf=new byte[1024*10];
int len=-1;
long start=System.currentTimeMillis();
while((len=src.read(buf))!=-1){
/*
* void write(byte[] data)
* 一次性将给定的字节数组中所有字节写出
*
* void write(byte[] d,int start,int end)
* 将给定数组中从下标start处开始的len个字节一次性写出
*/
desc.write(buf,0,len);
}
long end=System.currentTimeMillis();
System.out.println("复制完毕,耗时:"+(end-start)+"ms");
src.close();
desc.close();
}
11. java.io.RandomAccessFile用来读写文件数据RAF是基于指针进行读写的,即RAF总是在指针指向的位置读写字节,并且读写后指针会自动向后移动。RAF即可以读取文件数据也可以向文件中写入数据
public static void main(String[] args) throws IOException{
/*
* RandomAccessFile(String path,String mode)
* RandomAccessFile(File file,String mode)
* 第二个参数为模式:常用的有r:只读模式 rw:读写模式
*/
RandomAccessFile raf=new RandomAccessFile("raf.dat", "rw");
/*
* void write(int d)
* 写出给定的int值对应的2进制的低八位
* vvvvvvvv
* 00000000 00000000 00000000 01101001
*/
raf.write(1);
System.out.println("写出完毕");
raf.close();
}
12. 读取文件数据
public static void main(String[] args) throws IOException {
RandomAccessFile raf=new RandomAccessFile("raf.dat", "r");
/*
* int read()
* 读取一个字节,并以10进制的int型返回
* 若返回值为-1,则表示读取到了文件末尾
*
* 00000000 00000000 00000000 00000001
*/
int d=raf.read();
System.out.println(d);
raf.close();
}
13. RAF提供了方便读写基本类型数据的方法
public static void main(String[] args) throws IOException {
RandomAccessFile raf=new RandomAccessFile("raf1.dat", "rw");
/*
* long raf.getFilePointer()
* 获取当前RAF的指针位置
*/
System.out.println("pos:"+raf.getFilePointer());//pos:0
/*
* 向文件中写入一个int最大值
* 01111111 11111111 11111111 11111111
*
*/
int max=Integer.MAX_VALUE;
// raf.write(max);//只能写二进制的低八位,可以写成下面四句
raf.write(max>>>24);
raf.write(max>>>16);
raf.write(max>>>8);
raf.write(max);
System.out.println("pos:"+raf.getFilePointer());//pos:4
raf.writeInt(max);//这句话顶上面四句
System.out.println("pos:"+raf.getFilePointer());//pos:8
raf.writeLong(1234L);
System.out.println("pos:"+raf.getFilePointer());//pos:16
raf.writeDouble(123.123);
System.out.println("pos:"+raf.getFilePointer());//pos:24
/*
* void seek(long pos)
* 移动指针到指定位置
*/
raf.seek(0);
System.out.println("pos:"+raf.getFilePointer());//pos:0
int i=raf.readInt();
System.out.println(i);//2147483647
raf.seek(8);
long l=raf.readLong();
System.out.println(l);//1234
System.out.println("pos:"+raf.getFilePointer());//pos:16
double d=raf.readDouble();
System.out.println(d);//123.123
System.out.println("pos:"+raf.getFilePointer());//pos:24
raf.seek(0);
l=raf.readLong();//把两个int当成一个long输出,解码错误
System.out.println(l);//9223372034707292159
raf.close();
}
14. 实现方法,来删除给定的文件或目录
public static void main(String[] args) {
File dir=new File("a");
delete(dir);
}
public static void delete(File file){
if(file.isDirectory()){
//将其所有子项删除
File[] subs=file.listFiles();
for(File sub:subs){
delete(sub);//递归:方法内部调用自己的方法
}
}
file.delete();
}