Java学习笔记3——File
2016-07-22 23:52
274 查看
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方法关闭文件
文件,对于操作一同来说,一切都是文件,特别是在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方法关闭文件
相关文章推荐
- java 学习笔记(入门篇)_java的安装与配置
- java学习第一节知识点总结(配置环境等)
- [JAVA学习笔记] 第三章 语法入门
- [JAVA学习笔记] 第四章 认识对象
- [Java学习笔记] 为什么.length是数组的成员,是字符串的方法?
- [Java学习笔记] Java中的强制转换
- 黑马程序员——(JAVA开发的前奏)JAVA概述与环境的配置图文说明
- 黑马程序员——IO流体系概览
- 黑马程序员——Java基础---数据类型、编码解码
- 黑马程序员——设计模式之模板方法设计模式
- 黑马程序员——设计模式之单例设计模式
- 黑马程序员——JAVA基础---常量与变量
- 黑马程序员——JAVA基础---类与对象
- 黑马程序员——JAVA基础---数组
- 黑马程序员——JAVA学习笔记---IO处理方式
- 黑马程序员——JAVA基础---使用泛型
- 黑马程序员——JAVA基础---操作数据库
- 【Java学习笔记】一个初学者的学习历程,分享学习JAVA心得
- 黑马程序员java学习第二天,java入门介绍
- 黑马程序员java学习第三天,函数