13-IO流
13—IO流
1. File类的使用
- java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关
- File能新建、删除、重命名文件和目录,但File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流
- 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录
- File对象可以作为参数传递给流的构造器
1.1 常用构造器
public File(String pathname)
以pathname为路径创建File对象,可以是绝对路径或相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
- 绝对路径:是一个固定的路径,从盘符开始
- 相对路径:是相对于某个位置开始
public File(String parent, String child)
以parent为父路径,child为子路径创建File对象
public File(File parent, String child)
根据一个父File对象和子文件路径创建File对象
路径中的每级目录之间用一个路径分隔符隔开
路径分隔符和系统有关:
- Windows和Dos系统默认使用”\“来表示
- UNIX和URL使用”/“来表示
Java程序支持跨平台使用,因此路径分隔符要慎用
为了解决这个隐患,File类提供了一个常量:
public static final String separator。根据操作系统,动态提供分隔符
举例:
1
2
3File file1 = new File("d:\\Files\\index.txt");
File file2 = new File("d:"+File.separator+"Files"+File.separator+"index.txt");
File files = new File("d:/Files/index.txt");
1.2 常用方法
File类的获取功能
- public String getAbsolutePath():获取绝对路径
- public String getPath():获取路径
- public String getName():获取名称
- public String getParent():获取上层文件路径。若无,返回null
- public long length():获取文件长度(即:字节数)。不能获取目录的长度
- public long lastModified():获取最后一次的修改时间,毫秒值
- public String[] list():获取指定目录下的所有文件或文件目录的名称数组
- public File[] listFiles():获取指定目录下的所有文件或者文件目录的File数组
File类的重命名功能
- public boolean renameTo(File dest):把文件重命名为指定的文件路径
File类的判断功能
- public boolean isDirectory():判断是否是文件目录
- public boolean isFile():判断是否是文件
- public boolean exists():判断是否存在
- public boolean canRead():判断是否可读
- public boolean canWrite():判断是否可写
- public boolean isHidden():判断是否隐藏
File类的创建功能
- public boolean creatNewFile():创建文件。若文件存在,则不创建,返回false
- public boolean mkdir():创建文件目录,如果此文件目录存在,就不创建了。如果此文件目录的上次目录不存在,也不创建
- public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建
注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下
File类的删除功能
public boolean delete():删除文件或文件夹
删除注意事项:Java中的删除不走回收站
要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19File dir1 = new File("D:/IOTest/dir1");
if (!dir1.exists()) { // 如果D:/IOTest/dir1不存在,就创建为目录
dir1.mkdir();
}
// 创建以dir1为父目录,名为"dir2"的File对象
File dir2 = new File(dir1, "dir2");
if (!dir2.exists()) { // 如果还不存在,就创建为目录
dir2.mkdirs();
}
File dir4 = new File(dir1, "dir3/dir4");
if (!dir4.exists()) {
dir4.mkdirs();
}
// 创建以dir2为父目录,名为"test.txt"的File对象
File file = new File(dir2, "test.txt");
if (!file.exists()) { // 如果还不存在,就创建为文件
file.createNewFile();
}
练习
1 | package File类的使用; |
2. IO流原理及流的分类
2.1 Java IO原理
- I/O是Input/Ouput的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等
- Java程序中,对于数据的输入/输出操作以”流(stream)“的方式进行
- java.io包下提供了各种”流“类和几口,用以获取不同种类的数据,并通过标准的方法输入或输出数据
- 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
- 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中

2.2 流的分类
- 按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
- 按数据流的流向不同分为:输入流,输出流
- 按流的角色不同分为:节点流,处理流
| (抽象基类) | 字节流 | 字符流 |
|---|---|---|
| 输入流 | InputStream | Reader |
| 输出流 | OutputStream | Writer |
- Java的IO流共涉及40多个类,实际上非常规则,都是从如下四个抽象基类派生的
- 由这四个类派生出来的子类名称都是以其父类名作为子类名后缀
- IO流体系
| 分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
|---|---|---|---|---|
| 抽象基类 | InputStream | OutputStream | Reader | Writer |
| 访问文件 | FileInputStream | FileOutputStream | FileReader | FileWiter |
| 访问数组 | ByteArayInputStream | ByteArrayOutputStream | CharArrayRead | CharArrayWrite |
| 访问管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWrite |
| 访问字符串 | StringReader | StringWriter | ||
| 缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
| 转换流 | InputStreamReader | OutputStreamWriter | ||
| 对象流 | ObjectInputStream | ObjectOutputStream | ||
| FilterInputStream | FilterOutputStream | FilterReader | FilterWriter | |
| 打印流 | PrintStream | PrintWriter | ||
| 推回输入流 | PushbackInputStream | PushbackReader | ||
| 特殊流 | DataInputStream | DataOutputStream |
2.3 节点流和处理流
节点流:直接从数据源或目的地读取数据

处理流:不直接连接到数据源或目的地,而是”连接“在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更加强大的读写功能

2.4 InputStram & Reader
- InputStream和Reader是所有输入流的基类
- InputStream(典型实现:FileInputStream)
- int read()
- int read(byte[] b)
- int read(byte[] b, int off, int len)
- Reader(典型实现:FileRead)
- int read()
- int read(char[] c)
- int read(char[] c, int off, int len)
- 程序中打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显示的关闭文件IO资源
- FileInputStream从文件系统中的某个文件中获得输入字节。FileInputStream用于读取非文本数据之间的原始字节流。要读取字符流,需要使用FileReader
2.4.1 InptuStream
int read()
从输入流中读取数据的下一字节。返回0-255返回内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回-1
int read(byte[] b)
从此输入流中将最多b.length个字节的数据读入下一个byte数组中。如果因已经到达流末尾而没有可用的字节,则返回-1。否则以整数形式返回实际读取的字节数
int read(byte[] b, int off, int len)
将输入流中最多len个数据字节读入byte数组。尝试读取len个字节,但读取的字节也可能小于该值。以整数形式返沪实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回-1
public void close() throws IOException
关闭此输入流并释放与该流相关联的所有系统资源
2.4.2 Reader
int read()
读取单个字符。作为整数读取的字符,返回在0到65535之间(0x00-0xffff)(两个字节码的Unicode码),如果已经到达流的末尾,则返回-1
int read(char[] cbuf)
将字符读入数组,如果已经到流的末尾,则返回-1,否则返回本次读取的字符数
int read(char[] cbuf, int off, int len)
将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读取len个字符。如果已经到达流的末尾,则返回-1 。否则返回本次读取的字符数
public void close() throws IOExecption
关闭此输入流并释放与该流关联的所有系统资源
2.5 OutputSream & Writer
OutputStream和Write也非常相似
- void write(int b/int c)
- void write(byte[] b/char[] cbuf)
- void write(byte[] b/char[] buff, int off, int len)
- void flush()
- void close() 需要先刷新再关闭此流
因为字符流直接以字符为操作单位,所以Write可以用字符串来替换字符数组,即以String对象作为参数
void write(String str)
void write(String str, int off, int len)
FileOutputStream从文件系统中的某个文件中获得输出字节。FileOutputStream用于写出非文本数据之类的原始字节流。要写出字符流。需要使用FileWrite
2.5.1 OutputStream
void write(int b)
将指定的字节写入此输入流。write的常规协定是:向输出流写入一个字节。要写入的字节是参数b的低八位。b的24个高位将被忽略。即写入0-255范围
void write(byte[] b)
将b.length个字节从指定的byte数组写入此输入流。write(b)的常规协定是:应该与调用write(b,0,b.length)的效果完全相同
void write(byte[] b, int off, int len)
将指定byte数组中从偏移量off开始的len个字节写入此输入流
public void flush() throws IOException
刷新此输入流并强制写出所哟缓冲的输出字节,调用此方法指示应将这些字节立即写入他们预期的目标
public void close() throws IOException
关闭此输出流并释放与该流关联的所有系统资源
2.5.2 Write
void write(int c)
写入单个字符。要写入的字符包含再给定数值的16个低位中,16个高位被忽略。即写入0-65535之间的Unicode码
void write(char[] cbuf)
写入字符数组
void write(char[] cbuf, int off, int len)
写入字符串的某一部分
void flush()
刷新该流的缓冲,则立即将他们写入预期目标
public void close() throws IOException
关闭此输入流并释放与该流关联的所有系统资源
3.节点流(或流文件)
3.1 读取文件
1 | 1. 建立一个流对象,将已存在的文件加载进流 |
1 | FileReader fr = null; |
3.2 写入文件
1 | 1.创建流对象,建立数据存放文件 |
1 | FileWrite fw = null; |
3.3 注意点
- 定义文件路径时,可以用”/“或”//“
- 在写入一个文件时,如果使用构造器FileOutputStrean(file),则目录下有同名文件将被覆盖
- 如果使用构造器FileOutputStream(file, true),则目录下的同名文件不会被覆盖,在文件内容末尾追加内容
- 在读取文件时,必须保证该文件以存在,否则报异常
- 字节流操作字节,比如:.mp3,.avi, .rmvb, .mp4, .jpg, .doc, .ppt
- 字符流操作字符,只能操作普通文本文件。最常见的文本文件:.txt, .java, .c, .cpp等语言的源代码。尤其注意.doc, .excel, .ppt这些不是文本文件
4. 缓冲流
为了提高数据的读写速度,Java API提供了带缓冲功能的流类,在使用这些流时,会创建一个内部缓冲数组,缺省使用8192个字节(8Kb)的缓冲区
1
2
3public class BufferedInputStream extends FilterInputStream{
private static int DEFALUT_BUFFER_SIZE = 8192;
}缓冲流要”套接“在相应的节点流之上,根据数据操作单位可以把缓冲流分为:
- BufferedInputStream和BufferedOutputStream
- BufferedReader和BufferedWriter
当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区
当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个(8Kb)存在缓冲区中,直到缓冲区满了,才重新从文件中读取下一个8192个字节数组
向流中写入字节时,不会直接写到文件,先写道缓冲区中直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区内的内容全部写到输入流
关闭流的顺序和打开流的顺序相反。只要关闭最外层的流即可,关闭最外层流也会相应关闭内层节点流
flush()方法的使用:手动将buffer中内容写入文件
如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭以后不能再写出

1 | BufferedReader br = null; |
5. 转换流
- 转换流提供了再字节流和字符流之间的转换
- Java API提供了两个转换流
- InputStreamReader:将InputStream转化为Reader
- OutputStreamWriter:将OutputStream转换为Writer
- 字节流中的数据都是字符时,转换成字符流操作更高效
- 很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能
5.1 InputStreamReader
实现将字节的输入流按指定字符集转化为字符的输入流
需要和InputStream”套接”
构造器
public InputStreamReader(InputStream in)
public InputStreamReader(InputStream in, String charsetName)
如:Reader isr = new InputStreamRead(System.in, “gbk”);
5.2 OutputStreamWriter
- 实现将字符的输入流按指定字符集转化为字节的输出流
- 需要实现和OutputStream”套接“
- 构造器
- public OutputStreamWriter(OutputStream out)
- public OutputStreamWriter(OutputSream out, String charsetName)
1 | public void testMyInput() throws Exception{ |
5.3 补充:字符编码
编码表的由来
计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让他可以识别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表。这就是常见的编码表
常见编码表
ASCII:美国标准信息交换码
用一个字节的7位可以表示
ISO8859-1:拉丁码表。欧洲码表
用一个字节的8位表示
GB2312:中国的中文编码表。最多两个字节编码所有字符
GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码
Unicode:国际标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的字符码。所有的文字都用两个字节来表示
UTF-8:变长的编码方式,可用1-4个字节表示一个字符

1 | 在Unicode出现之前,所有的字符集都是和具体编码方案绑定在一起的(即字符集≈编码方式),都是直接将字符和最终字节流绑定死了。 |
Unicode不完美,这里就有三个问题,一个是,我们已经知道英文字母子要一个字节表示就够了,第二个问题是如何才能区别Unicode和ASCII?计算机怎么知道两个字节表示一个符号,而不是分别表示两个符号呢?第三个,如果GBK等双字节编码方式一样,用最高位是1或0表示两个字节和一个字节,就少了很多值无法用于表示字符,不够表示所有字符。Unicode在很长一段时间内无法推广,知道互联网的出现
面向传输的众多UTF(USC Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界所有的文化字符了
Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐的Unicode编码是UTF-8和UTF-16


编码:字符串–>字节数组
解码:字节数组–>字符串
转化流的编码应用
- 可以将字符按指定编码格式存储
- 可以对文本数据按指定编码格式来解读
- 指定编码表的动作由构造器完成
6. 标准输入输出流
- System.in和System.out分别代表了系统标准的输入和输出设备
- 默认输入设备是:键盘。输出设备是:显示器
- System.in的类型是InputStream
- System.out的类型是PrintStream,其是OutputStream的子类FilterOutputStream的子类
- 重定向:通过System类的setIn,setOut方法对默认设备进行改变
- public static void setIn(InputStream in)
- public static void setOut(PrintStream out)
题目:
从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后继续 进行输入操作,直至当输入“e”或者“exit”时,退出程序。
1 | System.out.println("请输入信息(退出输入e或者exit):"); |
7. 打印流
- 实现将基本数据类型的数据格式转化为字符串输出
- 打印流:PrintStream和PrintWriter
- 提供了一系列的重载的print()和println()方法,用于多种数据类型的输出
- PrintStream和PrintWriter的输出不会抛出IOException异常
- PrintStream和PrintWriter有自动flush功能
- PrintStream打印的所有字符都使用平台默认的字符编码转化为字节。在需要写入的字符而不是写入字节的情况下应该使用PrintWriter类
- System.out返回的是PrintStream的实例
1 | PrintStream ps = null; |
8. 数据流
为了方便地操作Java语言的基本上数据类型和String的数据,可以使用数据流
数据流有两类:(用于读取和写出的基本数据类型、String类的数据)
- DataInputStream和DataOutputStream
- 分别“套接”在InputStream和OutputStream子类的流上
DataInputStream中的方法
boolean readBoolean() byte readByte()
char readChar() float readFloat()
double readDouble() short readShort()
long readLong() int readInt()
String readUTF() void readFully(byte[] b)
DataOutputStream中的方法
- 将上述的方法的read改为相应的write即可
1 | DataOutputStream dos = null; |
1 | DateInputStream dis = null; |
9. 对象流
- ObjectInputStream和ObjectOutputStream
- 用于存储读取基本数据类型数据或对象的处理流。它可以把Java中的对象写到数据源中,也能把对象从数据源中还原出来
- 序列化:用ObjectOutputStream类保存基本数据类型数据或对象的机制
- 反序列化:用ObjectInputStream类读取基本数据类型数据或对象的机制
- ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
- 对象序列化机制允许把内存中的Java对象转换成为平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其他程序获取了这种二进制流,就可以恢复成原来的Java对象
- 序列化的好处在于可以将任何实现了Serializable接口的对象转化为字节数据,使其保存和传输时可以被还原
- 序列化是RMI(Remote Method Invoke - 远程方法调用)过程的参数和返回值都必须实现的机制,而RMI是JavaEE的基础。因此序列化机制是JavaEE平台的基础
- 如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一。否则,会抛出NotSerializableExceotion异常
- Serializable
- Externalizable
- 凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:
- private static final long serialVersionUID;
- serialVersionUID用来表明类的不同版本间的兼容性。简而言之,其目的是以序列化对象进行版本控制,有关个版本反序列化时是否兼容
- 如果类没有显示定义这个静态常量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的实例变量做了修改,serialVersionUID可能发生变化。故建议显示声明
- 简单来说,Java的序列化机制是通过在运行是判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVresionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException)
- 若某个类实现类Serializable接口,该类就是可序列化的:
- 创建一个ObjectOutputStream
- 调用ObjectOutputStream对象的writeObject(对象)方法输出可序列化的对象
- 注意写出一次,操作一次flush()一次
- 反序列化
- 创建一个ObjectInputStream
- 调用readObjec()方法读取流中的对象
- 强调:如果某个类的属性不是基本数据类型或String类型,而是另一个引用类型,那么这个引用类型必须是可序列化的,否则拥有该类型的Field的类不能序列化
//序列化:将对象写入到磁盘或者进行网络传输
//要求对象必须实现序列化
1 | ObjectOutputSream oos = new ObjectOutputStream(new FileOutputStream("data.txt"));Person p = new Person("xiong",23,"花江",new Pet());oos.writeObject(p);oos.flush();oos.close(); |
//反序列化:将磁盘中的对象数据源读出
1 | ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.txt"));Person p1 = (Person)ois.readObject();System.out.println(p1.toString());ois.close(); |
1 | 谈谈对java.io.Serializable接口的理解,我们知道它用于序列化,还是空方法接口,还有其他认识吗?实现了Serializable接口的对象,可将它们转化成一系列字节,并可以在以后完全恢复回来原来的样子。这一过程亦可以通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异,换句话说,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。不必关心数据在不同机器上如何表示,也不必关心字节的顺序或者其他任何细节 由于大部分作为参数的类如String、Integer等都实现了java.io.Serializable的接口,也可以利用多态的性质,作为参数使接口更灵活 |
10. 随机存取文件流
10.1 RandomAccessFile类
- RandomAccessFile声明在java.io包下,但直接继承于java.lang.Object类。并且它实现了DateInput、DataOutput这两个接口,也就意味着这个类既可以读又可以写
- RandomAccessFile类支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读、写文件
- 支持只访问部分内容
- 可以向已存在的文件后追加内容
- RandomAccessFile对象包括记录指针,用以标识当前读写处的位置。RandomAccessFile类对象可以自由移动记录指针:
- long getFilePointer():获取文件记录指针当前位置
- void seek(long pos):将文件记录指针定位到pos位置
- 构造器
- public RandomAccessFile(File file, String mode)
- public RandomAccessFile(String name, String mode)
- 创建RandomAccesFile类的实例需要指定一个mode参数,该参数指定RandomAccessFile的访问模式:
- r:以只读的方式打开
- rw:打开以便读取和写入
- rwd:打开以便读取和写入;同步文件内容的更新
- rws:打开以便读取和写入;同步文件内容和元数据的更新
- 如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。如果模式为rw读写,如果文件不存在则会去创建文件,如果存在则不会创建
1 | 我们可以用RandomAccessFile这个类,来实现一个多线程断点下载的功能,用过下载工具的朋友们都知道,下载前都会建立两个临时文件,一个是与被下载文件大小相同的空文件,另一个是记录文件指针的位置文件,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上一次的地方下载,从而实现断点下载或上传的功能 |
读取文件
1 | RandomAcessFile raf = new RandomAccessFile("test.txt", "rw"); |
写入文件
1 | RandomAccessFile raf = new RandomAccessFile("test.txt","rw"); |
11. NIO.2中Path、Paths、Files类的使用
11.1 NIO.2
Java NIO(New IO, Non-Blocking IO)是从Java1.4版本开始引入的一套新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面型流的)、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作
Java API中提供了两套NIO,一套是针对标准输入输出的NIO,另一套就是网络编程的NIO
|—–java.nio.channels.Channel
|—–FileChannel:处理本地文件
|—–SocketChannel:TCP网络编程的客户端的Channel
|—–ServerSocketChannel:TCP网络编程的服务器端的Channel
|—–DatagramChannel:UDP网络编程中发送端和接收端的Channel
随着JDK7的发布,Java对NIO进行了极大的扩展,增强了对文件处理和文件西永特性的支持,以至于我们称他们为NIO2.0。因为NIO提供的一些功能,NIO已经成为文件处理中越来越重要的部分
11.2 Path、Paths和Files核心API
早期的Java只提供一个File类来访问文件系统,但File类的功能都比较有限,所以提供的方法性能也不高。而且,大多数方法在出错时仅返回失败,并不会提供异常信息
NIO.2为了弥补这种不足,引入了Path接口,代表一个平台无关的平台路径,描述了目录结构中文件的位置。Path可以看成是File类的升级版,实际引用的资源也可以不存在
在以前IO操作都是这样写的:
import java.io.File;
File file = new File(“index.html”);
但在Java7中,我们可以这样写:
import java.nio.file.Path;
import java.nio.file.Paths;
Path path = Paths.get(“index.html”);
同时,NIO.2在java.nio.file包下还提供了Files、Paths工具类。Files包含了大量的静态工具方法来操作文件;Paths则包含了两个返回Path的静态工厂方法
Paths类提供的静态get()方法用来获取Path对象:
- static Path get(String first, String … more):用于将多个字符串连成路径
- static Path get(URI uri):返回指定uri对应的Path路径
11.3 Path接口
- Path常用方法:
- String toString():返回调用Path对象的字符串表示形式
- boolean startsWith(String path):判断是否以path路径开始
- boolean endsWith(String path) : 判断是否以 path 路径结束
- boolean isAbsolute() : 判断是否是绝对路径
- Path getParent() :返回Path对象包含整个路径,不包含 Path 对象指定的文件路径
- Path getRoot() :返回调用 Path 对象的根路径
- Path getFileName() : 返回与调用 Path 对象关联的文件名
- int getNameCount() : 返回Path 根目录后面元素的数量
- Path getName(int idx) : 返回指定索引位置 idx 的路径名称
- Path toAbsolutePath() : 作为绝对路径返回调用 Path 对象
- Path resolve(Path p) :合并两个路径,返回合并后的路径对应的Path对象
- File toFile(): 将Path转化为File类的对象
11.4 File类
- java.nio.file.Files用于操作文件或目录的工具类
- Files常用方法:
- Path copy(Path src, Path dest, CopyOption … how) : 文件的复制
- Path createDirectory(Path path, FileAttribute … attr) : 创建一个目录
- Path createFile(Path path, FileAttribute … arr) : 创建一个文件
- void delete(Path path) : 删除一个文件/目录,如果不存在,执行报错
- void deleteIfExists(Path path) : Path对应的文件/目录如果存在,执行删除
- Path move(Path src, Path dest, CopyOption…how) : 将 src 移动到 dest 位置
- long size(Path path) : 返回 path 指定文件的大小
- Files常用方法:用于判断
- boolean exists(Path path, LinkOption … opts) : 判断文件是否存在
- boolean isDirectory(Path path, LinkOption … opts) : 判断是否是目录
- boolean isRegularFile(Path path, LinkOption … opts) : 判断是否是文件
- boolean isHidden(Path path) : 判断是否是隐藏文件
- boolean isReadable(Path path) : 判断文件是否可读
- boolean isWritable(Path path) : 判断文件是否可写
- boolean notExists(Path path, LinkOption … opts) : 判断文件是否不存在
- Files常用方法:用于操作内容
- SeekableByteChannel newByteChannel(Path path, OpenOption…how) : 获取与指定文件的连接,how 指定打开方式。
- DirectoryStream newDirectoryStream(Path path) : 打开 path 指定的目录
- InputStream newInputStream(Path path, OpenOption…how):获取 InputStream 对象
- OutputStream newOutputStream(Path path, OpenOption…how) : 获取 OutputStream 对象