Java学习笔记_06_File类与IO流
Java学习笔记_06_File类与IO流
1.File类
- 概述:java.io.File类是文件和目录路径名的抽象表示形式。主要用于文件和目录的创建、查找和删除等操作
1.1 常用方法
- File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
- 其方法大致可以分为三类(包含以下关键词):file(与文件相关的方法)、directory(与文件夹/目录相关的方法)、path(与路径相关的方法)
1.1.1静态成员
-
public static final String pathSeparator:与系统有关的路径分隔符,为了方便,它被表示为一个字符串(windows是;linux是:)
-
public static final String separator:与系统有关的默认文件名称分隔符(windows:反斜杠\ linux:正斜杠/)
-
public static final char pathSeparatorChar:与系统有关的路径分隔符
-
public static final char separatorChar:与系统有关的默认名称分隔符
这里我们在写操作路径的时候要注意,千万别写死了,因为操作系统的缘故
1.1.2构造方法
- public File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
- 创建File对象只是把字符串路径(pathname)封装为File对象,不考虑路径的真假情况(即pathname可以为空),重写了toString方法
- public File(String parent,String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例
- 好处:父路径与子路径可以单独书写,使用灵活;子、父路径都可以变化
- public File(File parent, String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例
- 好处:父路径与子路径可以单独书写,使用灵活;子、父路径都可以变化;父路径是File类型,可以使用File类中的方法对路径进行一些操作
1.1.3常用获取方法
这里将File类的方法进行了功能上的分类,先介绍常用的获取方法
- public String getAbsolutePath():返回此File的绝对路径名字符串
- public String getPath():将此File转换为一个路径名字符串(File类重写了toString方法,其实就是调用了getPath()方法)file写的是什么,就获取什么路径
- public String getName():返回由此File表示的文件或目录的名称(就是获取构造方法传递路径的结尾部分)
- public long length():返回由此File表示的文件的长度(获取的是构造方法指定的文件的大小,以字节为单位)
- 注意:
文件夹是没有大小概念的,不能获取文件夹的大小
如果构造方法中给出的路径不存在,那么length方法返回0
- 注意:
1.1.4常用判断方法
- public boolean exists():判断此File表示的文件或目录是否存在(判断路径是否存在)
- public boolean isDirectory():判断此File表示的文件是否是一个目录(判断给定的路径是否以文件夹结尾)
- public boolean isFile():判断此File表示的文件是否是一个标准文件(判断给定的路径是否以文件结尾)
- 电脑硬盘中只有文件夹/文件,即isFile和isDirectory是互斥的方法,当前互斥前提是给定路径存在
1.1.5常用增删方法
-
public boolean createNewFile() throws IOException:当且仅当不存在具有此File指定名称的文件时,创建一个新的空文件
- 注意:此方法只能创建文件,且创建文件的路径必须存在(否则会抛出异常)
- 返回值:如果文件不存在,创建文件,并返回true
如果文件存在,不会创建,并返回false
-
public boolean delete():删除由此File表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除
-
返回值:
true:文件/文件夹删除成功 false:文件夹中有内容,不会删除;构造方法中路径不存在
-
注意:此方法是直接在硬盘中删除文件/文件夹,不走回收站,删除要谨慎
-
-
public boolean mkdir():创建由此File指定的目录(只能创建单级空文件夹)
- 返回值参考creatNewFile方法
-
public boolean mkdirs():创建由此File指定的目录,包括所有必需但不存在的父目录(即可创建单级空文件夹,也可创建多级)
- 返回值参考creatNewFile方法
1.1.6常用遍历方法
-
public String[] list():返回一个字符串数组,表示该File目录中的所有子文件或目录
-
public File[] listFiles():返回一个File数组,表示该File目录中所有的子文件或目录
-
注意:
list方法和listFiles方法遍历的是构造方法中给出的目录,如果构造方法中给出的目录的路径不存在,会抛出空指针异常;如果构造方法中给出的路径不是一个目录也会抛出空指针异常 -
public File[] listFiles(FileFilter filter):
-
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。
作用:用来过滤文件的方法
抽象方法:用来过滤文件的方法
boolean accept(File pathname):测试指定抽象路径名是否应该包含在某个路径名列表中
参数:File pathname:就是使用listFiles方法遍历目录得到的每一个文件对象
-
-
public File[] listFiles(FilenameFilter filter)
-
java.io.FilenameFilter接口:用于过滤器文件名
抽象方法:boolean accept(File dir, String name)
参数:
File dir:构造方法中传递的被遍历的目录
String name:使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称
-
-
注意:两个过滤器接口是没有实现类的,需要我们自己重写实现类,重写过滤的方法accept方法,自定义过滤规则
1.2 相对路径和绝对路径
-
路径分为绝对路径与相对路径
-
绝对路径:是一个完整的路径
以盘符(c:,D:)开始的路径,如 c:\\a.txt
D:\\CODE\\JavaCode\\JavaSE\\基础语法\\123.txt -
相对路径:是一个简化的路径
相对指的是相对于当前项目的根目录( D:\\CODE\\JavaCode\\JavaSE\\基础语法)
如果使用当前项目的根目录,路径可以简化写成D:\\CODE\\JavaCode\\JavaSE\\基础语法\\123.txt ==>简化为:123.txt(可以省略根目录)
-
注意:
- 路径不区分大小写
- 路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠
-
2.IO流-字节流
先用一张图来大致了解下IO流分类
2.1字节流
说在前面:一切皆为字节。即一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都是一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。因为我们在操作流的时候,无论使用什么样的流对象,其底层传输的始终未二进制数据
2.2字节输出流
- java.io.OutputStream:字节输出流,此抽象类是表示输出字节流的所有类的超类
- 成员方法:
- public void close():关闭此输出流并释放与此流有关的所有系统资源
- public void flush():刷新此输出流并强制写出所有缓冲的输出字节
- public void write(byte[] b):将 b.length 个字节从指定的 byte 数组写入此输出流
- public void write(byte[] b,int off,int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
- public abstract void write(int b):将指定的字节写入此输出流
2.3 文件字节输出流
因为OutputStream是抽象类,所以我们得使用其继承类来操作流对象
-
java.io.FileOutputStream extends OutputStream,其作业把内存中的数据写入到硬盘的文件中
-
常用构造方法:
-
public FileOutputStream(File file):创建一个向指定 File 对象表示的文件中写入数据的文件输出流
-
参数:(即写入数据的目的地)
File file:目的地是一个文件
-
-
public FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流
-
参数:(即写入数据的目的地)
String name:目的地是一个文件的路径
-
-
-
构造方法的作用
- 创建FileOutputStream流对象
- 会根据构造方法中传递的文件/文件路径,创建一个空的文件
- 会把FileOutputStream对象指向创建好的文件
-
写入方法
- public void write(int b):将指定字节写入此文件输出流
- public void write(byte[] b):将 b.length 个字节从指定 byte 数组写入此文件输出流中(一次写入多个字节)
- 如果写入的第一个字节是正数(0-127),那么显示的时候会查询ASCII表
- 如果写入的第一个字节是负数,那么第一个字节和第二个字节会组成一个中文显示,查询系统默认码表(GBK)
- public void write(byte[] b, int off,int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流
-
上面都是写入字符的,下面演示如何写入字符串
-
public byte[] getBytes():将字符串转换为字符数组
-
代码展示
package com.file; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; public class Demo01 { public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("D:\\CODE\\JavaCode\\JavaSE\\基础语法\\src\\com\\file\\a.txt"); byte[] bytes = "你好".getBytes(); fos.write(bytes); System.out.println(Arrays.toString(bytes)); fos.close();//流用完一定要记得释放 //下面步骤是即时删除刚才写入的测试文本,可以忽略 File file = new File("D:\\CODE\\JavaCode\\JavaSE\\基础语法\\src\\com\\file\\a.txt"); file.delete(); } }
-
-
数据的续写和换行写
续写
-
public FileOutputStream(File file,boolean append):创建一个向指定 File 对象表示的文件中写入数据的文件输出流
-
public FileOutputStream(String name,boolean append):创建一个向具有指定 name 的文件中写入数据的输出文件流
-
append为true创建对象不会覆盖原文件,继续在文件的末尾追加写数据
append为false,创建对象会覆盖源文件
换行即写换行符号
- windows:\r\n
- linux:/n
- mac:/r
-
2.4字节输入流
- java.io.InputStream:字节输入流,此抽象类是表示字节输入流的所有类的超类
- 成员方法
- public int read():从输入流中读取数据的下一个字节,读取到文件的末尾返回-1
- public int read(byte[] b):从输入流中读取一定量的字节,并将其存储在缓冲区数组b中(数组长度一般定义1024或其整数倍)
- 参数:数组起到缓冲作用
- 返回值:每次读取到的有效字节个数(-1仍为结束标识位)
- public void close():关闭此输出流并释放与此流有关的所有系统资源
2.5文件字节输入流
-
public class FileInputStream extends InputStream,其作用是把硬盘文件中的数据,读取到内存中使用
-
构造方法
-
public FileInputStream(File file)
-
public FileInputStream(String name)
-
参数:
File file:文件
String name:文件的路径
-
-
构造方法的作用
- 会创建一个FileInputStream对象
- 会把FileInputStream对象指向构造方法中要读取的文件
3.IO流-字符流
- 使用字节流读取中文时可能会读取中文不完整,从而产生乱码(和编码格式有关,GBK每个中文占两个字节,而UTF-8每个中文占3个字节),因此提供可字符流来以字符为单位读取数据,专门处理文本文件
3.1字符输入流
- java.io.Reader:字符输入流,此抽象类是字符输入流的最顶层的父类
- 成员方法
- public int read():读取单个字符
- public int read(char[] cbuf):一次读取多个字符,将字符读入数组(-1仍未结束标识符)
- void close():释放与之相关的流资源
3.2文件字符输入流
- java.io.FileReader:文件字符输入流,把硬盘文件中的数据以字符的方式读取到内存中
- 构造方法
- public FileReader(File file)
- public FileReader(String fileName)
- 参数:读取文件的数据源,具体参数同字节流
- 构造方法的作用
- 创建一个FileReader对象
- 会把FileReader对象指向要读取的文件
3.3字符输出流
- java.io.Writer,此抽象类是所有字符输出流的最顶层的父类
- 成员方法
- void write(char[] cbuf):写入字符数组
- void write(int c):写入单个字符
- void write(char[] cbuf, int off, int len):写入字符数组的某一部分
- void write(String str):写入字符串
- void write(String str, int off, int len):写入字符串的某一部分
- void flush():刷新该流的缓冲(可以继续使用流对象)
- void close():关闭此流,但要先刷新它(会刷新缓冲区,但是流对象不可继续使用)
3.4文件字符输出流
-
java.io.FileWriter:文件字符输出流,其作用是把内存中的数据写入到文件中
-
构造方法
- FileWriter(File file):根据给定的 File 对象构造一个 FileWriter 对象
- FileWriter(String fileName):根据给定的文件名构造一个 FileWriter 对象
- 参数:写入数据的目的地,具体参数同字节流
-
构造方法的作用
-
会创建一个FileWriter对象
-
会根据构造方法中传递的文件/文件的路径,创建文件
-
会把FileWriter对象指向创建好的文件
-
-
字节输出流的使用步骤(多了一步刷新的步骤)
- 创建FileWriter对象
- 使用FileWriter中的方法write,把数据写入到内存缓冲区
- 使用FileWriter中的方法flush,把内存缓存区的数据,刷新到文件中
- 释放资源(会先把内存缓冲区的数据刷新到文件中)
-
字符流的续写和换行和字节流用法相同,就不过多赘述了 -
流中异常的处理(这里可以把可能产生异常的代码选择,ctrl+alt+t直接try catch即可)
package com.stream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /* JDK7新特性 在try的后边可以增加一个(),在括号中可以定义流对象 那么这个流对象的作用域就在try中有效 try中的代码执行完毕,会自动把流对象释放,不用写finally 格式: try(定义流对象;定义流对象...){ 可能会产生异常的代码 }catch(异常类变量 变量名){ 异常的处理逻辑 } */ public class DemoException { public static void main(String[] args) { try { FileInputStream fis = new FileInputStream("d:\\a.txt"); FileOutputStream fos = new FileOutputStream("f:\\a.txt"); int len = 0; while ((len=fis.read())!=-1){ fos.write(len); } } catch (IOException e) { e.printStackTrace(); } } }