十三、文件目录和IO流
13.1 java.io.File类
1、构造器
在API中File的解释是文件和目录路径名的抽象表示形式,即要表示某个文件或者目录必须指定文件或目录的路径名称,如:d:/atguigu/javase/io/佟刚.jpg,d:/atguigu,www.atguigu.com/index.jsp。
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 |
| 2 | public File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例。 |
| 3 | public File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例。 |
2、获取文件和目录基本信息的方法
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public String getName() | 返回由此File表示的文件或目录的名称。 |
| 2 | public long length() | 返回由此File表示的文件的长度。 如果此路径名表示一个目录,则返回值是不确定的。 |
| 3 | public long lastModified() | 返回File对象对应的文件或目录的最后修改时间(毫秒值)。 |
| 4 | public boolean exists() | 此File表示的文件或目录是否实际存在。 |
| 5 | public boolean isDirectory() | 此File表示的是否为目录。 |
| 6 | public boolean isFile() | 此File表示的是否为文件。 |
| 7 | public boolean isHidden() | 此File表示的是否为隐藏文件或目录。 |
| 8 | public boolean canExecute() | 测试应用程序是否可以执行此抽象路径名表示的文件。 |
| 9 | public boolean canRead() | 测试应用程序是否可以读取此抽象路径名表示的文件。 |
| 10 | public boolean canWrite() | 测试应用程序是否可以修改此抽象路径名表示的文件。 |
3、创建删除文件和目录
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public static File createTempFile(String prefix, String suffix) throws IOException | 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 |
| 2 | public static File createTempFile(String prefix, String suffix, File directory) throws IOException | 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 |
| 3 | public boolean createNewFile() | 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 |
| 4 | public boolean delete() | 删除由此File表示的文件或==空==目录。 |
| 5 | public boolean mkdir() | 创建由此File表示的目录。 |
| 6 | public boolean mkdirs() | 创建由此File表示的目录,包括任何必需但不存在的父目录。 |
| 7 | public boolean renameTo(File dest) | 重新命名此抽象路径名表示的文件或目录。但是此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动到另一个文件系统。 |
4、文件或目录的上下级
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public String getParent() | 返回此抽象路径名父目录的路径名字符串 |
| 2 | public File getParentFile() | 返回此抽象路径名父目录的抽象路径名 |
| 3 | public String[] list() | 返回一个String数组,表示该File目录中的所有子文件或目录。 |
| 4 | public File[] listFiles() | 返回一个File数组,表示该File目录中的所有的子文件或目录。 |
| 5 | public File[] listFiles(FileFilter filter) | 返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(File pathname)方法返回 true 时,该路径名才满足过滤器。 |
| 6 | public String[] list(FilenameFilter filter) | 返回返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FilenameFilter .accept(File dir, String name)方法返回 true 时,该路径名才满足过滤器。 |
| 7 | public File[] listFiles(FilenameFilter filter) | 返回返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FilenameFilter .accept(File dir, String name)方法返回 true 时,该路径名才满足过滤器。 |
5、各种路径问题
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public String getPath() | 将此File转换为路径名字符串。 |
| 2 | public String getAbsolutePath() | 返回此File的绝对路径名字符串。 |
| 3 | String getCanonicalPath() | 返回此File对象所对应的规范路径名。 |
(1)绝对路径:
- windows:从盘符开始的路径,就是绝对路径,例如:D:\download\学生项目
- linux:从/符号开始的路径,就是绝对路径
(2)相对路径:
- 除了绝对路径,就是相对路径。
- 相对谁?JavaSE项目
- main方法中代码:参考project(工程,项目)
- @Test方法中代码:参考module(模块)
(3)构造路径:new File对象时,指定的path,它可能是相对路径,也可能是绝对路径,可能是规范路径,也可以是非规范路径。
(4)规范路径:不包含../等形式的路径值。
13.2 java.io.FileFilter
抽象路径名的过滤器。
- public boolean accept(File pathname) 判断指定的抽象路径名是否应包含在路径名列表中。
13.3 IO流
13.3.1 IO流分类
按照继承关系分
| 分类 | 父类 | 子类 | 描述 |
|---|---|---|---|
| 字节输入流 | InputStream | FileInputStream | 以字节为单位的方式读取任意类型的文件内容 |
| BufferedInputStream | 包装其他InputStream流,先将其他InputStream流读取字节内容预先缓存到缓冲区,之后再从缓冲区中读取数据 | ||
| DataInputStream | 包装其他InputStream流,并按照不同数据类型从该流中读取数据 | ||
| ObjectInputStream | 包装其他InputStream流,并按照不同数据类型从该流中读取数据,并支持对象反序列化 | ||
| 字节输出流 | OutputStream | FileOutputStream | 以字节为单位的方式输出内容至任意类型的文件 |
| BufferedOutputStream | 包装其他OutputStream流,先将数据先输出到缓冲区,之后再从缓冲区输出到所包装的输出流中 | ||
| DataOutputStream | 包装其他OutputStream流,先按照不同数据类型将数据输出到该输出流,之后再从该流以字节方式输出到所包装的输出流中 | ||
| ObjectOutputStream | 包装其他OutputStream流,先按照不同数据类型将数据输出到该输出流,之后再从该流以字节方式输出到所包装的输出流中,并支持对象的序列化 | ||
| PrintStream | 将流中数据打印输出到文件或另一个OutputStream流中 | ||
| 字符输入流 | Reader | FileReader | 以字符为单位的方式读取纯文本文件的内容 |
| BufferedReader | 包装其他Reader类,先将其他Reader流读取字符内容预先缓存到缓冲区,之后再从缓冲区中读取数据 | ||
| InputStreamReader | 包装其他InputStream类,将所包装的InputStream流中的字节数据解码为字符 | ||
| 字符输出流 | Writer | FileWriter | 以字符为单位的方式输出内容至纯文本文件 |
| BufferedWriter | 包装其他Writer流,先将数据先输出到缓冲区,之后再从缓冲区输出到所包装的输出流中 | ||
| OutputStreamWriter | 包装其他OutputStream类,将字符数据编码为字节数据输出到所包装的OutputStream流中 | ||
| PrinterWriter | 将流中数据打印输出到文件或另一个Writer流中 |
按照功能划分
| 功能 | IO流 | 描述 |
|---|---|---|
| 读写文件 | FileInputStream | 以字节为单位的方式读取任意类型的文件内容 |
| FileOutputStream | 以字节为单位的方式输出内容至任意类型的文件 | |
| FileReader | 以字符为单位的方式读取纯文本文件的内容 | |
| FileWriter | 以字符为单位的方式输出内容至纯文本文件 | |
| 打印流 | PrintStream | 将流中数据打印输出到文件或另一个OutputStream流中 |
| PrintWriter | 将流中数据打印输出到文件或另一个OutputStream流中 | |
| 转换流 | InputStreamReader | 包装其他InputStream类,将所包装的InputStream流中的字节数据解码为字符 |
| OutputStreamWriter | 包装其他OutputStream类,将字符数据编码为字节数据输出到所包装的OutputStream流中 | |
| 缓冲流 | BufferedInputStream | 包装其他InputStream流,先将其他InputStream流读取字节内容预先缓存到缓冲区,之后再从缓冲区中读取数据 |
| BufferedOutputStream | 包装其他OutputStream流,先将数据先输出到缓冲区,之后再从缓冲区输出到所包装的输出流中 | |
| BufferedReader | 包装其他Reader类,先将其他Reader流读取字符内容预先缓存到缓冲区,之后再从缓冲区中读取数据 | |
| BufferedWrtier | 包装其他Writer流,先将数据先输出到缓冲区,之后再从缓冲区输出到所包装的输出流中 | |
| 数据流 | DataInputStream | 包装其他InputStream流,并按照不同数据类型从该流中读取数据 |
| DataOutputStream | 包装其他OutputStream流,先按照不同数据类型将数据输出到该输出流,之后再从该流以字节方式输出到所包装的输出流中 | |
| 对象流 | ObjectInputStream | 包装其他InputStream流,并按照不同数据类型从该流中读取数据,并支持对象反序列化 |
| ObjectOutputStream | 包装其他OutputStream流,先按照不同数据类型将数据输出到该输出流,之后再从该流以字节方式输出到所包装的输出流中,并支持对象的序列化 |
13.3.1 java.io.InputStream
- public int read():一次读取1个字节,返回的该字节值。如果流中已经没有数据可读了,返回-1。
- public int read(byte[] data):一次读取多个字节,返回的本次读取的字节个数。最多可以读取data.length个,如果流中不够data.length个,有几个字节读取几个。如果流中已经没有数据可读了,返回-1。读取的内容放入data字节数组[0, n)下标范围,n为本次读取的字节数量。
- public int read(byte[] b, int off, int len):一次读取多个字节,返回的本次读取的字节个数。最多可以读取len个,如果流中不够len个,有几个字节读取几个。如果流中已经没有数据可读了,返回-1。读取的内容放入data字节数组[0, n)下标范围,n为本次读取的字节数量。
- public void close():关闭IO流。
13.3.2 java.io.OutputStream
- public void writer(int n):输出1个字节
- public void write(byte [] data):输出整个字节数组中内容
- public void write(byte [] data,int offset, int len):输出字节数组中一部分内容。从data的[offset]开始取len个字节。
- public void close():关闭IO流。
- public void flush():刷新IO流。
13.3.3 java.io.Reader
- public int read():一次读取1个字符,返回的该字符的Unicode编码值。如果流中已经没有数据可读了,返回-1。
- public int read(char[] data):一次读取多个字符,返回的本次读取的字符个数。最多可以读取data.length个,如果流中不够data.length个,有几个字符读取几个。如果流中已经没有数据可读了,返回-1。
- public int read(char[] data, int off, int len):一次读取多个字符,返回的本次读取的字符个数。最多可以读取len个,如果流中不够len个,有几个字符读取几个。如果流中已经没有数据可读了,返回-1。读取的内容放入data字符数组[0, n)下标范围,n为本次读取的字符数量。
- public void close():关闭IO流。
13.3.4 java.io.Writer
- public void write(int ch):输出1个字符
- public void write(String str):输出整个字符串
- public void write(char[] data):输出整个char数组
- public void write(char[] data, int offset, int len):输出char数组的一部分。从data数组的[offset]开始取len个字符输出。
- public void write(String str, int offset, int ln):输出字符串的一部分。从str字符串的[offset]开始取len个字符输出。
- public void close():关闭IO流。
- public void flush():刷新IO流。
13.3.5 java.io.FileReader
- public FileReader(File file):创建FileReader对象,从file文件读取内容
- public FileReader(String fileName):创建FileReader对象,从fileName指定的文件读取文件内容
- public FileReader(File file, Charset charset):创建FileReader对象,从file文件读取内容,文件编码是charset
- public FileReader(String fileName, Charset charset)创建FileReader对象,从fileName指定的文件读取文件内容,文件编码是charset
13.3.6 java.io.FileWriter
- public FileWriter(File file):创建FileWriter对象,将内容写到file文件。如果文件已存在,会覆盖原文件
- public FileWriter(String fileName):创建FileWriter对象,将内容写到fileName指定的文件,如果文件已存在,会覆盖原文件
- public FileWriter(File file, boolean append):创建FileWriter对象,将内容写到file文件。如果文件已存在,会进行续写。
- public FileWriter(String fileName, boolean append):创建FileWriter对象,将内容写到fileName指定的文件,如果文件已存在,会进行续写。
- public FileWriter(File file, Charset charset):创建FileWriter对象,将内容写到file文件。文件编码是charset。如果文件已存在,会覆盖原文件
- public FileWriter(String fileName, Charset charset):创建FileWriter对象,将内容写到fileName指定的文件,文件编码是charset。如果文件已存在,会覆盖原文件。
- public FileWriter(File file, Charset charset, boolean append):创建FileWriter对象,将内容写到file文件。文件编码是charset。如果文件已存在,会进行续写。
- public FileWriter(String fileName, Charset charset, boolean append):创建FileWriter对象,将内容写到fileName指定的文件,文件编码是charset。如果文件已存在,会进行续写。
13.3.7 java.io.ObjectOutputStream
ObjectOutputStream必须包装一个OutputStream字节输出流对象。
- public ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream。
ObjectOutputStream是OutputStream的子类,==除了OutputStream的方法==,还增加了一些方法:
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public void writeBoolean(boolean val) | 输出一个boolean值 |
| 2 | public void writeByte(int val) | 输出一个byte值 |
| 3 | public void writeShort(int val) | 输出一个short值 |
| 4 | public void writeChar(int val) | 输出一个char值 |
| 5 | public void writeInt(int val) | 输出一个int值 |
| 6 | public void writeLong(long val) | 输出一个long值 |
| 7 | public void writeFloat(float val) | 输出一个float值 |
| 8 | public void writeDouble(double val) | 输出一个double值 |
| 9 | public void writeUTF(String str) | 输出一个String值 |
| 10 | public final void writeObject (Object obj) | 输出一个对象 |
13.3.8 java.io.ObjectInputStream
ObjectInputStream必须包装一个InputStream字节输入流对象。
- ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectInputStream。
ObjectInputStream是InputStream的子类,除了InputStream的方法,还增加了一些方法:
ObjectOutputStream是OutputStream的子类,==除了OutputStream的方法==,还新增了如下方法:
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public boolean readBoolean() | 读取一个boolean值 |
| 2 | public byte readByte() | 读取一个byte值 |
| 3 | public short readShort() | 读取一个short值 |
| 4 | public char readChar() | 读取一个char值 |
| 5 | public int readInt() | 读取一个int值 |
| 6 | public long readLong() | 读取一个long值 |
| 7 | public float readFloat() | 读取一个float值 |
| 8 | public double readDouble() | 读取一个double值 |
| 9 | public String readUTF() | 读取一个String值 |
| 10 | public final Object readObject () | 读取一个对象 |
13.3.9 java.io.PrintStream
-
PrintStream(File file):使用指定的文件创建一个新的打印流,而不需要自动换行。
-
PrintStream(File file, String csn):使用指定的文件和字符集创建新的打印流,而不需要自动换行。
-
PrintStream(OutputStream out):创建一个新的打印流。
-
PrintStream(OutputStream out, boolean autoFlush):创建一个新的打印流。
-
PrintStream(OutputStream out, boolean autoFlush, String encoding):创建一个新的打印流。
-
PrintStream(String fileName):使用指定的文件名创建新的打印流,不需要自动换行。
-
PrintStream(String fileName, String csn):创建一个新的打印流,不需要自动换行,具有指定的文件名和字符集。
PrintStream流是OutputStream流的子类,==除了OutputStream的方法==,还新增了如下方法:
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public void print(boolean b) | 打印输出一个boolean值 |
| 2 | public void print(char b) | 打印输出一个char值 |
| 3 | public void print(char[] b) | 打印输出一个char[] |
| 4 | public void print(double b) | 打印输出一个double值 |
| 5 | public void print(float b) | 打印输出一个float值 |
| 6 | public void print(int b) | 打印输出一个int值 |
| 7 | public void print(long b) | 打印输出一个long值 |
| 8 | public void print(Object b) | 打印输出一个对象,自动调用对象toString方法 |
| 9 | public void print(String b) | 打印输出一个字符串 |
| 10 | public void println() | 打印输出一个换行符 |
| 1 | public void println(boolean b) | 打印输出一个boolean值并换行 |
| 2 | public void println(char b) | 打印输出一个char值并换行 |
| 3 | public void println(char[] b) | 打印输出一个char[]并换行 |
| 4 | public void println(double b) | 打印输出一个double值并换行 |
| 5 | public void println(float b) | 打印输出一个float值并换行 |
| 6 | public void println(int b) | 打印输出一个int值并换行 |
| 7 | public void println(long b) | 打印输出一个long值并换行 |
| 8 | public void println(Object b) | 打印输出一个对象并换行,自动调用对象toString方法 |
| 9 | public void println(String b) | 打印输出一个字符串并换行 |
13.3.10 java.util.Scanner
- public Scanner(File source):创建Scanner对象,从source文件读取内容
- public Scanner(File source, String charsetName):创建Scanner对象,从source文件读取内容。文件编码是charsetName。
- public Scanner(File source, Charset charset):创建Scanner对象,从source文件读取内容。文件编码是charset。
- public Scanner(InputStream source):创建Scanner对象,从source输入流读取内容。
- public Scanner(InputStream source, String charsetName):创建Scanner对象,从source输入流读取内容。流中文本编码是charsetName
- public Scanner(InputStream source, Charset charset):创建Scanner对象,从source输入流读取内容。流中文本编码是charset
常用方法:
| 序号 | 方法 | 描述 | 方法 | 描述 |
|---|---|---|---|---|
| 1 | public boolean hasNextByte() | 当且仅当此扫描器的下一个标记是有效的字节值时才返回 true | public byte nextByte() | 读取1个字节 |
| 2 | public boolean hasNextShort() | 当且仅当此扫描器的下一个标记是默认基数中的有效的 short 值时才返回 true | public short nextShort() | 读取一个boolean值 |
| 3 | public boolean hasNextInt() | 当且仅当此扫描器的下一个标记是有效的 int 值时才返回 true | public int nextInt() | 读取一个int值 |
| 4 | public boolean hasNextLong() | 当且仅当此扫描器的下一个标记是有效的 long 值时才返回 true | 将输入信息的下一个标记扫描为一个 long。 | 读取一个long值 |
| 5 | public boolean hasNextFloat() | 当且仅当此扫描器的下一个标记是有效的 float 值时才返回 true | public float nextFloat() | 读取一个float值 |
| 6 | public boolean hasNextDouble() | 当且仅当此扫描器的下一个标记是有效的 double 值时才返回 true | public double nextDouble() | 读取一个double值 |
| 7 | public boolean hasNextBigInteger() | 当且仅当此扫描器的下一个标记是有效的 BigInteger 值时才返回 true | public BigInteger nextBigInteger() | 读取一个BigInteger值 |
| 8 | public boolean hasNextBigDecimal() | 当且仅当此扫描器的下一个标记是有效的 BigDecimal 值时才返回 true | public BigDecimal nextBigDecimal() | 读取一个BigDecimal值 |
| 9 | public boolean hasNext() | 如果此扫描器的输入中有另一个标记,则返回 true。在等待要扫描的输入时,此方法可能阻塞。 | public String next() | 读取一个字符串,遇到空格结束 |
| 10 | public boolean hasNextLine() | 当且仅当此扫描器有另一行输入时才返回 true | public String nextLine() | 读取一行字符串,遇到换行符结束 |
十四、网络编程
14.1 java.net.InetAddress
InetAddress类主要表示IP地址,两个子类:Inet4Address、Inet6Address。
Internet上的主机有两种方式表示地址:
- 域名(hostName):www.atguigu.com
- IP 地址(hostAddress):202.108.35.210
lInetAddress 类没有提供公共的构造器,而是提供 了 如下几个 静态方法来获取InetAddress 实例
- public static InetAddress getLocalHost()
- public static InetAddress getByName(String host)
- public static InetAddress getByAddress(byte[] addr)
InetAddress 提供了如下几个常用的方法
- public String getHostAddress() :返回 IP 地址字符串(以文本表现形式)。
- public String getHostName() :获取此 IP 地址的主机名
14.2 UDP协议
14.2.1 DatagramSocket
此类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
| 序号 | 构造器或方法 | 描述 |
|---|---|---|
| 1 | public DatagramSocket(int port) | 创建数据报套接字并将其绑定到本地主机上的指定端口。套接字将被绑定到通配符地址,IP 地址由内核来选择。 |
| 2 | public void send(DatagramPacket p) | 从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。 |
| 3 | public void receive(DatagramPacket p) | 从此套接字接收数据报包。当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据。数据报包也包含发送方的 IP 地址和发送方机器上的端口号。 此方法在接收到数据报前一直阻塞。数据报包对象的 length 字段包含所接收信息的长度。如果信息比包的长度长,该信息将被截短。 |
| 4 | public void close() | 关闭此数据报套接字。 |
14.2.2 DatagramPacket类
DatagramPacket此类表示数据报包。 数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。
| 序号 | 构造器和方法 | 描述 |
|---|---|---|
| 1 | public DatagramPacket(byte[] buf,int length) | 构造 DatagramPacket,用来接收长度为 length 的数据包。 length 参数必须小于等于 buf.length。 |
| 2 | public DatagramPacket(byte[] buf,int length,InetAddress address,int port) | 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。 |
| 3 | public int getLength() | 返回将要发送或接收到的数据的长度。 |
| 4 | public byte[] getData() | 返回数据缓冲区。 |
14.3 TCP协议
14.3.1 ServerSocket类
| 序号 | 构造器或方法 | 描述 |
|---|---|---|
| 1 | ServerSocket(int port) | 创建绑定到特定端口的服务器套接字。 |
| 2 | Socket accept() | 侦听并接受到此套接字的连接。 |
| 3 | public void close() | 关闭此套接字。 |
14.3.2 Socket类
| 序号 | 构造器或方法 | 描述 |
|---|---|---|
| 1 | public Socket(InetAddress address,int port) | 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 |
| 2 | public Socket(String host,int port) | 创建一个流套接字并将其连接到指定主机上的指定端口号。 |
| 3 | public InputStream getInputStream() | 返回此套接字的输入流,可以用于接收消息 |
| 4 | public OutputStream getOutputStream() | 返回此套接字的输出流,可以用于发送消息 |
| 5 | public InetAddress getInetAddress() | 此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null。 |
| 6 | public int getPort() | 此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。 |
| 7 | public InetAddress getLocalAddress() | 获取套接字绑定的本地地址。 |
| 8 | public int getLocalPort() | 返回此套接字绑定到的本地端口。如果尚未绑定套接字,则返回 -1。 |
| 9 | public void close() | 关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。 |
| 10 | public void shutdownInput() | 如果在套接字上调用 shutdownInput() 后从套接字输入流读取内容,则流将返回 EOF(文件结束符)。 即不能在从此套接字的输入流中接收任何数据。 |
| 11 | public void shutdownOutput() | 禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException。 即不能通过此套接字的输出流发送任何数据。 |
**注意:**先后调用Socket的shutdownInput()和shutdownOutput()方法,仅仅关闭了输入流和输出流,并不等于调用Socket的close()方法。在通信结束后,仍然要调用Scoket的close()方法,因为只有该方法才会释放Socket占用的资源,比如占用的本地端口号等。
十五、反射
15.1 获取Class对象的四种方式
(1)类型名.class:获取某类型的Class对象
@Test
public void test1(){
Class<?> c1 = int.class;
Class<?> c2 = void.class;
Class<?> c3 = String.class;
Class<?> c4 = Serializable.class;
Class<?> c5 = Month.class;
Class<?> c6 = int[].class;
Class<?> c7 = Override.class;
//类型不同Class对象就不同
//类型相同Class对象就相同
}
(2)对象.getClass():获取对象的运行时类型
@Test
public void test1(){
Class c = int.class;//int类型的字节码数据在内存中的Class对象
Class s = String.class;//String类型的字节码数据在内存中的Class对象
System.out.println(c == s);//false
}
@Test
public void test2()throws Exception{
Class c1 = "hello".getClass();//字符串类型
Class c2 = String.class;//字符串类型
System.out.println(c1 == c2);//true
Class c3 = Class.forName("java.lang.String");
System.out.println(c1 == c3);//true
}
(3)Class.forName("类型全名称"):获取某类型的Class对象
Class c3 = Class.forName("java.lang.String");
(4)ClassLoader的类加载器对象.loadClass(类型全名称):可以用系统类加载对象或自定义加载器对象加载指定路径下的类型
Class c = ClassLoader.getSystemClassLoader().loadClass("java.lang.String");
15.2 相关类的API
1、java.lang.Class类
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public static Class<?> forName(String className)throws ClassNotFoundException | 返回与带有给定字符串名的类或接口相关联的 Class 对象。 |
| 2 | public Package getPackage() | 获取此类的包。 |
| 3 | public int getModifiers() | 返回此类或接口以整数编码的 Java 语言修饰符。 |
| 4 | public String getName() | 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。 |
| 5 | public Class<? super T> getSuperclass() | 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。 |
| 6 | public Type getGenericSuperclass() | 回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数。 |
| 7 | public Class<?>[] getInterfaces() | 确定此对象所表示的类或接口实现的接口。如果此对象表示一个类,则返回值是一个数组,它包含了表示该类所实现的所有接口的对象。 |
| 8 | public Type[] getGenericInterfaces() | 返回表示某些接口的 Type,这些接口由此对象所表示的类或接口直接实现。 |
| 9 | public Field[] getFields() throws SecurityException | 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。返回数组中的元素没有排序,也没有任何特定的顺序。 |
| 10 | public Field getField(String name) throws NoSuchFieldException, SecurityException | 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。name 参数是一个 String,用于指定所需字段的简称。 |
| 11 | public Field[] getDeclaredFields() throws SecurityException | 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。 |
| 12 | public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException | 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称。 |
| 13 | public Constructor<?>[] getConstructors() throws SecurityException | 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 |
| 14 | public Constructor getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException | 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。parameterTypes 参数是 Class 对象的一个数组,这些 Class 对象按声明顺序标识构造方法的形参类型。 如果此 Class 对象表示非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭的实例。 |
| 15 | public Constructor<?>[] getDeclaredConstructors() throws SecurityException | 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法。 |
| 16 | public Constructor getDeclaredConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException | 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识构造方法的形参类型。 如果此 Class 对象表示非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭的实例。 |
| 17 | public Method[] getMethods() throws SecurityException | 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。 |
| 18 | public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException | 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组。 |
| 19 | public Method[] getDeclaredMethods() throws SecurityException | 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。 |
| 20 | public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException | 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。name 参数是一个 String,它指定所需方法的简称,parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识该方法的形参类型。 |
| 21 | public Class<?>[] getClasses() | 返回一个包含某些 Class 对象的数组,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口。(即内部类) |
| 22 | public Class<?>[] getDeclaredClasses() throws SecurityException | 返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口。包括该类所声明的公共、保护、默认(包)访问及私有类和接口,但不包括继承的类和接口。 |
| 23 | public Class<?> getDeclaringClass() | 如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。如果该类或接口不是其他类的成员,则此方法返回 null。(即外部类) |
| 24 | public Annotation[] getAnnotations() | 返回此类型上存在的注解,包括从父类继承的注解。 |
| 25 | public Annotation[] getDeclaredAnnotations() | 返回直接存在于此类型上的注解,不包括从父类继承的注解。 |
| 26 | public A getAnnotation(Class annotationClass) | 返回此类型上的某个注解。 |
| 27 | public boolean isAnonymousClass() | 是否是匿名类 |
| 28 | public boolean isLocalClass() | 是否是局部内部类 |
| 29 | public boolean isMemberClass() | 是否是成员内部类 |
| 30 | public boolean isArray() | 是否是数组类型 |
| 31 | public boolean isPrimitive() | 是否是基本数据类型或void |
| 32 | public boolean isInterface() | 是否是接口类型 |
| 33 | public boolean isEnum() | 是否是枚举类型 |
| 34 | public boolean isAnnotation() | 是否是注解类型 |
| 35 | public T newInstance() throws InstantiationException, IllegalAccessException | 创建此 Class 对象所表示的类的一个新实例。要求该类必须有一个公共的无参构造。此方法已过时。 |
| 36 | public ClassLoader getClassLoader() | 返回该类的类加载器。如果该类由引导类加载器加载,则此方法在这类实现中将返回 null。 |
2、java.lang.reflect.Modifier类
| 序号 | 常量或方法 | 描述 |
|---|---|---|
| 1 | public static final int PUBLIC | 0x00000001 |
| 2 | public static final int PRIVATE | 0x00000002 |
| 3 | public static final int PROTECTED | 0x00000004 |
| 4 | public static final int STATIC | 0x00000008 |
| 5 | public static final int FINAL | 0x00000010 |
| 6 | public static final int SYNCHRONIZED | 0x00000020 |
| 7 | public static final int VOLATILE | 0x00000040 |
| 8 | public static final int TRANSIENT | 0x00000080 |
| 9 | public static final int NATIVE | 0x00000100 |
| 10 | public static final int INTERFACE | 0x00000200 |
| 11 | public static final int ABSTRACT | 0x00000400 |
| 12 | public static final int STRICT | 0x00000800 |
| 13 | public static String toString(int mod) | 返回描述指定修饰符中的访问修饰符标志的字符串。 |
3、java.lang.reflect.Constructor
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public Annotation[] getDeclaredAnnotations() | 返回构造器上的所有注解类型 |
| 2 | public T getAnnotation(Class annotationClass) | 返回构造器上指定的注解类型 |
| 3 | public int getModifiers() | 以整数形式返回此 Constructor 对象所表示构造方法的 Java 语言修饰符。应该使用 Modifier 类对这些修饰符进行解码。 |
| 4 | public String getName() | 以字符串形式返回此构造方法的名称。它总是与构造方法的声明类的简单名称相同。 |
| 5 | public Class<?>[] getParameterTypes() | 按照声明顺序返回一组 Class 对象,这些对象表示此 Constructor 对象所表示构造方法的形参类型。 |
| 6 | public Class<?>[] getExceptionTypes() | 回一组表示声明throws的异常类型的 Class 对象 |
| 7 | public T newInstance(Object... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException | 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。 |
| 8 | public void setAccessible(boolean flag) throws SecurityException | 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。 |
4、java.lang.reflect.Field
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public Annotation[] getDeclaredAnnotations() | 返回字段上的所有注解类型 |
| 2 | public T getAnnotation(Class annotationClass) | 返回字段上指定的注解类型 |
| 3 | public int getModifiers() | 以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。应该使用 Modifier 类对这些修饰符进行解码。 |
| 4 | public Class<?> getType() | 返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。 |
| 5 | public String getName() | 返回此 Field 对象表示的字段的名称。 |
| 6 | public void setAccessible(boolean flag) throws SecurityException | 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。 |
| 7 | public void set(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException | 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。如果底层字段是静态字段,则忽略 obj 变量;它可能为 null。 |
| 8 | public Object get(Object obj) throws IllegalArgumentException, IllegalAccessException | 返回指定对象上此 Field 表示的字段的值。如果底层字段是一个静态字段,则忽略 obj 变量;它可能为 null。 |
5、java.lang.reflect.Method
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public Annotation[] getDeclaredAnnotations() | 返回某方法上的所有注解类型 |
| 2 | public T getAnnotation(Class annotationClass) | 返回某方法上指定的注解类型 |
| 3 | public int getModifiers() | 以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。应该使用 Modifier 类对这些修饰符进行解码。 |
| 4 | public Class<?> getReturnType() | 返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型。 |
| 5 | public String getName() | 返回此 Field 对象表示的字段的名称。 |
| 6 | public Class<?>[] getParameterTypes() | 按照声明顺序返回一组 Class 对象,这些对象表示此Method对象所表示方法的形参类型。 |
| 7 | public Class<?>[] getExceptionTypes() | 回一组表示声明throws的异常类型的 Class 对象 |
| 8 | public void setAccessible(boolean flag) throws SecurityException | 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。 |
| 9 | public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException | 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 |
6、java.lang.reflect.Array
在java.lang.reflect包下还提供了一个Array类,Array对象可以代表所有的数组。程序可以通过使用Array类来动态的创建数组,操作数组元素等。
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | public static Object newInstance(Class<?> componentType, int length) throws NegativeArraySizeException | 创建一个具有指定的组件类型和长度的新数组。 |
| 2 | public static void set(Object array, int index, Object value) throws IllegalArgumentException, ArrayIndexOutOfBoundsException | 将array数组中[index]元素的值修改为value。 |
| 3 | public static Object get(Object array, int index) throws IllegalArgumentException, ArrayIndexOutOfBoundsException | 返回指定数组对象中索引组件的值。 |
15.3 类加载器
-
public static ClassLoader getSystemClassLoader():返回系统类加载器。
-
public static InputStream getSystemResourceAsStream(String name) :从加载类的搜索路径中加载指定名称的资源。
-
public ClassLoader getParent():返回父加载器。
-
public InputStream getResourceAsStream(String name):从加载类的搜索路径中加载指定名称的资源。
-
public Class<?> loadClass(String name):指定类型的全名称加载字节码数据,并返回Class对象。