学习笔记:Java_IO(File)
2017-05-01 12:19
351 查看
Java_IO(class File)
Java的IO流这部分,从四月二十七号到三十号,总共学了三天。三天下来IO流当面的代码写了也有几千行,这里做一下详细的总结。总结按照文件类和流两部分分为两篇文章,这是第一篇。我所学到的JavaIO流方面的知识主要是皓铭学长给我推荐的网课和教材中的知识,偏重的中心和实际开发中的中心应该还是有一定的差异。
我所学到的JavaIO流中的知识点分以下几个大部分
File(文件)类
文件字节流和文件字符流
缓冲流
对象流
随机读写流
打印流
File 类
概述
File类将文件、文件夹(目录)、路径三部分封装,通过这个类的对象可以获得文件本身的一些信息,比如文件是否存在、所在的目录、读写权限、文件的长度等。文件类对象只负责将数据封装,并不涉及到对文件的读写操作。
文件的路径
路径的表示法分为两类,分别是绝对路径和相对路径绝对路径
在系统中具有唯一性
表示出来是从盘符到文件或目录名的一整个路径
相对路径
表示路径的相对关系
创建文件时如果采用相对路径的创建方法,那么默认新文件创建在当前工程所在的目录,或者当前程序所在的目录下
构造器
File的构造器并不关心文件是否存在,文件是否存在由File的exist()实例方法负责判断。构造器总共有三类:
File (String filename);
File (String directoryPath, String filename);
File (File f, String filaname);
这三种构造器中,第二种更灵活,但是三种都比较常用。第一种构造器中的filename可以是目录也可是文件,而第二种的directoryPath和第三种的f必须是目录。
Windows系统不区分大小写,而Linux系统区分,这点要注意。
分隔符
文件类在建立的时候构造器中路径存在中分隔符,分别是路径分隔符和名称分隔符分隔符类型 | File中对应的常量 | Windows系统下 | Linux系统下 |
---|---|---|---|
名称分隔符 | File.pathSeparator | \ | / |
路径分隔符 | File.separator | ; | : |
常用方法总结
文件属性:方法 | 功能 | 备注 |
---|---|---|
public String getName() | 获取文件或文件夹的名字 | 这是一个字符串功能,和文件本身的性质无关 |
public boolean exist() | 判断文件是否存在 | |
public long length() | 获取文件的长度 | 单位是字节数,文件的长度即文件的容量 |
public String getAbsolutePath() | 获取文件的绝对路径 | |
public String getParent() | 获取文件的父目录 | 顶层目录(盘符)下返回null |
public boolean isFile() | 判断文件是否是一个文件 | |
public boolean isDirectory() | 判断一个文件是否是目录 | 和上一个方法返回值相反 |
public boolean canRead() | 判断文件是否可读 | |
public boolean canWrite() | 判断文件是否可写 | 系统文件只可读不可写 |
public boolean isHidden() | 判断文件是否为隐藏文件 |
方法 | 功能 | 备注 |
---|---|---|
public boolean creatNewFile() | 创建新文件 | 这个方法会抛出IOExecption |
public boolean delete() | 删除当前文件 | 删除文件不可逆,直接从硬盘上移除 也可以删除文件夹,但只能删除空文件夹 删除非空文件夹需要递归(演示代码在下边给出) |
方法 | 功能 | 备注 |
---|---|---|
public boolean mkdir() | 创建一个目录 | 如果目录已存在不会重新创建,同时返回false |
public boolean mkdirs() | 创建目录(一层或多层) | 和上一个相比这个更常用 |
public String[] list() | 返回目录下全部文件和子目录的名字 | 无视文件或文件夹是否隐藏 |
public File[] listFiles() | 用File对象形式返回目录下所有文件 | 这个更常用 |
public String[] list(FileFilter obj) | 按照过滤器obj的规定返回目录下全部文件和子目录的名字 | |
public File[] listFiles(FileFilter obj) | 按照过滤器obj的规定用File对象形式返回目录下所有文件 |
过滤器
使用过滤器用于public String[] list(FileFilter obj)、public File[] listFiles(FileFilter obj)这两种方法中在使用过滤器时,要向上述两种方法传递一个实现了FilenameFilter接口的对象,其中的FileFilter obj就是过滤器的对象
实现FileFilter接口的对象必须实现一个方法public boolean accept(File pathname),这个方法用于测定指定的抽象路径名是否应包含在某个路径列表,也就是说,当它的返回值为true,上述两种方法的返回之中就包含accept()参数中的pathname文件。只有文件符合条件,过滤器才会让文件加入到上述两种方法的返回值中。
部分功能实例代码
1. 递归实现删除非空文件夹
import java.io.File; public class deleteList { private long fileValue; public static void main(String[] args) { new deleteList().deleteUnemptyDirectory(); } private void deleteUnemptyDirectory() { long startTime = System.currentTimeMillis(); File file = new File("d:\\javatest"); if (file.exists() == true) { System.out.println("源目录存在并已定位:\n程序开始运行"); this.fileValue = 0; } else { System.out.println("源文件不存在,请创建文件后重试"); System.exit(0); } this.deleteProcess(file); String print = file.exists() == true ? "\n文件删除失败" : "\n文件删除成功"; System.out.println("程序运行完成" + print +"\n文件夹大小:" + this.fileValue + "\n总计运行时间:\t" + (System.currentTimeMillis() - startTime) + "ms"); } private void deleteProcess(File file) { File[] files = file.listFiles(); for (File temp : files) { if (temp.isDirectory() == true) { deleteProcess(temp); } else { this.fileValue += temp.length(); } temp.delete(); } file.delete(); } }
2. 利用过滤器遍迭代遍历文件夹
import java.io.File; import java.io.FileFilter; public class MyFileFilter implements FileFilter { private int count; public static void main(String[] args) { new MyFileFilter().overRead(); } private void overRead() { File file = new File("d:\\java\\javatest"); System.out.println("第一次遍历开始(不启用过滤器):"); this.count = 0; this.overRead(file); System.out.println("第一次遍历结束:\n获取文件总数:\t" + this.count); System.out.println("\n第二次遍历开始(启用过滤器):" + "选取以 .java 为后缀名的文件"); this.count = 0; this.overReadWithFilter(file); System.out.println("第二次遍历结束:\n获取文件总数:\t" + this.count); } private void overReadWithFilter(File file) { File[] files = file.listFiles(this); for (File temp : files) { if (temp.isDirectory() == true) this.overReadWithFilter(temp); else { this.count++; System.out.println(temp.getAbsolutePath()); } } } private void overRead(File file) { File[] files = file.listFiles(); for (File temp : files) { if (temp.isDirectory() == true) this.overRead(temp); else { this.count++; System.out.println(temp.getAbsolutePath()); } } } public boolean accept(File pathname) { if (pathname.isDirectory() == true) return true; if (pathname.getName().toLowerCase().endsWith(".java") == true) return true; return false; } }
相关文章推荐
- Java学习笔记IO之File
- j2se学习笔记-java.io.File类
- java学习笔记(九):Java 流(Stream)、文件(File)和IO
- Java.io.File类学习笔记
- Java IO学习笔记(一):File类
- 黑马程序员________Java中IO技术字节流字符流的应用及File类学习笔记
- java IO 学习笔记之FIle
- Java学习笔记之IO(七):FileReader输入字符流
- 【Java学习笔记】18.Java 流(Stream)、文件(File)和IO
- 学习笔记之JavaIO中的文件处理——File和RandomAccessFile
- Java IO学习笔记(一):File类
- JAVA高级视频_IO输入与输出02、03 RandomAccessFile 学习笔记
- [学习笔记]Java基础_IO(包含对象流序列化使用和RandomAccessFile 类的使用)
- java学习笔记IO输入与输出——File类及IO其它类(4)
- Java IO学习笔记(一):File类
- JAVA高级视频_IO输入与输出04 学习笔记
- Java IO学习笔记:字节流
- Java IO部分的学习笔记
- Java IO学习笔记
- JAVA高级视频02_IO输入与输出 06 PipedInputStream和PipedOutPutStream 学习笔记