一、访问文件/目录属性
java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录。
File类只用于表示文件(目录)的信息(名称、大小等),不能对文件的内容进行访问。构造方法:File(String pathname)
,通过将给定路径名字符串转换成抽象路径名来创建一个新File实例。注意,抽象路径应尽量使用相对路径,并且目录的层级分隔符不要直接写“/”或“\”,应使用File.separator这个常量表示,以避免不同系统带来的差异。
package day05;
import java.io.File;
import java.util.Date;
import java.text.SimpleDateFormat;
/**
* java.io.File
* File的每一个实例可以表示文件系统中的一个文件或目录。
* 使用File可以:
* 1、访问文件或目录的属性(如:大小,名字,修改时间等);
* 2、操作文件或目录(创建,删除文件和目录);
* 3、访问目录中的所有内容。
* 但是不可以访问文件数据。
* @author xxx
*
*/
public class FileDemo1 {
public static void main(String[] args) {
File file = new File("."+File.separator+"demo.txt");
System.out.println(file);
//获取名字
String name = file.getName();
System.out.println("name:"+name);
//大小(占用的字节量)
long length = file.length();
System.out.println("大小:"+length+"字节");
//是否为目录
boolean isDir = file.isDirectory();
System.out.println("是目录:"+isDir);
//boolean isFile = file.isFile();//是否为文件
//是否为隐藏文件
boolean isHidden = file.isHidden();
System.out.println("是否隐藏:"+isHidden);
//最后修改时间
long time = file.lastModified();
Date date = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日 HH:mm:ss");
System.out.println(sdf.format(date));
boolean canWrite = file.canWrite();
System.out.println("可写:"+canWrite);
//file.canRead();
//file.canExecute();
}
}
二、创建和删除文件/目录
2.1、createNewFile()创建文件
package day06;
import java.io.File;
import java.io.IOException;
/**
* 创建文件
* @author xxx
*
*/
public class FileDemo2 {
public static void main(String[] args) throws IOException{
/*
* 在当前目录下创建文件test.txt
* 默认路径就是当前目录,即“./”,所以可以省略不写
*/
File file = new File("test.txt");
/*
* boolean exists()
* 判断该文件是否存在
*/
if (!file.exists()) {
/*
*boolean createNewFile()
*如果指定的文件不存在并成功的创建,则返回true;如果指定的文件已经存在,则返回false。
*/
file.createNewFile();
System.out.println("创建文件完毕!");
}else {
System.out.println("该文件已经存在!");
}
}
}
2.2、mkdir()、mkdirs()创建目录
package day06;
import java.io.File;
/**
* 创建目录
* @author xxx
*
*/
public class FileDemo4 {
public static void main(String[] args) {
/*
* 在当前目录下创建一个名为demo的目录
*/
File dir = new File("demo");
if (!dir.exists()) {
/*
*boolean mkdir()
*当且仅当已创建目录时,返回true;否则返回false。
*/
dir.mkdir();
System.out.println("创建目录完毕!");
}else {
System.out.println("该目录已经存在!");
}
/*
* 在当前目录下创建./a/b/c目录
*/
File dir1 = new File("a" + File.separator + "b" + File.separator + "c");
if (!dir1.exists()) {
/*
* 在创建当前目录的同时将所有不存在的父目录一起创建出来。注意,此操作失败时,也可能
* 已经成功地创建了一部分必须的父目录。
*/
dir1.mkdirs();
System.out.println("创建目录完毕!");
}
}
}
2.3、delete()删除文件或目录
package day06;
import java.io.File;
/**
* 删除文件/目录
* @author xxx
*
*/
public class FileDemo3 {
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("文件不存在!");
}
File dir = new File("demo");
if (dir.exists()) {
/*
* delete方法还可以删除目录,但是前提是该目录必须是一个空目录
*/
dir.delete();
System.out.println("删除目录完毕!");
}
}
}
2.4、删除多级目录
package day06;
import java.io.File;
/**
* 实现方法,来删除给定的文件或目录
* @author xxx
*
*/
public class Test {
public static void main(String[] args) {
File dir = new File("a");
delete(dir);
System.out.println("删除完毕!");
}
public static void delete(File file) {
if (file.isDirectory()) {
//现将其所有子项删除
File[] subs = file.listFiles();
for (File sub:subs) {
delete(sub);//递归
}
}
file.delete();
}
}
三、获取目录中的子项
3.1、listFiles()
File的listFiles方法用于返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的子项(文件或目录)。
package day06;
import java.io.File;
/**
* 获取一个目录中的所有子项
* @author xxx
*
*/
public class FileDemo5 {
public static void main(String[] args) {
/*
* 获取当前目录中的所有子项
*/
File dir = new File(".");
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());
}
}
}
}
3.2、FileFilter接口
FileFilter用于抽象路径名的过滤器,返回满足过滤要求的子项。
package day06;
import java.io.File;
import java.io.FileFilter;
/**
* 获取一个目录中符合条件的部分子项
* 使用重载的listFiles方法,需要传入一个额外的文件过滤器
* 文件过滤器是一个接口:FileFilter
* @author xxx
*
*/
public class FileDemo6 {
public static void main(String[] args) {
File dir = new File(".");
/*
* 获取名字以"."开头的子项
*/
File[] subs = dir.listFiles(new FileFilter() {
public boolean accept(File file) {
System.out.println("正在过滤:"+file.getName());
return file.getName().startsWith(".");
//只要文件
//return file.isFile();
}
});
for (File sub:subs) {
System.out.println(sub.getName());
}
}
}
四、二进制相关知识(补充)
1、Integer.toBinaryString()
Integer.toBinaryString()方法,可以将输入的数字转换成二进制数,但是转换输出的是String类型的字符串。
int n = 45;
System.out.println(n);
System.out.println(Integer.toString(n));//"45"
System.out.println(Integer.toBinaryString(n));
2、Java中二进制与十进制的转换
Java中两个算法(方法):
1、Integer.toString(),将内存2进制数据转换为10进制输出。
2、Integer.parseInt(),将10进制字符串转换为2进制数据。
int n = Integer.parseInt("8866");
System.out.println(n);
//System.out.println(Integer.toString(n));
3、补码
package bin;
public class MaxDemo4 {
public static void main(String[] args) {
int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;
// 2147483647 1111111111111111111111111111111
System.out.print(" " + max + " ");
System.out.println(Integer.toBinaryString(max));
//-2147483648 10000000000000000000000000000000
System.out.print(min + " ");
System.out.println(Integer.toBinaryString(min));
System.out.println(min - max);//1
System.out.println(max + 1);//是最小值
System.out.println(min - 1);//是最大值
}
}
溢出的结果虽然没有意义,但是溢出的结果并不是随机的,而是确定的。
补码的对称现象:-n = ~n + 1