1.文件操作类File
File类是Java文件处理的最基本的类,它用于实现对目录的创建、删除,对文件的创建、重命名、删除。因此,File类操作的对象分为两类:目录和文件
根据File类的操作功能,可以进行如下的各种操作
1.1创建File实例
在能够操作目录或文件之前,要先创建一个对象,指向目录或文件。File有4个构造函数来创建一文件对象。
*File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新File实例File path = new File("D:/demo");//目录对象
File file = new File("D:/"); //文件对象
*File(String parent,String child):根据parent路径名字符串和child路径名字符串创建一个新File实例
File file = new File("D:/demo","");
*File(URI uri):通过将给定的file:URI转换为一个抽象路径名来创建一个新的File实例。
File file = new File("file://D:/");
*File(File parent,String child):根据parent抽象路径名和child路径名字符串创建一个新File实例
File file = new File(path,"");
其中,第一个函数直接根据目录或文件的全路径名来创建,第二个函数则将路径和文件名分开输入,第三个函数用来指向一个URL,最后一个函数则根据目录实例来创建文件。
1.2 判断是目录还是文件
对于上面创建的File实例,由于都是通过路径字符串来创建的,所有并不知道它是目录还是文件。此时可以通过下面的函数来判断
*isDirectory():是否是目录
*isFile():是否是文件
1.3 检查目录或文件是否存在
*exists()
1.4 创建目录或文件
*mkdir():创建一个目录
*mkdirs():创建所有目录
*createNewFile():创建一个文件
1.5 查看目录下的文件列表。并输出路径名
对于目录来说,可以使用listFiles()取得该目录下的文件列表,它返回的是一个File类型的数组。我们可以循环该数组取得每一个文件对象,并可以使用getAbsolutePath()获取该对象的路径名。
File p = new File("D:/work");
File[] fileList = p.listFiles();
for(File f:fileList){
System.out.AbsolutePath());
}
从输出结果可以看出,这里既有目录,又有文件。因此,通过listFiles()取得的文件列表中,即包含目录又包含文件。
1.6 重命名文件名
对于文件,我们可以使用renameTo()函数重命名一个新的文件名,参数为一个新的File实例。
File file = new File("D:/work/");
File f = new File("D:/work/");
if(file.isFile()){
}
2.文件搜索类FileFilter与FilenameFilter
如何快速地按照特定要求出所有文件呢?此时可以使用两个文件搜索类FileFilter与FilenameFilter,它们都是接口,只需要我们编写自己的实例类来实现它们的函数accept()即可。
FileFilter的主要作用就是检测文件是否存在,FileFilter和它的前身FilenameFilter唯一的不同是,FileFilter提供文件对象的访问方法,而FilenameFilter是按照目录和文件名的方式来工作的。
FileFilter拥有下面的一个过滤函数接口,用户的实现类只需要实现函数,对不同的文件进行过滤即可:
boolean accept(File file);
而FilenameFilter的过滤函数时按照目录和文件名来进行的:
boolean accept(File directory,String name);
下面我们通过实例来讲解这两个类的使用。
2.1 FileFilter的使用
一个简单的例子是搜索特定的文件扩展名。你可以使用FilenameFilter,但是出来的结果会让你很难判断到底是目录还是文件。要解决这个问题,你需要使用FileFilter对象。
下面通过实例来演示它的使用。首先定义一个扩展名过滤器类ExtensionFilter,它实现了接口FileFilter。添加一个变量Extension,表示待匹配的文件扩展名,并在构造函数中初始化该变量。接下来是最重要的接口函数accept(),这是实现按照扩展名过滤的地方。
public class ExtensionFilter implements FileFilter {
private String str;
public ExtensionFilter(String str){
this.str=str;
}
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory()){
return false;
}
String fileName = Name();
int index = fileName.indexOf(".");
if(index==-1){
return false;
}else if(index==fileName.length()-1){
return false;
}else{
return this.str.equals(fileName.substring(index+1));
}
}
public static void main(String[] args) {
File file = new File("D:/work/demo");
ExtensionFilter ef=new ExtensionFilter("txt");
File[] fileList = file.listFiles(ef);
for(File f:fileList){
System.out.AbsolutePath());
}
}
}
运行测试类结果如下:
D:\work\
D:\work\
D:\work\
2.2 FilenameFilter的使用
Filename的过滤函数accept()则直接根据目录和文件名进行过滤,与FileFilter相比,多了一个文件名参数。下面我们通过开发一个图片过滤器ImageFilter来演示它的使用,我们的目标是过滤扩展名为.gif,.jpg,.png的文件,实现的完整代码如下。
public class ImageFilter implements FilenameFilter{
public boolean accept(File dir, String name) {
return isGif(name)||isJpg(name)||isPng(name);
}
private boolean isGif(String filename){
LowerCase().endsWith(".gif"))
return true;
else return false;
}
private boolean isJpg(String filename){
LowerCase().endsWith(".jpg"))
return true;
else return false;
}
private boolean isPng(String filename){
LowerCase().endsWith(".png"))
return true;
else return false;
}
public static void main(String[] args) {
File file = new File("D:/work/workNote/考勤截图/2014/8月");
ImageFilter iFilter =new ImageFilter();
File[] fileList = file.listFiles();
for(File f:fileList){
System.out.AbsolutePath());
}
}
}
输出如下:
D:\work\workNote\考勤截图\2014\8月\2014年8月11日.png
D:\work\workNote\考勤截图\2014\8月\2014年8月12日.png
D:\work\workNote\考勤截图\2014\8月\2014年8月13日a.png
D:\work\workNote\考勤截图\2014\8月\2014年8月13.png
java创建文件D:\work\workNote\考勤截图\2014\8月\2014年8月18日.png
D:\work\workNote\考勤截图\2014\8月\2014年8月19日.png
D:\work\workNote\考勤截图\2014\8月\2014年8月1日.png
D:\work\workNote\考勤截图\2014\8月\2014年8月20日.png
D:\work\workNote\考勤截图\2014\8月\2014年8月21日.png
3 文件随机读写类RandomAccessFile
刚才讲解的File类,以及FileFilter和FilenameFilter类,都是对文件和目录进行操作,不能够实现对文件内容的读写。要实现对文件内容的随机读写,可以使用RandomAccessFile类。RandomAccessFile类能够随机访问文件,它将文件内容存储在一个大型byte数组中。它存在着指向该隐含byte数组的光标或索引,称为文件指针,该指针位置可以通过seek方法设置。输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含byte数组的当前末尾之后的输出操作导致该数组扩展。
通常,如果此类中的所有读取例程在读取所需数量的字段之前已到达文件末尾,则抛出EOFExtension(是一种IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件未尾,则抛出IOException,而不是EOFException。需要特别指出的是,如果流已被关闭,则可能抛出IOException。
下面我们来看看如何通过RandomAccessFile来随机读写文件。下面我们从打开关闭文件、读取文件和写入文件3个方面讲解RandomAccessFile的使用。
3.1 打开与关闭文件
创建随机访问文件的实例,可以使用如下的两种构造函数
*RandomAccessFile(File file,String mode):创建从中读取和向其中写入(可选)的随机访问文件流,该文件由File参数指定。
*RandomAccessFile(Stirng name,String mode):创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。
第一种是通过一个File对象创建,第二种则直接指定文件名。其中的参数mode表示对目标文件的访问模式,可选值如表9-1
下例演示了采用读写模式打开文件D:/的方法:
RandomAccessFile file = new RandomAccessFile("D:/","rw");
然后在完成了对文件的一系列操作之后,还需要使用close()函数关闭文件:
file.close();
打开文件后,还可以在文件的长度范围内设置指针位置。
(1)读取文件长度
可以使用length()取得文件的长度,该数值是该文件的字节数,如下例所示:
long size = file.length();
System.out.println("文件大小:"+size);
(2)设置文件指针位置
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论