loading...
IO流与File类的基本概念
Published in:2022-01-31 | category: JavaSE基础知识
Words: 1.5k | Reading time: 6min | reading:

流的概念

什么是流

概念:

  • 内存与存储设备之间传输数据的通道。

  • 上传文件和下载文件

  • Java对数据的操作是通过流的方式

  • Java用于操作流的对象都在IO包中

IO流常用的基类

字节流的抽象基类:
InputStream,OutputStream

字符流的抽象基类:
Reader,Writer

流的分类

按流向分

  • 输入流:将<存储设备>中的内容读入到<内存>中。

  • 输出流:将<内存>中的内容写入到<存储设备>中

按单位分

  • 字节流:以字节为单位,可以读取所有数据。

    • InputStream:字节输入流
    • OutputStream:字节输出流
  • 字符流:以字符为单位,只能读写文本数据。

    • Reader:字符输入流
    • Writer: 字符输出流

综上所述,字节流和字符流都可以读写文本数据。那么我们应该在什么情况下使用那种流呢?

如果数据所在的文件通过Windows自带的记事本打开并能读懂里面的内容,就是用字符流,其他情况下用字节流。如果你什么都不知道,就用字节流。

File类

概述

文件和目录路径的抽象表现形式。

构造方法

1
2
3
4
5
6
public File (String pathname); //参数为当前文件夹/文件的路径(推荐方式)

public File (String parent , String child); // parent的字符串路径名和child的字符串路径名构造一个File

public File (File parent , String child); //参数一:需要描述parent的字符串路径名和子文件字符串路径名

File类中的常用方法

创建方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//先创建一个文件对象
File file = new File("d:\\test\\a.txt");

//public boolean createNewFile() throws IOException:创建文件
file.createNewFile(); //如果创建成功,返回值为true,否则为false

//public boolean mkdir(): 创建目录(文件夹):如果存在该文件夹,返回值为false
//public boolean mkdirs(): 创建目录(文件夹):创建多级目录,如果父目录不存在,会自动创建
File file2 = new File("d:\\test");
file2.mkdir();

File file3 = new File("d:\\aaa\\bbb\\ccc");
file3.mkdirs();

$\color{red}{如果描述文件或者文件夹没有指定盘符,相对路径:默认是在当前项目路径下。}$

删除方法和重命名功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//public boolean delete(): 删除目录/文件
// 如果删除的是目录,那么前提条件:目录必须为空
file.delete(); //如果删除成功,返回值为true

/*
针对某一个文件操作
public boolean renameTo(File dest):

需求:将当前项目下的test.jpg -- Rename.jpg

情况1:当前文件的路径和改名后的路径相同,仅仅是改名字

情况2:当前文件的路径名和该后面的路径名不相同,剪切并重命名

*/
File file = new File("test.jpg");
file.renameTo(new File("Rename.jpg"));

判断功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

/*
* public boolean isFile():判断是否是文件
* public boolean isDirectory():判断是否是文件夹(目录)
* public boolean canRead():判断是否可读
* public boolean canWrite():判断是否可写
* public boolean exists():判断所file表示的文件/目录是否存在
* public boolean isAbsolute():判断是否是绝对路径
* public boolean isHidden():判断是否是隐藏文件
*/

File file = new File("a.txt") ;

System.out.println("isFile():"+file.isFile());
System.out.println("isDirectory():"+file.isDirectory());
System.out.println("canRead():"+file.canRead());
System.out.println("canWrite():"+file.canWrite());
System.out.println("exists():"+file.exists());
System.out.println("isAbsolute()():"+file.isAbsolute());
System.out.println("isHidden():"+file.isHidden();

File类的获取功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

/*
public String getAbsolutePath():获取绝对路径名
public String getpath():当前文件所表示的路径
public long length():获取文件长度
public long lastModified():获取当前文件最后一次修改的时间(long: 毫秒值)
public File[] listFiles():获取的是某个盘符下/目录File数组(目录中的文件)
public String[] list():获取某个盘符/目录下的所有文件以及目录的字符串数组
*/
File file = new File("a.txt") ;
//public String.getAbsolutePath()
System.out.println("getAbso():"+file.getAbsolutePath());//D:\JavaEE2008_workspace\day26\a.txt

//public String getPath()
System.out.println("getPath():"+file.getPath());//a.txt
System.out.println("length():"+file.length());

System.out.println("lastModified():"+file.lastModified());
//1604284636537

//long-----Date:日期格式java.util.Date
long time = 1604284636537L ;
Date date = new Date(time) ;

//Date----String:字符串文本格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
//格式化操作
String dateStr = sdf.format(date) ;
System.out.println(dateStr);//2020-11-02 10:37:16

有一个小需求:

获取当前D盘下的所有以’.jpg’结尾的文件.

首先,对当前需求进行分析:

  1. 描述D盘符

  2. 获取当前盘符下的所有文件/文件夹所表示字符串/目录下的文件的File数组

  3. 判断如果当前字符串数组或者File数组不为空,遍历获取到每一个文件目录

  4. 判断如果当前File是否是表示的文件
    再次判断是否以”.jpg”结尾

  5. 输出即可!

这次我们使用
public File[] listFiles()功能,这个方法相对public String[] list()来说比较麻烦,它提供了以下的方法:

1
2
3
4
5
6
7

public String[] list() ;

public String[] list(FilenameFilter filter);

public File[] listFiles(FilenameFilter filter);

在调用这个方法的是时候,列表已经获取到了FilenameFilter:文件名过滤器

抽象方法:
boolean accept(File dir , String name):是否将文件添加到文件列表中

返回值为true:表示添加到指定文件列表中

/*
方法业务:根据具体的情况判断
 *       "所有的以".jpg"结尾的文件!"
 *       dir表示是否文件
 *       name是否"已.jpg结尾"
 */
//描述一下D盘
File file = new File("D:\\") ;

//public File[] listFiles(FilenameFilter filter):高级功能:获取file表示的目录中文件的File数组//参数为:文件名称过滤器
File[] fileArray = file.listFiles(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
//return false;
//业务:
/**
 * "所有的以".jpg"结尾的文件!"
 *     dir表示是否文件
 *     name是否"以.jpg结尾"
 */
  /*
 File file = new File(dir,name) ;
boolean flag1 = file.isFile() ; //true:是文件
boolean flag2 = name.endsWith(".jpg") ;//true:文件名称是以.jpg结尾
  
        System.out.println(name);
  return flag1 && flag2 ;
*/
//一步走:
    return new File(dir,name).isFile() && name.endsWith(".jpg") ;
    }
}) ;

//遍历File数组
if(fileArray!=null) {for(File f:fileArray) {
System.out.println(f.getName());
    }
}
Prev:
Java概述(由来)与环境搭建
Next:
ElasticSearch集成Springboot
catalog
catalog