


程序中打开的文件 IO 资源不属于内存里的资源,而是和操作系统相关的资源。垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源。
Closeable实现了AutoCloseable,Try-catch可以自动关闭流
File类
简介:与平台无关,操作文件与目录,但不能执行访问文件操作(即需要结合输入输出流)
- 相对路径:工程所在目录~~(“/“:工程的盘位置)
- 绝对路经:在磁盘的具体路径
构造器
public File(String pathname) //文件路径public File(URI uri) //文件的URI地址public File(String parent, String child) //指定父文件、子文件路径public File(File parent, String child) //父文件对象、子文件路径
#URI与URL
- URI:表示的是web上每一种可用的资源-如:https://blog.csdn.net/qq_32595453/article/details/79516787
①这是一个可以通过https协议访问的资源,
②位于主机 blog.csdn.net上,
③通过“/qq_32595453/article/details/79516787”唯一标识(可能不是该资源的完整的路径)
- URL:统一资源定位符~如:protocol :// hostname[:port] / path / [;parameters][?query]#fragment
- URL是URI概念的一种实现方式。URL是绝对更具体的。
目录操作
boolean mkdir()~~创建目录(前提:父级目录存在)boolean file.mkdirs()~~如果不存在的父级目录则一并创建String[] list()~~获取该目录的下一级所有的文件和目录的名字。如果file对象为文件,返回nullFile[] listFiles()~~返回File对象数组- 如果
file为文件,返回值为null,在使用时记得判空;
文件操作
boolean createNewFile()~~前提:父级目录存在(即路径已存在)boolean delete()~~删除static File createTempFile(String 前缀,String 后缀)~~前缀+系统随机数+后缀生成临时文件static File createTempFile(String 前缀,String 后缀,File directory)~~指定目录下生成- 1、前缀不少于3个字节 2、后缀可以为null(即”.tmp”) 3、默认在C盘用户临时文件夹下
void deleteOnExit()~~在虚拟机退出时删除对应文件和目录boolean renameTo(File file)~~文件重命名
判断操作
boolean exists() //文件是否存在boolean isFile() //是否是文件boolean isDirectory() //是否是目录boolean isHidden() //是否隐藏boolean isAbsolute() //是否为绝对路径boolean canRead() //是否可读boolean canWrite() //是否可写boolean canExecute() //是否可操作
获取内容
String getName() //获取对象文件或目录的名字String getPath() //获取对象里的路径String getParent() //获取父路径字符串String getAbsolutePath()//获取绝对路File getAbsoluteFile()//获取绝对路径对象File getParentFile() //获取父文件对象long length() //返回文件的大小,单位字节long time = file.lastModified() ; //返回文件最后一次修改的时间Date dt = new Date(time);
FileFilter接口:文件过滤器
File[] files = file.listFiles((file1) -> {return file1.isDirectory();});for (File file1 : files) {System.out.println("file1 = " + file1);}
FilenameFilter接口:
- 接口唯一方法accept,将一次依代File对象下的目录和文件,满足条件的存入list
public class InputAndOutputStream implements FilenameFilter {public static void main(String[] args) {File file = new File(".");String[] list = file.list(new InputAndOutputStream());for (String name : file.list(new InputAndOutputStream())) {System.out.println("s = " + name);}}@Overridepublic boolean accept(File dir, String name) {return name.endsWith(".java") || new File(name).isDirectory();}}//3.0for (String s : file.list((dir, name) -> {return name.endsWith(".java") || new File(name).isDirectory();})){System.out.println("s = " + s);}
RandomAccessFile:可读可写
简介:
- 随机访问文件
- 允许自由定位文件记录指针
- 可以不从开始的地方开始输出
- 可以向已存在的文件后追加内容
方法:
long getFilePointer():返回文件记录指针的当前位置。void seek(long pos):将文件记录指针定位到pos位置。构造器
RandomAccessFile(File file,String mode);- 指定一个mode参数,该参数指定RandomAccessFile的访问模式,
- “r”: 以只读方式打开指定文件
- 如果试图对该RandomAccessFile执行写入方法,将抛出IOException异常。
- “rw”: 以读、写方式打开指定文件
- 如果该文件尚不存在,则尝试创建该文件
- “rws”:以读、写方式打开指定文件
- 还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
- “rwd”:以读、写方式打开指定文件
- 还要求对文件内容的每个更新都同步写入到底层存储设备
public static void main(String[] args) {try {RandomAccessFile randomAccessFile =new RandomAccessFile("Tips\\src\\test\\java\\stream\\RandomAccessFileTest.java","rw");System.out.println("randomAccessFile.getFilePointer() = " + randomAccessFile.getFilePointer());randomAccessFile.seek(380);randomAccessFile.writeBytes("int Java = 10086;\r\n");byte[] bytes = new byte[1024];int hasRead;while ((hasRead = randomAccessFile.read(bytes))>0){System.out.println(new String(bytes,0,hasRead));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
注意:
如果直接将文件记录指针移动到中间某位置后开始输出,则新输出的内容会覆盖文件中原有的内容。
如果需要向指定位置插入内容,程序需要先把插入点后面的内容读入缓冲区,等把需要插入的数据写入文件后,再将缓冲区的内容追加到文件后面。
