image.pngimage.png
image.png


程序中打开的文件 IO 资源不属于内存里的资源,而是和操作系统相关的资源。垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源。
Closeable实现了AutoCloseable,Try-catch可以自动关闭流


File类

简介:与平台无关,操作文件与目录,但不能执行访问文件操作(即需要结合输入输出流)

  • 相对路径:工程所在目录~~(“/“:工程的盘位置)
  • 绝对路经:在磁盘的具体路径

构造器

  1. public File(String pathname) //文件路径
  2. public File(URI uri) //文件的URI地址
  3. public File(String parent, String child) //指定父文件、子文件路径
  4. public File(File parent, String child) //父文件对象、子文件路径

#URI与URL

  1. URI:表示的是web上每一种可用的资源-如:https://blog.csdn.net/qq_32595453/article/details/79516787

①这是一个可以通过https协议访问的资源,
②位于主机 blog.csdn.net上,
③通过“/qq_32595453/article/details/79516787”唯一标识(可能不是该资源的完整的路径)

  1. URL:统一资源定位符~如:protocol :// hostname[:port] / path / [;parameters][?query]#fragment
  2. URL是URI概念的一种实现方式。URL是绝对更具体的。

目录操作

  • boolean mkdir()~~创建目录(前提:父级目录存在)
  • boolean file.mkdirs()~~如果不存在的父级目录则一并创建
  • String[] list()~~获取该目录的下一级所有的文件和目录的名字。如果file对象为文件,返回null
    • File[] 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)~~文件重命名

判断操作

  1. boolean exists() //文件是否存在
  2. boolean isFile() //是否是文件
  3. boolean isDirectory() //是否是目录
  4. boolean isHidden() //是否隐藏
  5. boolean isAbsolute() //是否为绝对路径
  6. boolean canRead() //是否可读
  7. boolean canWrite() //是否可写
  8. boolean canExecute() //是否可操作

获取内容

  1. String getName() //获取对象文件或目录的名字
  2. String getPath() //获取对象里的路径
  3. String getParent() //获取父路径字符串
  4. String getAbsolutePath()//获取绝对路
  5. File getAbsoluteFile()//获取绝对路径对象
  6. File getParentFile() //获取父文件对象
  7. long length() //返回文件的大小,单位字节
  8. long time = file.lastModified() ; //返回文件最后一次修改的时间
  9. Date dt = new Date(time);

FileFilter接口:文件过滤器

  1. File[] files = file.listFiles((file1) -> {
  2. return file1.isDirectory();
  3. });
  4. for (File file1 : files) {
  5. System.out.println("file1 = " + file1);
  6. }

FilenameFilter接口:

  1. 接口唯一方法accept,将一次依代File对象下的目录和文件,满足条件的存入list
  1. public class InputAndOutputStream implements FilenameFilter {
  2. public static void main(String[] args) {
  3. File file = new File(".");
  4. String[] list = file.list(new InputAndOutputStream());
  5. for (String name : file.list(new InputAndOutputStream())) {
  6. System.out.println("s = " + name);
  7. }
  8. }
  9. @Override
  10. public boolean accept(File dir, String name) {
  11. return name.endsWith(".java") || new File(name).isDirectory();
  12. }
  13. }
  14. //3.0
  15. for (String s : file.list((dir, name) -> {
  16. return name.endsWith(".java") || new File(name).isDirectory();}))
  17. {
  18. System.out.println("s = " + s);
  19. }

RandomAccessFile:可读可写

简介:

  • 随机访问文件
  • 允许自由定位文件记录指针
  • 可以不从开始的地方开始输出
  • 可以向已存在的文件后追加内容

方法:

  • long getFilePointer():返回文件记录指针的当前位置。
  • void seek(long pos):将文件记录指针定位到pos位置。

    构造器

    RandomAccessFile(File file,String mode);

    • 指定一个mode参数,该参数指定RandomAccessFile的访问模式,
  1. “r”: 以只读方式打开指定文件
    • 如果试图对该RandomAccessFile执行写入方法,将抛出IOException异常。
  2. “rw”: 以读、写方式打开指定文件
    • 如果该文件尚不存在,则尝试创建该文件
  3. “rws”:以读、写方式打开指定文件
    • 还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
  4. “rwd”:以读、写方式打开指定文件
    • 还要求对文件内容的每个更新都同步写入到底层存储设备
  1. public static void main(String[] args) {
  2. try {
  3. RandomAccessFile randomAccessFile =
  4. new RandomAccessFile("Tips\\src\\test\\java\\stream\\RandomAccessFileTest.java","rw");
  5. System.out.println(
  6. "randomAccessFile.getFilePointer() = " + randomAccessFile.getFilePointer());
  7. randomAccessFile.seek(380);
  8. randomAccessFile.writeBytes("int Java = 10086;\r\n");
  9. byte[] bytes = new byte[1024];
  10. int hasRead;
  11. while ((hasRead = randomAccessFile.read(bytes))>0){
  12. System.out.println(new String(bytes,0,hasRead));
  13. }
  14. } catch (FileNotFoundException e) {
  15. e.printStackTrace();
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }

注意:
如果直接将文件记录指针移动到中间某位置后开始输出,则新输出的内容会覆盖文件中原有的内容。
如果需要向指定位置插入内容,程序需要先把插入点后面的内容读入缓冲区,等把需要插入的数据写入文件后,再将缓冲区的内容追加到文件后面。