泛型、IO流

# 十二、Java 8新增的Predicate操作Collection集合
​        Java 8 起为 Collection 集合新增了一个 removeIf(Predicate filter) 方法,该方法将会批量删除符合 filter 条件的所有元素。该方法需要一个 Predicate 对象作为参数,Predicate 也是函数式接口,因此可使用 Lambda 表达式作为参数
# 十三、Java 8新增的Stream操作Collection集合
​        Java 8 还新增了 Stream、IntStream、LongStream、DoubleStream 等流式 API,这些 API 代表多个支持串行和并行聚集操作的元素。上面 4 个接口中,Stream 是一个通用的流接口,而 IntStream、LongStream、 DoubleStream 则代表元素类型为 int、long、double 的流。
独立使用 Stream 的步骤如下:
​                1、使用 Stream 或 XxxStream 的 builder() 类方法创建该 Stream 对应的 Builder。
​                2、重复调用 Builder 的 add() 方法向该流中添加多个元素。
​                3、调用 Builder 的 build() 方法获取对应的 Stream。
​                4、调用 Stream 的聚集方法
十四、泛型
## 1、泛型集合
​        泛型本质上是提供类型的“类型参数”,也就是参数化类型。我们可以为类、接口或方法指定一个类型参数,通过这个参数限制操作的数据类型,从而保证类型转换的绝对安全。
## 2、泛型类
​        除了可以定义泛型集合之外,还可以直接限定泛型类的类型参数。语法格式如下:
```java
public class class_name<data_type1,data_type2,…>{}
​        其中,class_name 表示类的名称,data_ type1 等表示类型参数。Java 泛型支持声明一个以上的类型参数,只需要将类型用逗号隔开即可。
## 3、泛型方法
​        到目前为止,我们所使用的泛型都是应用于整个类上。泛型同样可以在类中包含参数化的方法,而方法所在的类可以是泛型类,也可以不是泛型类。也就是说,是否拥有泛型方法,与其所在的类是不是泛型没有关系。
## 4、泛型的高级用法
​        泛型的用法非常灵活,除在集合、类和方法中使用外,本节将从三个方面介绍泛型的高级用法,包括限制泛型可用类型、使用类型通配符、继承泛型类和实现泛型接口。
**1. 限制泛型可用类型**

​        在 Java 中默认可以使用任何类型来实例化一个泛型类对象。当然也可以对泛型类实例的类型进行限制,语法格式如下
```java
class 类名称<T extends anyClass
​        其中,anyClass 指某个接口或类。使用泛型限制后,泛型类的类型必须实现或继承 anyClass 这个接口或类。无论 anyClass 是接口还是类,在进行泛型限制时都必须使用 extends 关键字


# I/O 流
# 一、流的概念
​        在 Java 中所有数据都是使用流读写的。流是一组有序的数据序列,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种
## 1、什么是输入/输出流
​        Java 程序通过流来完成输入/输出,所有的输入/输出以流的形式处理
数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。
​                1、按照流的方向主要分为输入流和输出流两大类。
​                2、数据流按照数据单位的不同分为字节流和字符流。
​                3、按照功能可以划分为节点流和处理流。
    Java 流相关的类都封装在 java.io 包中,而且每个数据流都是一个对象。所有输入流类都是 InputStream 抽象类(字节输入流)和 Reader 抽象类(字符输入流)的子类。其中 InputStream 类是字节输入流的抽象类,是所有字节输入流的父类
## 3、输出流
​        在 Java 中所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。其中 OutputStream 类是字节输出流的抽象类,是所有字节输出流的父类
# 二、系统流

​        每个 Java 程序运行时都带有一个系统流,系统流对应的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流,分别通过 in、out 和 err 变量来引用。这 3 个系统流如下所示:
​                **System.in:**标准输入流,默认设备是键盘。
​                **System.out:**标准输出流,默认设备是控制台。
​                **System.err:**标准错误流,默认设备是控制台。
​        以上变量的作用域为 public 和 static,因此在程序的任何部分都不需引用 System 对象就可以使用它们
# 三、字符编码介绍
​        计算机中,任何的文字都是以指定的编码方式存在的,在 Java 程序的开发中最常见的是 ISO8859-1、GBK/GB2312、Unicode、 UTF 编码

# 四、File类(文件操作类)
## 1、File类简介
​        在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过 File 类来完成。File 类定义了一些方法来操作文件,如新建、删除、重命名文件和目录等。
File 类不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。
​        File 类提供了如下三种形式构造方法。
​                **File(String path):**如果 path 是实际存在的路径,则该 File 对象表示的是目录;如果 path 是文件名,则该 File 对象表示的是文        件。
​                **File(String path, String name):**path 是路径名,name 是文件名。
​                **File(File dir, String name):**dir 是路径对象,name 是文件名。
## 2、获取文件属性
​        在 Java 中获取文件属性信息的第一步是先创建一个 File 类对象并指向一个已存在的文件, 然后调用表 1 中的方法进行操作
## 3、创建和删除文件
​        File 类不仅可以获取已知文件的属性信息,还可以在指定路径创建文件,以及删除一个文件。创建文件需要调用 createNewFile() 方法,删除文件需要调用 delete() 方法。无论是创建还是删除文件通常都先调用 exists() 方法判断文件是否存在
## 4、创建和删除目录
​        File 类除了对文件的创建和删除外,还可以创建和删除目录。创建目录需要调用 mkdir() 方法,删除目录需要调用 delete() 方法。无论是创建还是删除目录都可以调用 exists() 方法判断目录是否存在
## 5、遍历目录

​        通过遍历目录可以在指定的目录中查找文件,或者显示所有的文件列表。File 类的 list() 方法提供了遍历目录功能,该方法有如下两种重载形式。

**1. String[] list()**
​        该方法表示返回由 File 对象表示目录中所有文件和子目录名称组成的字符串数组,如果调用的 File 对象不是目录,则返回 null。
​        **提示:**list() 方法返回的数组中仅包含文件名称,而不包含路径。但不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。
**2. String[] list(FilenameFilter filter)**
​        该方法的作用与 list() 方法相同,不同的是返回数组中仅包含符合 filter 过滤器的文件和目录,如果 filter 为 null,则接受所有名称。
# 五、RandomAccessFile类

## 1、动态读取文件内容
​        所谓动态读取是指从文件的任意位置开始访问文件,而不是必须从文件开始位置读取到文件末尾。动态读取需要用到 Java 中的 RandomAccessFile 类。
RandomAccessFile 是 Java 输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。由于 RandomAccessFile 可以从任意位置访问文件,所以在只需要访问文件部分内容的情况下,使用 RandonAccessFile 类是一个很好的选择。
# 六、字节流的使用
## 1、字节输入流
​        InputStream 是 Java 所有字节输入流类的父类,OutputStream 是 Java 所有字节输出流类的父类,它们都是一个抽象类,因此继承它们的子类要重新定义父类中的抽象方法。
​        InputStream 类及其子类的对象表示字节输入流,InputStream 类的常用子类如下。
​                **ByteArrayInputStream 类:**将字节数组转换为字节输入流,从中读取字节。
​                **FileInputStream 类:**从文件中读取数据。
​                **PipedInputStream 类:**连接到一个 PipedOutputStream(管道输出流)。
​                **SequenceInputStream 类:**将多个字节输入流串联成一个字节输入流。
​                **ObjectInputStream 类:**将对象反序列化。
## 2、字节输出流
​        OutputStream 类及其子类的对象表示一个字节输出流。OutputStream 类的常用子类如下。
​                **ByteArrayOutputStream 类:**向内存缓冲区的字节数组中写数据。
​                **FileOutputStream 类:**向文件中写数据。
​                **PipedOutputStream 类:**连接到一个 PipedlntputStream(管道输入流)。
​                **ObjectOutputStream 类:**将对象序列化。
## 3、字节数组输入流
ByteArrayInputStream 类可以从内存的字节数组中读取数据,该类有如下两种构造方法重载形式。
​        1、ByteArrayInputStream(byte[] buf):创建一个字节数组输入流,字节数组类型的数据源由参数 buf 指定。
​        2、ByteArrayInputStream(byte[] buf,int offse,int length):创建一个字节数组输入流,其中,参数 buf 指定字节数组类型的数据源,offset 指定在数组中开始读取数据的起始下标位置,length 指定读取的元素个数。
## 4、字节数组输出流
​        ByteArrayOutputStream 类可以向内存的字节数组中写入数据,该类的构造方法有如下两种重载形式。
​                1、ByteArrayOutputStream():创建一个字节数组输出流,输出流缓冲区的初始容量大小为 32 字节。
​                2、ByteArrayOutputStream(int size):创建一个字节数组输出流,输出流缓冲区的初始容量大小由参数 size 指定。
​        ByteArrayOutputStream 类中除了有前面介绍的字节输出流中的常用方法以外,还有如下两个方法。
​                1、intsize():返回缓冲区中的当前字节数。
​                2、byte[] toByteArray():以字节数组的形式返回输出流中的当前内容。
## 5、文件输入流
​        FileInputStream 是 Java 流中比较常用的一种,它表示从文件系统的某个文件中获取输入字节。通过使用 FileInputStream 可以访问文件中的一个字节、一批字节或整个文件。
​        在创建 FileInputStream 类的对象时,如果找不到指定的文件将拋出 FileNotFoundException 异常,该异常必须捕获或声明拋出。
​        FileInputStream 常用的构造方法主要有如下两种重载形式。
​                **FileInputStream(File file):**通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象         file 指定。
​                **FileInputStream(String name):**通过打开一个到实际文件的链接来创建一个 FileInputStream,该文件通过文件系统中的路        径名 name 指定。
## 6、文件输出流
​        FileOutputStream 类继承自 OutputStream 类,重写和实现了父类中的所有方法。FileOutputStream 类的对象表示一个文件字节输出流,可以向流中写入一个字节或一批字节。在创建 FileOutputStream 类的对象时,如果指定的文件不存在,则创建一个新文件;如果文件已存在,则清除原文件的内容重新写入。
FileOutputStream 类的构造方法主要有如下 4 种重载形式。
        **FileOutputStream(File file):**创建一个文件输出流,参数 file 指定目标文件。
        **FileOutputStream(File file,boolean append):**创建一个文件输出流,参数 file 指定目标文件,append 指定是否将数据添加到目标文件的内容末尾,如果为 true,则在末尾添加;如果为 false,则覆盖原有内容;其默认值为 false。
        **FileOutputStream(String name):**创建一个文件输出流,参数 name 指定目标文件的文件路径信息。
        **FileOutputStream(String name,boolean append):**创建一个文件输出流,参数 name 和 append 的含义同上。
# 七、字符流的使用
​        尽管 Java 中字节流的功能十分强大,几乎可以直接或间接地处理任何类型的输入/输出操作,但利用它却不能直接操作 16 位的 Unicode 字符。这就要用到字符流。
## 1、字符输入流

​        Reader 类是所有字符流输入类的父类,该类定义了许多方法,这些方法对所有子类都是有效的。

​        Reader 类的常用子类如下。
​                **CharArrayReader 类:**将字符数组转换为字符输入流,从中读取字符。
​                **StringReader 类:**将字符串转换为字符输入流,从中读取字符。
​                **BufferedReader 类:**为其他字符输入流提供读缓冲区。
​                **PipedReader 类:**连接到一个 PipedWriter。
​                **InputStreamReader 类:**将字节输入流转换为字符输入流,可以指定字符编码
## 2、字符输出流
​        与 Reader 类相反,Writer 类是所有字符输出流的父类,该类中有许多方法,这些方法对继承该类的所有子类都是有效的。
​        Writer 类的常用子类如下。
​                **CharArrayWriter 类:**向内存缓冲区的字符数组写数据。
​                **StringWriter 类:**向内存缓冲区的字符串(StringBuffer)写数据。
​                **BufferedWriter 类:**为其他字符输出流提供写缓冲区。
​                **PipedWriter 类:**连接到一个 PipedReader。
​                **OutputStreamReader 类:**将字节输出流转换为字符输出流,可以指定字符编码。
## 3、字符文件输入流
为了读取方便,Java 提供了用来读取字符文件的便捷类——FileReader。该类的构造方法有如下两种重载形式。
​        1、FileReader(File file):在给定要读取数据的文件的情况下创建一个新的 FileReader 对象。其中,file 表示要从中读取数据的文件。
​        2、FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新 FileReader 对象。其中,fileName 表示要从中读取数据的文件的名称,表示的是一个文件的完整路径。
## 4、字符文件输出流
Java 提供了写入字符文件的便捷类——FileWriter,该类的构造方法有如下 4 种重载形式。
​        1、FileWriter(File file):在指定 File 对象的情况下构造一个 FileWriter 对象。其中,file 表示要写入数据的 File 对象。
​        2、FileWriter(File file,boolean append):在指定 File 对象的情况下构造一个 FileWriter 对象,如果 append 的值为 true,则将字节写入文件末尾,而不是写入文件开始处。
​        3、FileWriter(String fileName):在指定文件名的情况下构造一个 FileWriter 对象。其中,fileName 表示要写入字符的文件名,表示的是完整路径。
​        4、FileWriter(String fileName,boolean append):在指定文件名以及要写入文件的位置的情况下构造 FileWriter 对象。其中,append 是一个 boolean 值,如果为 true,则将数据写入文件末尾,而不是文件开始处。
## 5、字符缓冲区输入流
​        BufferedReader 类主要用于辅助其他字符输入流,它带有缓冲区,可以先将一批数据读到内存缓冲区。接下来的读操作就可以直接从缓冲区中获取数据,而不需要每次都从数据源读取数据并进行字符编码转换,这样就可以提高数据的读取效率。
BufferedReader 类的构造方法有如下两种重载形式。
​        1、BufferedReader(Reader in):创建一个 BufferedReader 来修饰参数 in 指定的字符输入流。
​        2、BufferedReader(Reader in,int size):创建一个 BufferedReader 来修饰参数 in 指定的字符输入流,参数 size 则用于指定缓冲区的大小,单位为字符
## 6、字符缓冲区输出流
​        BufferedWriter 类主要用于辅助其他字符输出流,它同样带有缓冲区,可以先将一批数据写入缓冲区,当缓冲区满了以后,再将缓冲区的数据一次性写到字符输出流,其目的是为了提高数据的写效率。
BufferedWriter 类的构造方法有如下两种重载形式。
​        1、BufferedWriter(Writer out):创建一个 BufferedWriter 来修饰参数 out 指定的字符输出流。
​        2、BufferedWriter(Writer out,int size):创建一个 BufferedWriter 来修饰参数 out 指定的字符输出流,参数 size 则用于指定缓冲区的大小,单位为字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值