20201013+袁鑫

学习日志:

知识总结

File类

java.io.File 类是文件和目录 路径名 的抽象表示,主要用于文件和目录的创建、查找和删除等操 作。

Java虚拟机中的一个 File 实例表示一个路径,这个路径可能对应一个文件或一个目录 。

File 类的实例所表示的路径,可能存在于磁盘上,也可能在磁盘上根本不存在。

File 类是不可变的; 也就是说,一旦创建,由 File 对象表示的抽象路径名永远不会改变。

File类提供了用于操作文件或目录的方法,但并不支持访问文件的内容。

访问文件中的内容,需要通过文件输入流来实现。

image-20201013210209188

不同的系统平台下,这四个常量的取值也不相同

  • 在windows平台下
    • pathSeparator 和 pathSeparatorChar 对应的是 ;
    • separator 和 separatorChar 对应的是 \
  • Unix / Linux / OS X 平台下
    • pathSeparator 和 pathSeparatorChar 对应的是 :
    • separator 和 separatorChar 对应的是 /

Windows 下文件路径各层级之间使用 \ 分隔,在代码中 \ 需要转义(使用 \ 转义),当然还有另外 一种方法来分隔,就是使用 / 来分隔。

构造方法

image-20201013210449761

实例方法

判断是否存在
public boolean exists()
//当File实例所表示的路径在磁盘上存在时返回true否则返回false。
判断是否是文件
public boolean isFile()
//当File实例所表示的路径在磁盘上存在并且是个文件时返回true否则返回false。
判断是否是目录
public boolean isDirectory()
//当File实例所表示的路径在磁盘上存在并且是个目录时返回true否则返回false。
判断是否是隐藏文件
public boolean isHidden()
//当File实例所表示的路径是个隐藏目录或隐藏文件时返回true否则返回false。
判断是否是绝对路径

绝对路径:从根路径开始的路径

相对路径:相对于文件本身的路径

public boolean isAbsolute()
//当File实例所表示的路径是绝对路径时返回true否则返回false。
获取路径及名称
public String getName()

同时也提供了获取File实例所表示路径的方法(以字符串形式返回):

public String getPath()
获取访问时间
public long lastModified()
//File类提供了获取文件或目录最后修改时间(以毫秒计)的方法:
获取文件长度
public long length()
//当 File 实例所表示的路径在磁盘上存在,并且是个文件时,可以通过 length 方法来获取文件的长度(体积):

该方法所返回的文件长度以字节为单位。

如果File实例所表示的路径是一个目录,则返回值是不确定的。

如果File实例所表示的路径在磁盘上是不存在,则返回0L 。

获取项目列表

File类提供了获取指定目录中所包含的子目录和文件列表的方法:

获取File实例所表示路径对应的目录中所有子目录名称及文件名称组成的数组

public String[] list()

获取File实例所表示的目录内所有目录和文件对应的File数组

public File[] listFiles()
获取父路径

File类提供了用于获取File实例所表示路径的上级路径的方法:

以字符串形式返回当前路径的上一级路径

public String getParent()

获取当前路径的上一级路径对应的File实例

public File getParentFile()
获取绝对路径

如果创建 File 实例时采用的是 相对路径 ,则可以通过以下方法来获取它所对应的 绝对路径 :

以字符串形式返回File实例所表示路径的绝对路径

public String getAbsolutePath()

获取 File 实例所表示的相对路径对应的绝对路径并返回该绝对路径对应的File实例

public File getAbsoluteFile()
获取规范路径

File实例提供了获取指定路径的 规范路径名 的方法:

以字符串形式返回File实例所表示路径的的规范路径名

public String getCanonicalPath() throws IOException

获取File实例所表示路径的 规范形式

public File getCanonicalFile() throws IOException
获取权限

File类提供了获取和设置文件或目录权限的方法,这里仅列举获取权限的方法:

测试应用程序是否可以读取抽象路径名表示的文件或目录

public boolean canRead()
//测试应用程序是否可以修改抽象路径名表示的文件或目录
public boolean canWrite()
//测试应用程序是否可以修改抽象路径名表示的文件或目录
public boolean canExecute()
//测试应用程序是否可以执行抽象路径名表示的文件
创建目录

File类中提供了用于创建新目录的方法:

public boolean mkdir()
//在已经存在的目录中创建单个子目录

使用该方法创建目录时,必须保证新目录的父目录是存在的,并且当前操作系统用户对该目录拥有写权限。

public boolean mkdirs()
    //创建多层次的目录

当被创建目录的父目录不存在时,可以通过该方法来先创建父目录后再创建子目录。

创建文件

File类中也提供了用于创建新文件的方法:

public boolean createNewFile() throws IOException
//当当前用户(操作系统用户)拥有对指定目录的写权限时,可以通过createNewFile方法在该目录中创建空文件。

如果文件的路径不存在,创建文件时会抛出 java.io.IOException:系统找不到指定的路径 ,创建文件前 要先确认路径是否存在。

重命名目录或文件
public boolean renameTo( File destination )
    //File类提供了对目录或文件进行重命名的方法:
//File类型的参数表示 新文件名称 对应的路径
//当且仅当重命名成功时,返回 true ;否则返回 false
//当 新文件名称 和原来文件的路径不一样时表示移动文件

删除目录或文件
public boolean delete()
//删除指定File实例所表示路径对应的文件或目录

当且仅当成功删除文件或目录时 返回 true 否则返回 false 。

public void deleteOnExit()
//当 JVM 终止时再删除指定File实例所表示路径对应的文件或目录

与 delete 方法不同, deleteOnExit 方法不是立即删除文件或目录,而是在 JVM 终止时才删除。

获取硬盘空间
public long getTotalSpace()
//获取抽象路径名所在分区的大小
public long getFreeSpace()
//获取抽象路径名所在分区中未分配的字节数
public long getUsableSpace()
//获取抽象路径名所在分区上可用于当前虚拟机的字节数
获取字符串形式

File类重写了从Object类继承的toString方法,用于获取File实例所表示路径的字符串形式,该字符串就 是 getPath() 方法返回的字符串。

比较File实例

尽管 File 类重写了 equals 方法,但除非两个 File 实例对应的路径完全相同 在 equals 方法中判断的是自然比较的结果是不是 0 ,如果为 0 返回 true 在自然比较中实际是在比较两个 File 实例 getPath() 值的忽略大小写比较

文件过滤器

在 java.io 包中提供了用于对文件或目录进行过滤的接口:

  • java.io.FilenameFilter
  • java.io.FileFilter

结合File类提供的方法可以实现对文件或目录的过滤:

public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
public File[] listFiles(FileFilter filter)
FilenameFilter

通过 FilenameFilter 接口的实现类的实例可实现根据文件或目录名称对文件或目录进行过滤。

FilenameFilter 接口中定义了一个 accept 方法用于实现对文件或目录的过滤:

boolean accept(File dir, String name)

在 accept 方法的参数中:

  • 第一个File类型参数类型的参数表示被筛选的文件或目录所在的目录
  • 第二个String类型的参数表示被筛选的文件或目录的名称

仅当 accept 方法返回 true 时,被筛选的文件会被保留在筛选后的文件列表中。

FilenameFilter fileter = new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.indexOf(".txt") >= 0;
    }
};
    File file = new File("d:/temp");
    //所有的文件
    String[] strs = file.list();
    //过滤后的文件
    String[] fileNames = file.list(fileter);


FileFilter

通过 FileFilter 接口的实现类的实例可实现对文件或目录的过滤,不仅可以通过文件名称或目录名称 过滤,也可以通过文件长度(体积)、访问时间等属性来过滤。

FileFilter 接口中定义了一个 accept 方法用于实现对文件或目录的过滤:

boolean accept(File fod)
  • File 类型的参数表示被筛选的文件或目录
  • 仅当 accept 方法返回 true 时,被筛选的文件或目录会保留在筛选后的列表中

流(Stream)

为了能够 读取文件中的内容 或者 向文件中写入内容 ,就需要用到文件输入流或文件输出流,

在 Java语言中,将够读取数据或者写出数据的对象抽象为流。

流类似于生活当中的水管,水可以在水管中定向移动,正如数据可以在流中定向移动。

我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入 input 和 输出 output ,即流向内存是输入流,流出内存的输出流。

Java中 I/O 操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出 也叫做作写出数据。

在 Java 传统的 IO 体系中,所有的 流 对应的类型都扩展自四个抽象类:

image-20201013215714391

其中的 InputStream 和 OutputStream 的子类表示字节流, Reader 和 Writer 的子类则表示字符 流。

这里所提及的 Stream 一词均表示流,请不要与 java.util.stream.Stream 接口混为一谈。

分类

Java中传统的I/O体系可以按照不同的方式对流进行分类:

  • 按照流中数据的流向来分类,可以分为 输入流输出流

    • 用于实现从外部读取数据到当前程序的流被称作输入流
    • 用于实现从当前程序中向外部输出数据的流被称作输出流
  • 按照流处理的数据单元来分类,可以划分为 字节流字符流

    • 如果某个流在读取或写入数据时以字节为单位,则该流属于字节流
    • 如果某个流在读取或写入数据时以字符为单位,则该流属于字符流

    一个字符有可能是1个字节,也可能是2个、3个、4个字节,这取决于字符编码

  • 按照流的功能来分类,可以分为 节点流包装流

    • 直接数据节点中读取数据或向数据节点中写入数据的流被称作节点流
    • 数据节点可以是磁盘上的文件或其它数据源(比如键盘输入)
    • 节点流都比较原始,仅用于实现数据的读取和写入,通常不具备其它功能
    • 用于从其它流中读取数据,并实现其它流所不具备的功能的流,被称作包装流
    • 包装流也被称作 转换流 或 处理流 或 过滤流
    • 包装流通常会提供它内部所包装的流不具备的功能
    • 包装流内部所处理的流(也称作所过滤的流)被称作底层支持流
Closeable

java.io.Closeable 接口,实现此接口的都是可以关闭的数据的源或目的地。都会实现 close() 方 法。如: Scanner , InputStream , OutputStream .

该类继承了 java.lang.AutoCloseable , AutoCloseable 接口提供了自动关闭的能力。


字节输入流

InputStream 类是所有表示字节输入流的类的父类,它是个抽象类,因此不能被实例化。

public abstract class InputStream implements Closeable

InputStream 类是所有字节输入流的最顶层父类,掌握该类的使用即可从根本上把握其它字节输入流 的使用。

实例方法

image-20201013220558077

在所有方法中,仅 read() 方法是抽象方法,因此 InputStream 类的所有的子类都需要实现该方法。

因为 InputStream 类是个抽象类,因此必须借助于其 非抽象子类 来完成实例化。

FileInputStream

FileInputStream 用于从文件系统中的某个文件中读取内容(以字节为单位)。

FileInputStream 用于读取诸如图像数据之类的原始字节流。

构造方法

image-20201013220923151

其中较为常用的是前两个构造方法。

实例方法

FileInputStream 类重写了 InputStream 类中所有的 public 方法,但除了以下方法

public void reset() throws IOException
public void mark(int readlimit) throws IOException
public boolean markSupported() throws IOException

未被重写外,其它方法均已被 FileInputStream 类所重写,重写的方法包括:

public int available() throws IOException
public int read() throws IOException
public int read(byte[] bytes) throws IOException
public int read(byte[] bytes, int offset, int length) throws IOException
public long skip(long n) throws IOException
public void close() throws IOException
写入单个字节

FileOutputStream 类实现了从 OutputStream 类中所继承的抽象方法:

 public void write(int b) throws IOException
out.write(97);//将97对应的字节写入到输出流中
out.write('b'); //将字符b对应的字节写入到输出流中
写入多个字节

在 OutputStream 类中定义了两个用于输出多个字节的方法:

public void write(byte[] bytes) throws IOException
public void write(byte[] bytes, int offset, int length) throws IOException

public class OutputStreamTest2 {
    public static void main(String[] args) throws IOException {
        
        Charset charset = Charset.forName("GBK");//window记事本编码是GBK
        
        // 创建一个可以向指定 路径的文件中输出内容的 字节输出流
        
        OutputStream out = new FileOutputStream("D:/temp/output2.txt");
        
        String s = "今天天气好晴朗,处处好风光"; // 注意其中的逗号是中文的逗号
        
        System.out.println("字符串长度: " + s.length());//13
        
        byte[] bytes = s.getBytes(charset); // 使用 GBK 编码方案将字符串编码为字节序列
        
        System.out.println("字节数组长度 : " + bytes.length);//26 ,一个中文占2个字节
        
        // 将字节数组中的所有字节输出到控制台中
        System.out.println(Arrays.toString(bytes));
        
        out.write(bytes); // 将 bytes 数组中的所有字节都 写入 到 字节输出流中
        out.write(bytes, 20, 6); // 将 byte 数组中的索引20开始的6个字节写入到字节输出流
        // 关闭流
        out.close();
        }
}

心得:

今天学习的东西还能接受,要注意的可能就是方法的使用上面, 方法有点多,很容易就记混了,需要多做练习巩固对他们的差别的认知。

标签

评论