Java学习笔记3——File

1、File

文件,对于操作一同来说,一切都是文件,特别是在Linux下

File描述系统中的一个文件或者目录。可以获取文件的创建时间,文件名,大小的信息,但是不能获取文件里面的内容

listFile() 方法返回目录下所有的文件和目录的File数组

通过遍历可以查看目录下的文件信息

一些常用的File对象的方法 length 、genName、exists、isFile、isDirectory....

创建文件对象:File file = new File(filepath);  这只是在内存再创建了文件的对象,但在磁盘中并不一定存在该文件或者目录

file.createNewFIle();    具体创建文件,需要捕获异常,try-catch 否则或编译错误。  注意:创建前需要先判断是否存在该文件,不存在才创建

file.mkdir()  file.mkdirs()  创建目录,前者是指创建一个目录,后者创建有必要而不存在的目录也一起创建 也需要捕获异常       FIle.separator 用于文件目录的分隔,在windows和linux都可以的

file.delete()     删除文件或者目录,返回的是一饿个boolean值  如果目录下还有其他子项,怎么该目录不能不删除

在方法中对传入的参数是文件对象时需要对参数进行安全性验证:(引用他人的)

1)判断传入参数是否为空,为空的话,通过throw new NullPointerException() 抛出异常

2)判断传入的参数是否存在,不存在的话,抛出一个参数异常IllegalArgumnetException

3)还需要判断File对象参数是文件还是目录,用过file.isFile()  file.isDirectory()

获取目录下的子项:listFile()

通过File数组接收该方法的参数:File [] files=file.listFile()

可以通过新循环遍历该数组: for(File file:file){   ...}

File类的简单需求:

1)获取某目录下所有的文件,并且打印出文件名(需要使用递归,代码是引用他人)

主要是对于传入参数进行安全验证,对于我比较难考虑全面。还有对于删除不了文件的情况也未想到-->如文件被其他程序使用时

public static void listDirectory(File dir) 
throws IOException{
/**
* 先要判断从那数所给的目录是否存在

* 1、先把目录或文件输出
* 2、如果是目录的话,递归调用
*/ 
//这个没有想到  需要对参数进行验证
/**
* 再次进行安全验证,是否为一个目录文件!!
*/
if(dir==null){
throw new NullPointerException(dir+"为空!!");
}
if(!dir.exists()){
/**
* 无效的参数异常
* IllegaArgumentException也是runtimeException异常
*/
throw new IllegalArgumentException("目录:"+dir+"不存在");
}
/**
* 再次进行安全验证,是否为一个目录文件!!
*/
if(!dir.isDirectory()){
throw new IllegalArgumentException(dir+"不是一个目录");
}
/**
* 获取当前的子项
* 返回的结果是一个file数组,异常的话返回一个空,下面没有目录文件的话
* 返回一个长度为0的数组
*/
File [] files = dir.listFiles();
if(files!=null&&files.length>0){
for(File file:files){
/**
* 子项是一个目录的话:
* 否则是一个文件,那么我们直接输出文件的名字
*/
System.out.println(file.getName());
if(file.isDirectory()){
/**
*当前方法的作用就是给定一个目录,输出目录喜爱
*的所有子项,所以,若这个还是一个目录的。
*自然可以通过当前方法输出其子项
*这种在当前芙娜伽法中调用当前方法行为被称递归
*不到外不得已,尽量不使用递归。
*非常消耗资源
*/
listDirectory(file);
}else {
//输出文件的toString
System.out.println(file);
}
}
}
}

2)删除给定目录。如果目录不为空的话是删除不了目录的,还有在目录被打开的时也是删除不了的

public static void deleteDirectory(File dir) 
throws IOException{
/**
* 1、先把要删除的目录下的所有文件或者目录删除
* 1)如果是文件的话,直接删除
*  2)如果是目录的话,删除是否成功。
*   不成功的话,说明目录下还有文件,递归调用。
* 2、删除需要删除的目录
*/
//这个没有想到  需要对参数进行验证
/**
* 需要对参数进行安全性
*/
if(dir==null){
throw new NullPointerException(dir+"为空!!");
}
if(!dir.exists()){
/**
* 无效的参数异常
* IllegaArgumentException也是runtimeException异常
*/
throw new IllegalArgumentException("目录:"+dir+"不存在");
}
/**
* 再次进行安全验证,是否为一个目录文件!!
*/
if(dir==null){
throw new NullPointerException(dir+"为空!!");
}
if(!dir.exists()){
/**
* 无效的参数异常
* IllegaArgumentException也是runtimeException异常
*/
throw new IllegalArgumentException("目录:"+dir+"不存在");
}
/**
* 再次进行安全验证,是否为一个目录文件!!
*/
if(!dir.isDirectory()){
throw new IllegalArgumentException(dir+"不是一个目录");
}
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File file : files) {
if (file.isDirectory()) {
//递归删除,子目录下所有的子项
deleteDirectory(file);
} else {
if(file.delete()){
//由于文件被其他程序应用化,则删除不成功
throw new IOException("无法删除文件"+file);
}
}
}
}
//当删除子项都被删除以后,我们再删除方法传入的目录
if(!dir.delete()){
throw new IOException("无法删除目录"+dir);
}
}

2、FileFilter

文件过滤器,是一个接口

使用回调模式,如事件监听

简单使用例子:

FileFilter filter = new FileFilter(){//因为FileFilter是一个接口,使用的是匿名类实现接口

public boolean accept(File file){...}//方法中写过滤条件

};

File dir = new File(".");

File [] sub = dir.listFile(filter);//通过listFile()的重载方法进行过滤

for(File file:sub){

System.out.prinln(file);

}

3、RandomAccessFile

作用:可以真实的操作IO层,数据是以字节接着字节方式存储的

rw:以读写打开文件

r   :以只读模式打开文件

使用:

RandomAccessFile raf = new RandomAccessFile(file,"");//前一个参数是文件(也可以是一个字符串,表示文件,前提文件必须存在),后一个参数是打开方式 rw 或者 r

在实现的时候需要捕获异常,否则的话,编译不通过(使用try-cathc或者继续向上抛)

写入通过调用write(int)  该方法值写入一个字节,即使int的二进制形式最低8位

read()也是读取一个字节,如果是-1的话表示读到文件的结尾

其中write()和read()方法的重载方法,参数可以是一个字节数组read(byte[] d),write(byte[] d)。则是以一个字节数组进行读取和写入

RandomAccessFile对于文件的操作是基于指针的,需要注意当前的指针的位置。

其中操作指针的方法有seek(0):把指针移到文件的开头

getFilePointer()获取当前指针的位置,int

在write(byte[] b,int offset,int length)最好使用这个方法,因为在最后一次写入的时候不一定是原来定义字节数的长度

还有其他的方法方便与操作java中的基本类型 readInt()读取4字节....readUTF()则是读取字符串,同样write也有类是的方法    其实在内部也是一个字节一个字节实现的

使用字节数组读取:

byte [] buf = new byte[1024];
int result=0;//每次讀取字節數
try {
src.seek(0);
while((result=src.read(buf))>0){
// buf = src.read(buf);
//不能把所有的字節寫進去,讓費哦空間.讀到多少字節就寫入多少字節
//緩沖字節數組,比但個字節效率高的多
/**
* 使用字節數組作為緩沖區,批量讀寫進行復制操作
* 比一個字節一給字節讀寫效率高的多
*/
des.write(buf,0,result);
}
} catch (Exception e) {
// TODO: handle exception
}

4、对于文件操作结束后要使用close方法关闭文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tobin liao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值