File类常用方法
方法声明 | 功能描述 |
---|---|
File(String pathname) | 通过指定的一个字符串类型的文件路径创建一个新的File对象 |
File(String parent,String child) | 根据指定的一个字符串类型的父路径和一个字符串类型的子路径(包括文件名)创建一个File对象 |
File(File parent,String child) | 根据指定的File类的父路径和字符串类型的子路径(包括文件名称)创建一个File对象 |
boolean exists() | 判断File对象对应的文件或目录是否存在,若存在返回true,否则返回false |
boolean delete() | 删除File对象对应的文件或目录,若成功删除则返回true,否则返回false |
boolean createNewFile() | 当File对象对应的文件不存在时,该方法将新建一个此File对象所指定的新文件,若创建成功则返回true,否则返回false |
String getName() | 返回File对象表示的文件或文件夹的名称 |
String getPath() | 返回File对象对应的路径 |
String getAbsolutePath() | 返回File对象对应的绝对路径(在UNIX/Linux等系统上,如果路径是以正斜线/开始,则这个路径是绝对路径;在Windows等系统上,如果路径是从盘符开始,则这个路径是绝对路径) |
String getParent() | 返回File对象对应目录的父目录(即返回的目录不包含最后一级子目录) |
boolean canRead() | 判断File对象对应的文件或目录是否可读,若可读返回true,否则返回false |
boolean canWrite() | 判断File对象对应的文件或目录是否可写,若可写返回true,否则返回false |
boolean isFile() | 判断File对象对应的是否是文件(不是目录),若是文件返回true,否则返回false |
boolean isDirectory() | 判断File对象对应的是否是目录(不是文件),若是目录返回true,否则返回false |
boolean isAbsolute() | 判断File对象对应的文件或目录是否是绝对路径 |
long lastModified() | 返回1970.01.01.00:00:00到文件最后修改时间的毫秒值 |
long length() | 返回文件内容的长度 |
String[] list() | 列出指定目录的全部内容,只列出名称 |
File[] listFiles() | 返回一个包含了File对象所有子文件和子目录的File数组 |
import java.io.File;
public class Test{
public static void main(String[] args) throws Exception{
File file = new File("example.txt"); //创建File文件对象,表示一个文件
System.out.println("文件名称:"+file.getName()); //获取文件名称
System.out.println("文件的相对路径:"+file.getPath());//获取文件的相对路径
System.out.println("文件的绝对路径:"+file.getAbsolutePath());//获取文件的绝对路径
System.out.println("文件的父路径:"+file.getParent());//获取文件的父路径
System.out.println(file.canRead()?"文件可读":"文件不可读");//判断文件是否可读
System.out.println(file.canWrite()?"文件可写":"文件不可写");//判断文件是否可写
System.out.println(file.isFile()?"是一个文件":"不是一个文件");//判断是否是一个文件
System.out.println(file.isDirectory()?"是一个目录":"不是一个目录");//判断是否是一个目录
System.out.println(file.isAbsolute()?"是绝对路径":"不是绝对路径");//判断是否是一个绝对路径
System.out.println("最后修改时间:"+file.lastModified());//得到文件最后修改时间
System.out.println("文件大小:"+file.length()+"byte");//获取文件大小
System.out.println("是否成功删除文件:"+file.delete());//是否成功删除文件
}
}
运行结果:
文件名称:example.txt
文件的相对路径:example.txt
文件的绝对路径:F:\IntelliJ IDEA-workspace\Test\example.txt
文件的父路径:null
文件可读
文件可写
是一个文件
不是一个目录
不是绝对路径
最后修改时间:1571371868243
文件大小:6byte
是否成功删除文件:true
import java.io.File;
public class Test{
public static void main(String[] args) throws Exception{
File file = new File("f:\\MyBooks"); //创建File对象,表示一个目录
if(file.isDirectory()){ //判断File对象对应的目录是否存在
String[] names = file.list(); //获取目录下的所有文件的文件名
for (String name:names) { //遍历文件名
System.out.println(name);
}
}
}
}
运行结果:
程序员的数学 1 数学思维.pdf
程序员的数学 1 数学思维.txt
程序员的数学 2 概率统计.pdf
程序员的数学 2 概率统计.txt
程序员的数学 3 线性代数.pdf
程序员的数学 3 线性代数.txt
如果想得到某种后缀名的文件比如.txt的,File类中提供了一个重载的list(FilenameFilter filter)方法。FilenameFilter是一个接口,被称作文件过滤器,当中定义了一个抽象方法accept(File dir,String name),在调用list()方法时,需要实现文件过滤器,在accept()方法中做出判断。
import java.io.File;
import java.io.FilenameFilter;
public class Test{
public static void main(String[] args) throws Exception{
File file = new File("f:\\MyBooks"); //创建File对象,表示一个目录
//创建过滤器对象
FilenameFilter filter = new FilenameFilter() {
//实现accept()方法
public boolean accept(File dir, String name) {
File currFile = new File(dir,name);
//如果文件名以.txt结尾返回true,否则返回false
if(currFile.isFile()&&name.endsWith(".txt")){
return true;
}else{
return false;
}
}
};
if(file.exists()){//判断File对象对应的目录或文件(这里的对象是目录)是否存在
String[] lists = file.list(filter);//获得过滤后的所有文件名数组
for(String name:lists){
System.out.println(name);
}
}
}
}
运行结果:
程序员的数学 1 数学思维.txt
程序员的数学 2 概率统计.txt
程序员的数学 3 线性代数.txt
如果想得到所有子目录要使用listFiles()方法,当对数组中的元素进行遍历时,如果元素中还有子目录需要遍历则需使用递归。
import java.io.File;
public class Test{
public static void main(String[] args) throws Exception{
File file = new File("f:\\新建文件夹");//创建一个代表目录的File对象
fileDir(file);
}
public static void fileDir(File dir){
File[] files = dir.listFiles(); //获得表示目录下所有文件的数组
for(File file:files){ //遍历所有子目录和文件
if(file.isDirectory())
fileDir(file); //如果是目录,递归调用fileDir()
System.out.println(file.getAbsolutePath()); //输出文件绝对路径
}
}
}
运行结果:
f:\新建文件夹\新建文件夹\新建 DOCX 文档.docx
f:\新建文件夹\新建文件夹
f:\新建文件夹\新建文件夹 (2)\新建文件夹
f:\新建文件夹\新建文件夹 (2)\新建文件夹 (2)\新建文本文档.txt
f:\新建文件夹\新建文件夹 (2)\新建文件夹 (2)
f:\新建文件夹\新建文件夹 (2)
f:\新建文件夹\新建文件夹 (3)
f:\新建文件夹\新建文件夹 (4)\新建 PPTX 演示文稿.pptx
f:\新建文件夹\新建文件夹 (4)
f:\新建文件夹\新建文本文档 (2).txt
f:\新建文件夹\新建文本文档.txt
import java.io.File;
public class Test{
public static void main(String[] args) throws Exception{
File file = new File("f:\\新建文件夹");//创建一个代表目录的File对象
if(file.exists()){
System.out.println(file.delete());
}
}
}
运行结果:
false
可以看到删除失败了,因为该目录下包含了子目录或文件。所以这种情况需要用递归方式将整个目录以及其中的文件全部删除。
import java.io.File;
public class Test{
public static void main(String[] args) throws Exception{
File file = new File("f:\\新建文件夹");//创建一个代表目录的File对象
deleteDir(file);
System.out.println("是否删除成功:"+!file.exists());
}
public static void deleteDir(File dir){
if(dir.exists()){ //判断传入的File对象是否存在
File[] files = dir.listFiles(); //获得目录下所有文件的数组
for(File file:files){
if(file.isDirectory())
deleteDir(file);//如果是目录,递归
else
file.delete();//如果是文件,直接删除
}
dir.delete();//删除完一个目录里的所有文件后,就删除这个目录
}
}
}
运行结果:
是否删除成功:true
在IO包中,提供了一个类RandomAccessFile,它不属于流类,但具有读写文件数据的功能,可以随机地从文件的任意位置开始执行读写数据的操作。
它可以将文件以只读或者读写的方式打开,它的两个构造方法,RandomAccessFile(File file,String mode)
【参数file指定被访问的文件,参数mode指定访问文件的模式】和RandomAccessFile(String name,String mode)
【参数name指定被访问文件的路径,参数mode指定访问文件的模式】。
参数mode有四个值,最常用的有两个“r”(只读方式打开文件,如过执行写入操作,会抛出IOException异常)和“rw”(读写方式打开文件,如果该文件不存在会自动创建)。
RandomAccessFile定位文件位置的方法
方法声明 | 功能描述 |
---|---|
long getFilePointer() | 返回当前读写指针所处的位置 |
void seek(long pos) | 设定读写指针的位置,与文件开头相隔pos个字节数 |
int skipBytes(int n) | 使读写指针从当前位置开始,跳过n个字节 |
void setLength(long newLength) | 设置此文件的长度 |
当新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处)。
创建一个文件“time.txt”里面写有“3”。
import java.io.RandomAccessFile;
public class Test{
public static void main(String[] args) throws Exception{
RandomAccessFile raf = new RandomAccessFile("time.txt","rw");
//int times = 0;
int times = Integer.parseInt(raf.readLine());//第一次读取文件时times为3
if(times>0){
//试用一次减少一次
System.out.println("你还可以试用"+times--+"次!");
raf.seek(0); //使记录指针指向文件开头
raf.writeBytes(times+""); //将剩余次数再次写入文件
}else{
System.out.println("软件试用次数已到");
}
raf.close();
}
}
5次运行结果:
你还可以试用3次!
你还可以试用2次!
你还可以试用1次!
软件试用次数已到
软件试用次数已到
字符码表是一种可以方便计算机识别的特定字符集,它是将每个字符和一个唯一的数字对应而形成的一张表。
解码和编码二进制的字节序列和明文的字符序列之间的转换。如果要把字节数组转换为字符串,可以用String类的构造方法String(byte[] bytes,String charsetName),反之可以通过String类的getBytes(String charsetName)方法把字符串按照指定的码表编码成字节数组。
import java.util.Arrays;
public class Test{
public static void main(String[] args) throws Exception{
String str = "中国";
byte[] b1 = str.getBytes(); //利用默认的码表编码
byte[] b2 = str.getBytes("GBK"); //使用GBK编码
byte[] b3 = str.getBytes("UTF-8"); //使用UTF-8编码
System.out.println(Arrays.toString(b1)); //打印字节数组的字符串形式
System.out.println(Arrays.toString(b2));
System.out.println(Arrays.toString(b3));
String result1 = new String(b1);
String result2 = new String(b2,"GBK");
String result3 = new String(b3,"UTF-8");
String result4 = new String(b2,"ISO8859-1");
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
System.out.println(result4);
}
}
运行结果:
[-42, -48, -71, -6]
[-42, -48, -71, -6]
[-28, -72, -83, -27, -101, -67]
中国
中国
中国
???ú
Windows系统默认使用GBK码表,可以看到ISO8859-1对GBK解码时出现四个问号,这是因为编码解码的码表不一致造成的。为此,可以将“中国”GBK编码→ISO8859-1解码→ISO8859-1编码→GBK解码。
public class Test{
public static void main(String[] args) throws Exception{
String str = "中国";
byte[] b = str.getBytes("GBK");
String temp = new String(b,"ISO8859-1");
System.out.println(temp);
byte[] b1 = temp.getBytes("ISO8859-1");
String result = new String(b1,"GBK");
System.out.println(result);
}
}
运行结果:
???ú
中国
注:不是每次解码的时候都可以通过逆向思维方式来得到正确结果的。
字符传输,当通过FileReader读取一个编码格式为GBK的文件,并将读取到的数据通过FileWrite写入一个编码格式为UTF-8的文件时,则会出现乱码现象。
转换流,通过构造方法InputStreamReader(InputStream in,String charsetName)和OutputStreamWriter(OutputStream in,String charsetName)创建流对象时,可以将需要读写的数据指定编码格式。
import java.io.*;
public class Test{
public static void main(String[] args) throws Exception{
//创建InputStreamReader对象,字节流转换为字符流
Reader reader = new InputStreamReader(new FileInputStream("1.txt"),"GBK");
//创建OutputStreamWriter对象
Writer writer = new OutputStreamWriter(new FileOutputStream("2.txt",true),"UTF-8");
char[] ch = new char[100]; //定义一个字符数组
int len;
len = reader.read(ch); //将文件的内容读取到字符数组
String string = new String(ch,0,len); //使用字符数组创建字符串
writer.write(string); //向目标文件写入字符串
reader.close();
writer.close();
}
}