Java 笔记
异常与异常类
所谓异常 (exception) 是在程序运行过程中产生的使程序终止正常运行的错误对象,如数组下标越界、整数除法中零作除数、文件找不到等都可能使程序终止运行。
Java 语言的异常处理采用面向对象的方法,定义了多种异常类。 Java 异常类都是Throwable类的子类,是Object类的直接子类,定义在java.lang包中。Throwable类有两个子类,一个是Error类,另一个是 Exception类,这两个子类又分别有若干个子类.

Error类描述的是系统内部错误,这样的错误很少出现。如果发生了这类错误,则除了通知用户及终止程序外,几乎什么也不能做,程序中一般不对这类错误处理。
Exception类的子类一般又可分为两种类型:非检查异常和检查异常.
非检查异常
非检查异常 (unchecked exception) 是RuntimeException类及其子类异常,也称为运行时异常。
非检查异常是在程序运行时检测到的,可能发生在程序的任何地方且数量较大,因此编译器不对非检查异常(包括 Error类的子类)处理,这种异常又称免检异常。

程序运行时发生非检查异常时运行时系统会把异常对象交给默认的异常处理程序,在控制台显示异常的内容及发生异常的位置。
NullPointerException
ArithmeticException
ClassCastException
ArrayIndexOutOfBoundsException
NumberFormatException
…
检查异常
检查异常 (checked exception) 是除 RuntimeException类及其子类以外的异常类,有时也称为必检异常。对这类异常,程序必须捕获或声明抛出,否则编译不能通过。
IOException
ClassNotFoundException
NoSuchMethodException
…
异常处理
异常处理可分为下面几种:
- 使用 try-catch-finally 捕获并处理异常
- 通过 throws 子句声明抛出异常
- 用 throw 语句抛出异常
- 使用 try-with-resources 管理资源
异常都是在方法中产生的。方法运行过程中如果产生了异常,在这个方法中就生成一个代表该异常类的对象,并把它交给系统,运行时系统寻找相应的代码来处理该异常。这个过程称为抛出异常。运行时系统在方法的调用栈中查找,从产生异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止,这一过程称为捕获异常。

从发现异常的对象开始回溯, 直到找到处理异常的代码. 如果main方法中也没有处理异常的代码, 运行时系统将异常交给JVM, JVM将在控制台显示异常信息.
try catch finally
1 | try { |
若有多个catch块,异常类型的排列顺序必须按照从特殊到一般的顺序,即子类异常放在前面,父类异常放在后面,否则产生编译错误。
当try块中产生异常,运行时系统从上到下依次检测异常对象与哪个 catch块声明的异常类相匹配,若找到匹配的或其父类异常,就进入相应 catch块处理异常, catch 块执行完毕说明异常得到处理.
finally 块是可选项。异常的产生往往会中断应用程序的执行,而在异常产生前,可能有些资源未被释放。有时无论程序是否发生异常,都要执行一段代码,这时就可以通过 finally块实现。无论异常产生与否 finally块都会被执行。即使是使用了return语句,finally块也要被执行,除非catch块中调用了 System.exit()方法终止程序的运行
1 | public class Main { |
在异常类的根类 Throwable 中还定义了其他方法
public void printStackTrace() |
在标准错误输出流上输出异常调用栈的轨迹。 |
public String getMessage() |
返回异常对象的细节描述。 |
public void printStackTrace(PrintWriter s) |
在指定输出流上输出异常调用栈的轨迹。 |
public String toString() |
返回异常对象的简短描述,是Object类中同名方法的覆盖。 |
catch块中的异常可以是父类异常,另外 catch块中可以不写任何语句,只要有一对大括号,系统就认为异常被处理了,程序编译就不会出现错误,编译后程序正常运行。catch块内的语句只有在真的产生异常时才被执行.
1 | public class Main { |
throws
所有的异常都产生在方法(包括构造方法)内部的语句。有时方法中产生的异常不需要在该方法中处理,可能需要由该方法的调用方法处理,这时可以在声明方法时用 throws 子句声明抛出异常,将异常传递给调用该方法的方法处理。
1 | returnType methodName([paramlist]) throws ExceptionList{ |
1 | public class Main { |
子类可以覆盖父类的方法, 若父类的方法使用 throws 声明抛出了异常,子类方法也可以使用 throws 声明异常。但是要注意,子类方法抛出的异常必须是父类方法抛出的异常或子异常。
1 | class A { |
throw
可以创建一个异常对象,然后用 throw 语句抛出,或将捕获到的异常对象用 throw 语句再次抛出
throw throwableInstance;
throwableInstance 可以是用户创建的异常对象,也可以是程序捕获到的异常对象,该实例必须是Throwable类或其子类的实例
1 | class evilException extends ArithmeticException { |
throws用来声明抛出的异常类, throw抛出具体的异常对象. throws表示出现异常的一种可能性,并不一定会发生这些异常,throw则是抛出了异常,执行throw则一定抛出了某种异常对象, 创建的异常对象和产生的检查异常一样, 下方的语句不在执行,
try with resource
Java程序中经常需要创建一些对象(如 I/O流、数据库连接),这些对象在使用后需要关闭。忘记关闭文件可能导致内存泄露,并引起其他问题。在JDK7 之前,通常使用finally语句来确保一定会调用 close()方法. 如果在调用 close()方法也可能抛出异常,那么也要处理这种异常。这样编写的程序代码会变得冗长。
1 | Connection connection = null; |
JDK7提供的自动关闭资源的功能为管理资源(如文件流、数据库连接等)提供了一种更加简便的方式。这种功能是通过一种新的 try语句实现的,称为try-with-resources,有时也称为自动资源管理
并非所有的资源都可以自动关闭。只有实现了java.lang.AutoCloseable接口的那些资源才可自动关闭。该接口是JDK7 新增的,定义了close()方法。java.io.Closeable接口继承了AutoCloseable 接口。这两个接口被所有的 I/O 流类实现,包括 FileInputStream 和 FileOutputStream 因此,在使用 I/O 流(包括文件流)时,可以使 try-with-resources
语句。
1 | try(resource-specification){ |
1 | class Door implements AutoCloseable { |
自定义异常类
编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程。
1 | class NetWorkErrorException extends Throwable { |
断言
断言功能可以被看成是异常处理的高级形式. 断言 (assertion)是一个 Java 语句,其中指定一个布尔表达式,程序员认为在程序执行时该表达式的值应该为 true。系统通过计算该布尔表达式执行断言,若该表达式为 false,系统会报告一个错误。通过验证断言是true, 能够
使程序员确信程序的正确性。
assert expression ;
assert expression ; detailMessage ;
expression为布尔表达式,detailMessage是基本数据类型或 Object类型的值。当程序执行到断言语句时,首先计算 expression的值,如果其值为 true,什么也不做,如果其值为 false,抛出 AssertionError异常。
AssertionError类有一个默认的构造方法和7个重载的构造方法,它们有一个参数,类型分别为 int、long、float、double、boolean、char和 Object。对于第一种断言语句没有详细信息,Java 使用AssertionError类默认的构造方法。对于第二种带有一个详细信息的断言语句,Java 使用 AssertionError类的与消息数据类型匹配的构造方法。由于 AssertionError类是Error类的子类,当断言失败时 (expression的值为 false),程序在控制台显示一条消息并终止程序的执行。
1 | public class Main { |
输入输出
输入输出 (I/O) 是任何程序设计语言都提供的功能, Java 语言从一开始就支持 I/O,最初是通过java.io 包中的类和接口提供支持的。
目前 Java 支持文件 I/O 和流式 I/O。 流式 I/O 分为输入流和输出流。程序为了获得外部数据,可以在数据源(文件、内存及网络套接字)上创建一个输入流,然后用 read()方法顺序读取数据。类似地,程序可以在输出设备上创建一个输出流,然后用 write()方法将数据写到输出流中。
所有的数据流都是单向的。
按照处理数据的类型分,数据流又可分为二进制流和文本流,也分别称为字节流和字符流,它们处理信息的基本单位分别是字节和字符
如果需要从外界获得数据,首先需要建立输入流对象,然后从输入流中读取数据
如果需要将数据输出,需要建立输出流对象,然后向输出流中写出数据
File 类
1 | public class Main { |
public boolean exists() |
测试 File对象是否存在。 |
public long length() |
返回指定文件的字节长度,文件不存在时返回0。 |
public boolean createNewFile() |
当文件不存在时,创建一个空文件时返回 true, 否则返回 false。 |
public boolean renameTo(File newName) |
重命名指定的文件对象,正常重命名时返回true, 否则返回 false。 |
public boolean delete() |
删除指定的文件。若为目录,当目录为空时才能删除。 |
public long lastModified() |
返回文件最后被修改的日期和时间,计算的是从1970年1月1日0时0分0秒开始的毫秒数 |
文本文件 (text file)是包含字符序列的文件,可以使用文本编辑器查看或通过程序阅读。而内容必须按二进制序列处理的文件称为二进制文件 (binary file)。
对于文本 I/O 而言,在写入一个字符时, Java 虚拟机会将字符的统一码转换为文件指定的编码,在读取字符时,将文件指定的编码转换为统一码。编码和解码是自动进行的。
二进制 I/O 不需要进行转换。如果使用二进制 I/O 向文件写入一个数据,就是将内存中的值复制到文件中。
由于二进制的 I/O 不需要编码和解码,所以它的优点是处理效率比文本文件高。二进制文件与主机的编码方案无关,因此它是可移植的.
InputStream 类和 OutputStream 类


一些方法:
| InputStream | |
public int read() |
从输入流中读取下一个字节并返回它的值,返回值是0~255的整数值。如果读到输入流末尾,返回-1。 |
public int read(byte[] b) |
从输入流中读多个字节,存入字节数组b 中,如果输入流结束,返回-1。 |
public int available() |
返回输入流中可读或可跳过的字节数。 |
public void close() |
关闭输入流,并释放相关的系统资源。 |
| OutputStream | |
public void write(int b) |
把指定的整数b 的低8位字节写入输出流。 |
public void write(byte[] b) |
把指定的字节数组 b 的b.length个字节写入输出流。 |
public void flush() |
刷新输出流,输出全部缓存内容。 |
public void close() |
关闭输出流,并释放系统资源。 |
上述这些方法的定义都抛出了IOException 异常,当程序不能读写数据时抛出该异常.
常用二进制 I/O 流
FileInput 类和 FileOutput 类
FileInputStream(String name) |
用表示文件的字符串创建文件输入流对象。 |
FileInputStream(File file) |
用 File对象创建文件输入流对象。 |
FileOutputStream(String name) |
用来表示文件的字符串创建文件输出流对象。若文件不存在,则创建一个新文件,若存在则原文件的内容被覆盖。 |
FileOutputStream(String name, boolean append) |
用来表示文件的字符串创建文件输出流对象。如果append参数为true, 则指明打开的文件输出流不覆盖原来的内容,而是从文件末尾写入新内容,否则覆盖原来的文件内容。 |
FileOutputStream(File file) |
用File对象创建文件输入流对象 |
FileInputStream类覆盖了父类的 read()、available()和close()方法。
FileOutputStream类覆盖了父类的 write()
InputStream类和OutputStream类及其子类都实现了java.lang.AutoClosable接口,因此可以在try-with-resources语句中使用,当流使用后自动将它们关闭.
1 | public class Main { |
BufferedInputStream 类和 BufferedOutputStream 类
对流实现缓冲功能。使用缓冲流可以减少读写数据的次数,加快输入输出的速度。缓冲流使用字节数组实现缓冲,当输入数据时,数据成块地读入数组缓冲区,然后程序再从缓冲区中读取单个字节;当输出数据时,数据先写入数组缓冲区,然后再将整个数组写到输出流中. 把输入输出流包装成具有缓冲功能的流,从而提高输入输出的效率.
BufferedInputStream(InputStream in) |
使用参数 in 指定的输入流对象创建一个缓冲输入流。 |
BufferedInputStream(InputStream in, int size) |
使用参数 in指定的输入流对象创建一个缓冲输入流,并且通过 size参数指定缓冲区大小,默认为512字节。 |
BufferedOutputStream(OutputStream out) |
使用参数 out 指定的输出流对象创建一个缓冲输出流。 |
BufferedOutputStream(OutputStream out, int size) |
使用参数 out指定的输出流对象创建一个缓冲输出流,并且通过 size参数指定缓冲区大小,默认为512字节。 |
DataInputStream 类和 DataOutputStream 类
以实现基本数据类型的输入输出.
DataInputStream(InputStream instream) |
|
DataOutputStream(OutputStream outstream) |
|
| DataInputStream | |
public byte readByte() |
从输入流读一个字节并返回该字节。 |
public short readShort() |
从输入流读2字节,返回一个 short型值。 |
public int readInt() |
从输入流读4字节,返回一个int型值。 |
public long readLong() |
从输入流读8字节,返回一个long型值。 |
public char readChar() |
从输入流读一个字符并返回该字符。 |
public boolean readBoolean() |
从输入流读一个字节,非0返回 true,0返回 false。 |
public float readFloat() |
从输入流读4字节,返回一个float型值。 |
public double readDouble() |
从输入流读8字节,返回一个double型值。 |
public String readLine() |
从输入流读下一行文本。该方法已被标记为不推荐使用。 |
public String readUTF() |
从输入流读 UTF-8格式的字符串。 |
| DataOutputStream | |
public void writeByte(int v) |
将v 低8位写入输出流,忽略高24位。 |
public void writeShort(int v) |
向输出流写一个16位的整数。 |
public void writeInt(int v) |
向输出流写一个4字节的整数。 |
public void writeLong(long v) |
向输出流写一个8字节的长整数。 |
public void writeChar(int v) |
向输出流写一个16位的字符。 |
public void writeBoolean(boolean v) |
将一个布尔值写入输出流。 |
public void writeFloat(float v) |
向输出流写一个4字节的 float型浮点数。 |
public void writeDouble(double v) |
向输出流写一个8字节的 double型浮点数。 |
public void writeBytes(String s) |
将参数字符串每个字符的低位字节按顺序写到输出流中。 |
public void writeChars(String s) |
将参数字符串每个字符按顺序写到输出流中,每个字符占2字节。 |
public void writeUTF(String s) |
将参数字符串字符按UTF-8 的格式写出到输出流中。UTF-8 格式的字符串中每个字符可能是1、2或3字节,另外字符串前要加2字节存储字符数量。 |
1 | public class Main { |
PrintStream 类
PrintStream类为打印各种类型的数据提供了方便。PrintStream类定义了多个print()和println()方法,可以打印各种类型的数据。这些方法都是把数据转换成字符串,然后输出。如果输出到文件中则可以用记事本浏览。 println()方法输出后换行, print()方法输出后不换行。当把对象传递给这两个方法时则先调用对象的toString()方法将对象转换为字符串形式,然后输出。在前面章节大量使用的 System.out 对象就是 PrintStream 类的一个实例,用于向控制台输出数据
标准输入输出流
Java系统事先定义了两个对象 System.in 和 System.out,分别与系统的标准输入和标准输出相联系,另外还定义了标准错误输出流 System.err。System.in 是InputStream类的实例。可以使用 read()方法从键盘上读取字节,也可以将它包装成数据流读取各种类型的数据和字符串。System.out 和 System.err 是PrintStream类的实例,可以使用该类定义的方法输出各种类型数据.
文本 I/O 流

Reader 类和 Writer 类
抽象类 Reader 和 Writer 分别是文本输入流和输出流的根类,它们实现字符的读写
| Reader | |
public int read() |
读取一个字符,返回0~65535的 int型值,如果到达流的末尾返回-1。 |
public int read(char[] cbuf) |
读取多个字符到字符数组 cbuf中,如果到达流的末尾返回-1。 |
public void close() |
关闭输入流。 |
| Writer | |
public void write(int c) |
向输出流中写一个字符,实际是将 int型的 c 的低16位写入输出流。 |
public void write(char [] cbuf) |
把字符数组 cbuf中的字符写入输出流。 |
public void write(String str) |
把字符串 str写入输出流中。 |
public void flush() |
刷新输出流。 |
public void close() |
关闭输出流 |
Reader类和 Writer类的方法在发生I/O错误时都抛出 IOException 异常
FileReader 类和 FileWriter 类
| FileReader | |
public FileReader(String fileName) |
|
public FileReader(File file) |
|
| FileWriter | |
public FileWriter(String fileName) |
|
public FileWriter(File file) |
|
public FileWriter(String fileName, boolean append) |
FileReader类是InputStreamReader的子类,实现二进制输入流向文本输入流的转换
FileWriter类是OutputStreamWriter的子类,实现文本输出流向二进制输出流的转换
1 | public class Main { |
BufferedReader 类和 BufferedWriter类
BufferedReader类和BufferedWriter类分别实现了具有缓冲功能的字符输入输出流。这两个类用来将其他的字符流包装成缓冲字符流,以提高读写数据的效率。
public BufferedReader(Reader in) 使用默认的缓冲区大小创建缓冲字符输入流。
public BufferedReader(Reader in,int sz) 使用指定的缓冲区大小创建缓冲字符输入流。
public String readLine() 从输入流中读取一行文本。
BufferedWriter(Writer out)
BufferedWriter(Writer out, int sz)
void newLine() 写一个行分隔符。系统属性line.separator定义的分隔符
在 Writer上(如 FileWriter和 OutputStreamWriter) 包装 BufferedWriter
BufferedReader br = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));
PrintWrite 类
PrintWriter类实现字符打印输出流
PrintWriter(Writer out)
PrintWriter(Writer out, boolean autoFlush) 如果 autoFlush 指定为 true, 则在输出之前自动刷新输出流。
PrintWriter(OutputStream out) 使用二进制输出流创建一个打印输出流。
PrintWriter(OutputStream out, boolean autoFlush)
public void println(type t)
public PrintWriter printf(String format, Object ...args)
Scanner 类
Scanner类从键盘读取数据, 创建 Scanner 对象时将标准输入设备 System.in作为其构造方法的参数。使用 Scanner还可以关联文本文件,从文本文件中读取数据。
public Scanner(String source)
public Scanner(InputStream source) 用指定的输入流构造一个 Scanner 对象,以便从中读取数据。
创建 Scanner对象后,就可以根据分隔符对源数据进行解析。使用 Scanner类的有关方法可以解析每个标记 (token)。默认的分隔符是空白,包括回车、换行、空格、制表符等,也可以指定分隔符。
public String next() 读取下一个标记并将其解析成字符串。
public String nextLine() 读取当前行作为一个string型字符串。
public Scanner useDelimiter(String pattern) 设置 Scanner 对象使用分隔符的模式。pattern为一个合法的正则表达式。
public void close() 关闭 Scanner对象。
每个 nextXXX()方法,Scanner类还提供一个 hasNextXXX()方法。使用该方法可以判断是否还有下一个标记。
对象序列化
对象的寿命通常随着创建该对象程序的终止而终止。有时可能需要将对象的状态保存下来,在需要时再将其恢复。对象状态的保存和恢复可以通过对象I/O 流实现.
Serializable 接口
将程序中的对象输出到外部设备(如磁盘、网络)中,称为对象序列化 (serialization);反之,从外部设备将对象读入程序中称为对象反序列化 (deserialization)。一个类的对象要实现对象序列化,必须实现java.io.Serializable接口.
Serializable接 口只是标识性接口, 其中没有定义任何方法。一个类的对象要序列化,除了必须实现 Serializable接 口外,还需要创建对象输出流 和对象输入流,然后,通过对象输出流将对象状态保存下来,通过对象输入流恢复对象的状态。
ObjectInputStream 类和 ObjectOutputStream 类
public ObjectOutputStream(OutputStream out)
public final void writeObject(Object obj) throws IOException
public ObjectInputStream(InputStream in)
public final Object readObject () throws IOException
1 | class Person implements Serializable { |
如果数组中的所有元素都是可序列化的,这个数组就是可序列化的.
NIO 和 NIO.2
为了增强Java I/O功能,在JDK 1.4中增加了一些新的API,称为NIO(new I/O), NIO API是java.nio包及其子包的一部分。在JDK7中又新引进了一些包,称作NIO.2,用来对现有技术进行补充。NIO.2的接口和类通过java.nio.file包及其子包提供。
FileSystem 类
FileSystem表示一个文件系统,是一个抽象类,可以调用FileSystems类的getDefault()静态方法来获取当前的文件系统。
abstract Path getPath(String first, String...more) |
返回字符串first指定的路径对象。可选参数more用来指定后续路径。 |
abstract String getSeparator() |
返回路径分隔符。在Windows系统中,它是“\”,在 UNIX/Linux系统中,它是“/”。 |
abstract Iterable<Path> getRootDirectores() |
返回一个Iterable对象,可以用来遍历根目录。 |
abstract boolean isOpen() |
返回该文件系统是否打开。 |
abstract boolean isReadOnly() |
返回该文件系统是否只读。 |
Path对象
Java7之前,文件和目录用File对象表示。由于使用File类存在着许多不足,因此在Java7中应使用NIO.2的java.nio.file.Path接口代替File。
对JDK 7之前使用java.io.File的代码,可以使用File类的toPath()方法转换成Path对象,从而利用Path功能。
Path 表示一个路径,可以是一个文件、一个目录,也可以是一个符号链接,还可以表示一个根目录。
1 | public class Main { |
Files 类
java.nio.file.Files类是一个功能非常强大的类。该类定义了大量的静态方法用来读、写和操纵文件与目录。Files类主要操作Path对象
public static Path createDirectory(Path dir, FileAttribute<?>...attrs)
public static Path createFile(Path file,FileAttribute<?>...attrs)
public static void delete(Path path)
public static void deleteIfExists(Path path)
1 | public class Main { |
public static boolean exists(Path path,LinkOption…options) |
|
public static boolean notExists(Path path,LinkOption…options): |
检查path所指的文件或目录是否不存在。注意,!Files.exists(path)与Files.notExists(path)并不等价。如果exists(path)与notExists(path)都返回false,表示文件不能检验。 |
public static boolean isReadable(Path path) |
|
public static boolean isWritable(Path path) |
|
public static boolean isExecutable(Path path) |
|
static boolean isRegularFile(Path path, LinkOption…options) |
|
static long size(Path path): |
返回指定文件的字节大小。 |
static boolean isDirectory(Path path,LinkOption…options) |
|
static boolean isHidden(Path path) |
如果指定的Path对象是隐藏的返回true。 |
static FileTime getLastModifiedTime(Path path, LinkOption…options) |
|
static Path setLastModifiedTime(Path path, FileTime) |
|
static UserPrincipal getOwner(Path path, LinkOption…options) |
返回指定文件的所有者。 |
static Path setOwner(Path path, UserPrincipal) |
设置指定文件的所有者。 |
static Object getAttribute(Path path, String, LinkOption…options) |
返回用字符串指定文件的属性。 |
static Path setAttribute(Path path, String, Object obj,LinkOption…options) |
设置用字符串指定文件的属性 |
| 复制移动 | |
public static Path copy(Path source, Path target, Copyoption…options) |
可选的参数options为CopyOption接口对象,是 |
java.nio.file包的一个接口。StandardCopyOption枚举是CopyOption接口的一个实现,提供了下面三个复制选项。ATOMIC_MOVE:将移动文件作为一个原子的文件系统操作; COPY_ATTRIBUTES:将属性复制到新文件 ;REPLACE_EXISTING:如果文件存在,将它替换。 |
|
public static long copy(InputStream in, Path target, CopyOption…options) 从输入流中将所有字节复制到目标文件中。 |
|
public static long copy(Path source, OutputStream out) 将源文件中的所有字节复制到输出流中 |
|
public static Path move(Path source, Path target, Copyoption…options) |
1 | public class Main { |
获取目录的对象
Files类的newDirectoryStream()方法,可以获取目录中的文件、子目录和符号链接,该方法返回一个DirectoryStream,使用它可以迭代目录中的所有对象。
public static DirectoryStream<Path> newDirectoryStream(Path path)
1 | public class Main { |
小文件读写
Files类提供了从一个较小的二进制文件和文本文件读取与写入的方法。readAllBytes()方法和readAllLines()方法分别是从二进制文件和文本文件读取。这些方法可以自动打开和关闭流,但不能处理大文件。
public static Path write(Path path, byte[] bytes,OpenOption…options)
public static Path write(Path path, Iterable<extends CharSequence> lines,Charset cs, OpenOption…options)
public static byte[] readAllBytes(Path path)
public static List<String>readAllLines(Path path, Charset cs)
OpenOption接口定义了打开文件进行写入的选项,StandardOpenOption枚举实现了该接口并提供了以下这些值。
APPEND |
向文件末尾追加新数据。该选项与WRITE或CREATE同时使用。 |
CREATE |
若文件存在则打开,若文件不存在则创建新文件。 |
CREATE_NEW |
创建一个新文件,如果文件存在则抛出异常。 |
DELETE_ON_CLOSE |
当流关闭时删除文件。 |
DSYNC |
使文件内容与基本存储设备同步。 |
READ |
打开文件进行读取访问。 |
SYNC |
使文件内容和元数据与基本存储设备同步。 |
TRUNCATE_EXISTING |
截断文件使其长度为0字节,该选项与WRITE同时使用。 |
WRITE |
为写数据而打开文件。 |
1 | public class Main { |
Files 类创建流对象
有了NIO.2后,就可以调用Files.newInputStream()方法,获得与文件关联的InputStream对象来读取数据,调用Files.newOutputStream()方法获得与文件关联的OutputStream对象向文件写数据。
public static InputStream newInputStream(Path path, OpenOption...options) throws IOException
public static OutputStream newOutputStream(Path path, OpenOption...options) throws IOException
1 | public class Main { |
参考
- 《Java程序设计(第3版)》 IBSN 9787302485520
- Java API 文档