IO流(一) 概述及File类

概述

数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上。

当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。

当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。

因此我们把这种输入和输出动作称为IO操作。

  1. IO流的分类

字节流

字节输入流 InputStream 抽象类

  FileInputStream 操作文件的字节输入流

字节输出流 OuputStream抽象类

     FileOutputStream 操作文件的字节输出流

字符流

字符输入流 Reader抽象类

InputStreamReader 输入操作的转换流

FileReader 用来操作文件的字符输入流(简便的流)

字符输出流 Writer抽象类

 OutputStreamWriter 输出操作的转换流

FileWriter 用来操作文件的字符输出流(简便的流)

根据数据的流向分为:输入流和输出流。

输入流 :把数据从其他设备上读取到内存中的流。

输出流 :把数据从内存 中写出到其他设备上的流。

根据数据的类型分为:字节流和字符流。

字节流 :以字节为单位,读写数据的流。

字符流 :以字符为单位,读写数据的流。

字节流:电影、音乐、图片等等

字符流:文本文档(间接帮助我们处理中文乱码问题)

 

 

File类

打开API,搜索File类。阅读其描述:File文件和目录路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可。

File类的静态成员变量(字段)

【static String pathSeparator】与系统有关的路径分隔符,为了方便,它被表示为一个字符串。

【static char pathSeparatorChar】 与系统有关的路径分隔符。

【static String separator】 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。

【static char separatorChar】 与系统有关的默认名称分隔符。

 

操作路径:路径不能写死了

C:\develop\a\a.txt  windows

/develop/a/a.txt  linux

"C:"+File.separator+"develop"+File.separator+"a"+File.separator+"a.txt"

绝对路径和相对路径

绝对路径:是一个完整的路径

    以盘符(c:,D:)开始的路径

        c:\\a.txt

        C:\\Users\itcast\\IdeaProjects\\shungyuan\\123.txt

        D:\\demo\\b.txt

相对路径:是一个简化的路径

    相对指的是相对于当前项目的根目录(C:\\Users\itcast\\IdeaProjects\\shungyuan)

    如果使用当前项目的根目录,路径可以简化书写

    C:\\Users\itcast\\IdeaProjects\\shungyuan\\123.txt-->简化为: 123.txt(可以省略项目的根目录)

注意:

    1.路径是不区分大小写

    2.路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠

 

File类的构造函数

File(String pathname):

通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

参数:

    String pathname:字符串的路径名称

    路径可以是以文件结尾,也可以是以文件夹结尾

    路径可以是相对路径,也可以是绝对路径

    路径可以是存在,也可以是不存在

    创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况

    

File(String parent, String child) :

根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

    参数:把路径分成了两部分

        String parent:父路径

        String child:子路径

    好处:

     父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化

File(File parent, String child):

根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

    参数:把路径分成了两部分

File parent:父路径

String child:子路径

好处:

父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化

父路径是File类型,可以使用File的方法对路径进行一些操作,再使用路径创建对象

 

通过构造方法创建File对象,我们进行演示:

public class FileDemo {
	public static void main(String[] args) {
		//File构造函数演示
		String pathName = "e:\\java_code\\day22e\\hello.java";
		File f1 = new File(pathName);//将Test22文件封装成File对象。注意;有可以封装不存在文件或者文件夹,变成对象。
		System.out.println(f1);
		
		File f2 = new File("e:\\java_code\\day22e","hello.java");
		System.out.println(f2);
		
		//将parent封装成file对象。
		File dir = new File("e:\\java_code\\day22e");
		File f3 = new File(dir,"hello.java");
		System.out.println(f3);
	}
}

File类的获取

创建完了File对象之后,那么File类中都有如下常用方法,可以获取文件相关信息

public String getAbsolutePath() :返回此File的绝对路径名字符串。

获取的构造方法中传递的路径

无论路径是绝对的还是相对的,getAbsolutePath方法返回的都是绝对路径

 

public String getPath() :将此File转换为路径名字符串。

获取的构造方法中传递的路径

toString方法调用的就是getPath方法

 

public String getName()  :返回由此File表示的文件或目录的名称。

    获取的就是构造方法传递路径的结尾部分(文件/文件夹)

 

public long length()  :返回由此File表示的文件的长度。

    获取的是构造方法指定的文件的大小,以字节为单位

    注意:

        文件夹是没有大小概念的,不能获取文件夹的大小,那么length方法返回0

        如果构造方法中给出的路径不存在,那么length方法返回0

// Returns the absolute pathname string of this abstract pathname.

public String getAbsolutePath() {
    return fs.resolve(this); //this不为null
}

获取文件的绝对路径,即全路径

File中封装的路径是什么获取到的就是什么。

// Returns the name of the file or directory denoted by this abstract
 pathname. This is just the last name in the pathname's name sequence.  If the pathname's name sequence is empty, then the empty string is returned.

public String getName() {
    int index = path.lastIndexOf(separatorChar);
    if (index < prefixLength) return path.substring(prefixLength);
    return path.substring(index + 1);
}

// Converts this abstract pathname into a pathname string.

public String getPath() {
    return path;
}

// Returns the length of the file denoted by this abstract pathname.The return value is unspecified if this pathname denotes a directory.

public long length() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(path);
    }
    if (isInvalid()) {  //不存在,返回0L
        return 0L;
    }
    return fs.getLength(this);
}

File类的判断、创建删除方法

 

public boolean exists() :此File表示的文件或目录是否实际存在。

用于判断构造方法中的路径是否存在

    存在:true

    不存在:false

        

public boolean isDirectory() :此File表示的是否为目录。

    用于判断构造方法中给定的路径是否以文件夹结尾

        是:true

        否:false

            

public boolean isFile() :此File表示的是否为文件。

    用于判断构造方法中给定的路径是否以文件结尾

        是:true

        否:false

注意:

    电脑的硬盘中只有文件/文件夹,两个方法是互斥

    这两个方法使用前提,路径必须是存在的,否则都返回false

```

 

public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。

创建文件的路径和名称在构造方法中给出(构造方法的参数)

返回值:布尔值

        true:文件不存在,创建文件,返回true

        false:文件存在,不会创建,返回false

    注意:

        1.此方法只能创建文件,不能创建文件夹

        2.创建文件的路径必须存在,否则会抛出异常

public boolean createNewFile() throws IOException

createNewFile声明抛出了IOException,我们调用这个方法,就必须的处理这个异常,要么throws,要么trycatch

注意事项:创建一个文件时,相对路径如果只写一个文件时,相对的项目(项目的下一级),如果只写一个文件并在前面加上"\\",相对的项目盘符的根目录

 

public boolean mkdir() :创建单级空文件夹

创建文件夹的路径和名称在构造方法中给出(构造方法的参数)

    返回值:布尔值

        true:文件夹不存在,创建文件夹,返回true

        false:文件夹存在,不会创建,返回false;

构造方法中给出的路径不存在返回false

    注意:

        1.此方法只能创建文件夹,不能创建文件

public boolean mkdirs() :既可以创建单级空文件夹,也可以创建多级文件夹

创建文件夹的路径和名称在构造方法中给出(构造方法的参数)

    

public boolean delete() :删除由此File表示的文件或目录。

    此方法,可以删除构造方法路径中给出的文件/文件夹

    返回值:布尔值

        true:文件/文件夹删除成功,返回true

        false:文件夹中有内容,不会删除返回false;构造方法中路径不存在false

    注意:

    delete方法是直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎

 

硬盘中只有文件/文件夹,两个方法互斥。

路径必须存在,否则返回false。

public boolean createNewFile() throws IOException {
    SecurityManager security = System.getSecurityManager();
    if (security != null) security.checkWrite(path);
    if (isInvalid()) {
        throw new IOException("Invalid file path");
    }
    return fs.createFileExclusively(path);
}

//创建此抽象路径名指定的目录

public boolean mkdir() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkWrite(path);
    }
    if (isInvalid()) {
        return false;
    }
    return fs.createDirectory(this);
}

//创建此抽象路径名指定的目录

public boolean mkdirs() {
    if (exists()) {
        return false;
    }
    if (mkdir()) {
        return true;
    }
    File canonFile = null;
    try {
        canonFile = getCanonicalFile();
    } catch (IOException e) {
        return false;
    }

    File parent = canonFile.getParentFile();
    return (parent != null && (parent.mkdirs() || parent.exists())

&& canonFile.mkdir());
}

//删除此抽象路径名表示的文件或目录。

public boolean delete() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkDelete(path);
    }
    if (isInvalid()) {
        return false;
    }
    return fs.delete(this);
}

我们进行方法的演示

public class FileMethodDemo2 {
	public static void main(String[] args) throws IOException {
		// 对文件或者文件加进行操作。
		File file = new File("e:\\file.txt");
		// 创建文件,如果文件不存在,创建 true 如果文件存在,则不创建 false。 如果路径错误,IOException。
		boolean b1 = file.createNewFile();
		System.out.println("b1=" + b1);
		//-----------删除文件操作-------注意:不去回收站。慎用------
		 boolean b2 = file.delete();
		 System.out.println("b2="+b2);

		//-----------需要判断文件是否存在------------
		 boolean b3 = file.exists();
		 System.out.println("b3="+b3);

		//-----------对目录操作 创建,删除,判断------------
		File dir = new File("e:\\abc");
		//mkdir()创建单个目录。//dir.mkdirs();创建多级目录
		boolean b4 = dir.mkdir();
		System.out.println("b4="+b4);
		//删除目录时,如果目录中有内容,无法直接删除。
		boolean b5 = dir.delete();
		//只有将目录中的内容都删除后,保证该目录为空。这时这个目录才可以删除。
		System.out.println("b5=" + b5);

		//-----------判断文件,目录------------
		File f = new File("e:\\javahaha");// 要判断是否是文件还是目录,必须先判断存在。
		// f.mkdir();//f.createNewFile();
		System.out.println(f.isFile());
		System.out.println(f.isDirectory());
	}
}

listFiles() 方法介绍

文件都存放在目录(文件夹)中,那么如何获取一个目录中的所有文件或者目录中的文件夹呢?那么我们先想想,一个目录中可能有多个文件或者文件夹,那么如果File中有功能获取到一个目录中的所有文件和文件夹,那么功能得到的结果要么是数组,要么是集合。我们开始查阅API。

File类遍历(单级文件夹)目录功能【掌握】

 

```java

public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。

遍历构造方法中给出的目录,会获取目录中所有文件/文件夹的名称,把获取到的多个名称存储到一个String类型的数组中

public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

遍历构造方法中给出的目录,会获取目录中所有的文件/文件夹,把文件/文件夹封装为File对象,多个File对象存储到File数组中

 

注意:

list方法和listFiles方法遍历的是构造方法中给出的目录

如果构造方法中给出的目录的路径不存在,会抛出空指针异常

如果构造方法中给出的路径不是一个目录,也会抛出空指针异常

 

  1. 方法演示如下:
public class FileMethodDemo3 {
	public static void main(String[] args) {
		File dir = new File("e:\\java_code");
		//获取的是目录下的当前的文件以及文件夹的名称。
		String[] names = dir.list();
		for(String name : names){
			System.out.println(name);
		}
		//获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
		File[] files = dir.listFiles();
		for(File file : files){
			System.out.println(file);
		}
	}
}

注意:在获取指定目录下的文件或者文件夹时必须满足下面两个条件

1,指定的目录必须是存在的,

2,指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException

文件过滤器

通过listFiles()方法,我们可以获取到一个目录下的所有文件和文件夹,但能不能对其进行过滤呢?比如我们只想要一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹呢?

我们是可以先把一个目录下的所有文件和文件夹获取到,并遍历当前获取到所有内容,遍历过程中在进行筛选,但是这个动作有点麻烦,Java给我们提供相应的功能来解决这个问题。

查阅File类的API,在查阅时发现File类中重载的listFiles方法,并且接受指定的过滤器。

 

测试类:

public class FileDemo2 {
	public static void main(String[] args) {
		//获取扩展名为.java所有文件
		//创建File对象
		File file = new File("E:\\code\\day11_code");
		//获取指定扩展名的文件,由于要对所有文件进行扩展名筛选,因此调用方法需要传递过滤器
		File[] files = file.listFiles(new MyFileFilter());
		//遍历获取到的所有符合条件的文件
		for (File f : files) {
			System.out.println(f);
		}
	}
}

自定类继承FilenameFilter过滤器接口:

//定义类实现文件名称FilenameFilter过滤器
class MyFileFilter implements FilenameFilter{
	public boolean accept(File dir, String name) {
		return name.endsWith(".java");
	}
}

在查阅API时,我们发现,在listFiles(FileFilter filter) 也可以接受一个FileFilter过滤器,它和我们讲的FilenameFilter有啥区别呢?

 

FilenameFilter过滤器中的accept方法接受两个参数,一个当前文件或文件夹所在的路径,一个是当前文件或文件夹对象的名称。

FileFilter 过滤器中的accept方法接受一个参数,这个参数就当前文件或文件夹对象

当我们需要过滤文件名称时就可以使用FilenameFilter这个过滤器,当我们想对当前文件或文件夹进行过滤,就可以使用FileFilter ,比如需要当前目录下的所有文件夹,就可以使用FileFilter 过滤器。

测试类:

public class FileDemo2 {
	public static void main(String[] args) {
		//获取扩展名为.java所有文件
		//创建File对象
		File file = new File("E:\\code\\day11_code");
		//获取指定目录下的文件夹
		File[] files = file.listFiles(new FileFileterByDir());
		//遍历获取到的所有符合条件的文件
		for (File f : files) {
			System.out.println(f);
		}
	}
}

自定类继承FilenameFilter过滤器接口:

//文件过滤器
class FileFileterByDir implements FileFilter{
	public boolean accept(File pathname) {
		return pathname.isDirectory();
	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值