您的位置:首页 > 编程语言 > Java开发

Java学习笔记(Lambda表达式、File类、IO流)

2020-02-01 08:19 295 查看

Lambda表达式

Lambda表达式的标准格式:
由三部分组成:

  1. 一些参数
  2. 一个箭头
  3. 一段代码
    格式:
    (参数列表)->(一些重写方法的代码);
    解释说明格式:
    ():接口中抽象方法的参数列表,没有参数,就空着;有参数就写出参数,多个参数使用逗号分隔
    ->:传递的意思,把参数传递给方法体{}
    {}:重写接口的抽象方法的方法体

Lambda表达式:是可推导,可以省略
凡是根据上下文推导出来的内容,都可以省略书写
可以省略的内容:

  1. (参数列表):括号中参数列表的数据类型,可以省略不写
  2. (参数列表):括号中的参数如果只有一个,那么类型和()都可以省略
  3. {一些代码}:如果{}中的代码只有一行,无论是否有返回值,都可以省略({},return,分号)
    注意:要省略,{},return,分号必须一起省略

File类

概述

File类的静态成员变量:
static String pathSeparator
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 (windows是分号;,Linux是冒号:
static char pathSeparatorChar
与系统有关的路径分隔符。

static String separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 (windows是反斜杠\,Linux是正斜杠/
static char separatorChar
与系统有关的默认名称分隔符。

路径:
绝对路径:是一个完整的路径,是以盘符开始的路径
相对路径:是一个简化的路径,相对指的是相对于当前项目的根目录
注意:

  1. 路径不区分大小写
  2. 路径中的文件名分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠

File常用的方法
File类获取功能的方法:
String getAbsolutePath()
返回此抽象路径名的绝对路径名字符串。
String getPath()
将此抽象路径名转换为一个路径名字符串。
String getName()
返回由此抽象路径名表示的文件或目录的名称。

long length()
返回由此抽象路径名表示的文件的长度。
获取的是构造方法指定的文件的大小,以字节为单位
注意:文件夹是没有大小的概念的,不能获取文件夹的大小
如果构造方法中给出的路径不存在,那么length方法返回0

判断功能的方法:
boolean exists()
测试此抽象路径名表示的文件或目录是否存在。
boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。
boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。

创建删除的方法:
boolean createNewFile()
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
boolean delete()
删除此抽象路径名表示的文件或目录。
boolean mkdir()
创建单级文件夹。
boolean mkdirs()
既可以创建单级空文件夹,也可以创建多级文件夹

目录的遍历
String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
注意:
list方法和listFile方法遍历的是构造方法中给出的目录
如果构造方法中给出的目录的路径不存在,会抛出空指针异常
如果构造方法中给出的路径不是一个目录,也会抛出空指针异常

递归

递归:方法自己调用自己
递归的分类:
递归分为两种:直接递归和间接递归
直接递归称为方法自身调用自己
间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
注意事项:
递归一定要有条件限定,保证递归能够停止下来,否则就会发生栈内存溢出
在递归方法中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
递归的使用前提:
当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归

FileFilter过滤器

IO流

字节流

OutputStream:字节输出流

java.io.OutputStream:字节输出流
此抽象类是表示输出字节流的所有类的超类

定义了一些子类共性的成员方法:
void close()
关闭此输出流并释放与此流有关的所有系统资源。
void flush()
刷新此输出流并强制写出所有缓冲的输出字节。
void write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流。
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
abstract void write(int b)
将指定的字节写入此输出流。

java.io.FileOutputStream extends OutputStream
FileOutputStream:文件字节输出流
作用:把内存中的数据写入到硬盘的文件中

构造方法:
FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的输出文件流
FileOutputStream(File file)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流
参数:写入数据的目的
String name:目的是一个文件的路径
File file:目的地是一个文件
构造方法的作用:

  1. 创建一个FileOutputStream对象
  2. 会根据构造方法中传递的文件/文件路径,创建一个空的文件
  3. 会把FileOutputStream对象指向创建好的文件

写入数据的原理:
Java程序–>JVM(java虚拟机)–>os(操作系统)–>os调用写数据的方法–>把数据写入到文件中

字节输出流的使用步骤:

  1. 创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
  2. 调用FileOutputStream对象中的方法write,把数据写入到文件中
  3. 释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提升程序的效率)

文件存储原理

一次写多个字节的方法
void write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流。
一次写多个字节:

  1. 如果写的第一个字节是正数(0-127),那么显示的时候会查询ASCII表
  2. 如果写的第一个字节是负数,那第一个字节和第二个字节,两个字节组成一个中文显示,查询系统默认码表

void write(byte[] b, int off, int len)
把字节数组的一部分写入到文件中
int off:数组的开始索引
int len:写几个字节

写入字符的方法:可以使用String类中的方法把字符串,转换为字节数组
byte[ ] getBytes() 把字符串转换为字节数组

追加写/续写:使用两个参数的构造方法
FileOutputStream(String name, boolean append)
创建一个向具有指定 name 的文件中写入数据的输出文件流。
FileOutputStream(File file, boolean append)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
参数:
String name、File file:写入数据的目的地
boolean append:追加写开关
true:创建对象不会覆盖源文件,继续在文件的末尾追加写数据
false:创建一个新文件,覆盖源文件

写换行:写换行符号
windows:\r\n
linux:/n
mac:/r

字节输入流

java.io.InputStream:字节输入流
此抽象类是表示字节输入流的所有类的超类。
定义了所有子类共性的方法:
int read()
从此输入流中读取一个数据字节。
int read(byte[] b)
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
void close()
关闭此文件输入流并释放与此流有关的所有系统资源。

java.io.FileInputStream extends InputStream
FileInputStream :文件字节输入流
作用:吧硬盘文件中的数据,读取到内存中使用

构造方法:
FileInputStream(String name)
FileInputStream(File file)
参数:读取文件的数据源
String name:文件的路径
File file:文件
构造方法的作用:

  1. 会创建一个FileInputStream对象
  2. 会把FileInputStream对象指定构造方法中要读取的文件

读取数据的原理:
Java程序–>JVM(java虚拟机)–>os(操作系统)–>os调用读取数据的方法–>读取文件

字节输入流的使用步骤:

  1. 创建一个FileInputStream对象,构造方法中绑定要读取的数据源
  2. 使用FileInputStream对象中的read方法,读取文件
  3. 释放资源

字节输入流一次读取一个字节的原理

字节输入流一次读取多个字节的方法:

int read(byte[] b)
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
明确两件事情:

  1. 方法的参数byte[ ]的作用:起到缓冲作用,存储每次读取到的多个字节 ;数组的长度一般定义为1024(1kb)或者1024的整数倍
  2. 方法的返回值int是什么:每次读取的有效字节个数

String类的构造方法:
String(byte[] bytes) 把字节数组转换成字符串
String(byte[] bytes, int offset, int length)
通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。

字节输入流一次读取多个字节的原理

文件复制案例
原理:

文件复制的步骤:

  1. 创建 一个字节输入流对象,构造方法中绑定要读取的数据源
  2. 创建一个字节输出流对象,构造方法中绑定要写入的目的地
  3. 使用字节输入流对象中的方法read读取文件
  4. 使用字节输出流中的方法write,把读取到的字节写入到目的地的文件中
  5. 释放资源

代码实现

字符流

使用字节流读取中文文件
1个中文:GBK 占用两个字节 UTF-8 占用3个字节

java.io.Reader:字符输入流,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类

共性的成员方法:
int read()
读取单个字符。
int read(char[] cbuf)
一次读取多个字符,将字符读入数组。
void close()
关闭该流并释放与之关联的所有资源。

java.io.FileReader extends InputStreamReader extends Reader
FileReader:文件字符输入流
作用:吧硬盘文件的数据以字符的方式读取到内存中

构造方法:
FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader。
FileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新 FileReader。
参数:读取文件的数据源
String fileName:文件的路径
File file:一个文件
FileReader构造方法的作用:

  1. 创建一个FileReader构造方法的作用
  2. 会把FileReader对象指向要读取的文件

字符输入流的使用步骤:

  1. 创建FileReader对象,构造方法中绑定要读取的数据源
  2. 使用FileReader对象中的方法read读取文件
  3. 释放资源

java.io.Writer:字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类
共性的成员方法:
void write(int c)
写入单个字符。
void write(char[] cbuf)
写入字符数组。
abstract void write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void write(String str)
写入字符串。
void write(String str, int off, int len)
写入字符串的某一部分。
abstract void flush()
刷新该流的缓冲。
abstract void close()
关闭此流,但要先刷新它。

java.io.FileWriter extends OutputStreamWriter extends Writer
FileWriter:文件字符输出流
作用:把内存字符数据写入到文件中

构造方法:
FileWriter(File file)
根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(String fileName)
根据给定的文件名构造一个 FileWriter 对象。
参数:写入数据的目的地
String fileName:文件的路径
File file:是一个文件
构造方法的作用:

  1. 会创建一个FileWriter对象
  2. 会根据构造方法中传递的文件/文件的路径,创建文件
  3. 会把FileWriter对象指向创建好的文件

字符输出流的使用步骤:

  1. 创建FileWriter对象,构造方法中绑定要写入数据的目的地
  2. 使用FileWriter中的方法Write,把数据写入到内存缓冲区中(字符转换为字节的过程)
  3. 使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
  4. 释放资源(会先把内存缓冲区中的数据刷新到文件中)

flush方法和close方法的区别:

  1. flush方法:刷新缓冲区,流对象可以继续使用
  2. close方法:先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用

追加写/续写:使用两个参数的构造方法
FileWriter(String fileName, boolean append)
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
FileWriter(File file, boolean append)
根据给定的 File 对象构造一个 FileWriter 对象。
参数:
String fileName、File file:写入数据的目的地
boolean append:追加写开关
true:不会创建新的问价覆盖源文件,可以续写
false:创建一个新文件,覆盖源文件
写换行:写换行符号
windows:\r\n
linux:/n
mac:/r

属性集

java.util.Properties集合 extends Hashtable<k,v> implements Map<k,v>
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。
Properties 集合是一个唯一和IO流相结合的集合

  1. 可以使用Properties 集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
  2. 可以使用Properties 集合中的方法load,把硬盘中保存的文件(键值对),读取到集合中使用

属性列表中每个键及其对应值都是一个字符串。
Properties 集合是一个双列集合,key和value默认都是字符串

使用Properties 存储数据,遍历取出Properties 集合中的数据
Properties 集合有一些操作字符串的的特有方法
Object setProperty(String key, String value)
调用 Hashtable 的方法 put
String getProperty(String key)
通过key找到value值,此方法相当于Map集合中的get(key)方法
Set stringPropertyNames()
返回此属性列表中的键集,其中该键及其对应值是字符串 ,此方法相当于Map集合中的keySet方法

store方法
void store(OutputStream out, String comments)
void store(Writer writer, String comments)
参数:OutputStream字节输出流,不能写入中文
Writer writer字符输出流,可以写中文
String comments:注释,用来解释说明保存的文件是做什么用的,不能使用中文,会产生乱码,默认是Unicode编码,一般使用“空字符串”

使用步骤:

  1. 创建Properties 集合对象,添加数据
  2. 创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地
  3. 使用Properties 集合中的方法store,把集合中的临时数据,持久化的写入到硬盘中存储
  4. 释放资源

load方法:
void load(InputStream inStream)
void load(Reader reader)
参数:
InputStream inStream:字节输入流,不能读取含有中文的键值对
Reader reader字符输入流,能读取含有中文的键值对

使用步骤:

  1. 创建Properties 集合对象
  2. 使用Properties 集合对象中的方法load读取保存键值对的文件
  3. 遍历Properties 集合
    注意:
  4. 存储键值对的文件中,键与值默认的连接符号可以使用=,空格(其他符号)
  5. 存储键值对的文件中,可以使用#进行注释,被注释的键值对不会再被读取
  6. 存储键值对的文件中,键与值默认都是字符串,不用再加引号

缓冲流

BufferedOutputStream字节缓冲输出流

BufferedInputStream字节缓冲输入流

BufferedWriter:字符缓冲输出流
继承父类的共性成员方法:
void write(int c)
写入单个字符。
void write(char[] cbuf)
写入字符数组。
abstract void write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void write(String str)
写入字符串。
void write(String str, int off, int len)
写入字符串的某一部分。
abstract void flush()
刷新该流的缓冲。
abstract void close()
关闭此流,但要先刷新它。
构造方法:
BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)
创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
参数:
Writer out:字符输出流
我们可以传递FileWriter,缓冲流会给FileWriter增加一个缓冲区,提高FileWriter的写入效率
int sz:指定缓冲区的大小,不写默认大小

特有的成员方法:
void newLine()
写入一个行分隔符。 会根据不同的操作系统,获取不同的分隔符
换行:换行符号
windows:\r\n
linux:/n
mac:/r

使用步骤:

  1. 创建字符缓冲输出流对象,构造方法中传递字符输出流
  2. 调用字符缓冲输出流中的方法write,把数据写入到内存缓冲区中
  3. 调用字符缓冲输出流中的方法flush,把内存缓冲区的数据刷新到文件中
  4. 释放资源

BufferedReader:字符缓冲输入流
继承来自父类的共性方法:
int read()
读取单个字符。
int read(char[] cbuf)
一次读取多个字符,将字符读入数组。
void close()
关闭该流并释放与之关联的所有资源。

构造方法
BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
参数:
Reader in:字符输入流
我们可以传递FileReader,缓冲流会给FileReader增加一个缓冲区,提高FileReader的读取效率

特有的成员方法:
String readLine()
读取一个文本行。 ,读取一行数据
行的终止符号:通过下列字符之一即可认为某行已终止:换行 (’\n’)、回车 (’\r’) 或回车后直接跟着换行(\r\n)。
返回值:包含改行内容的字符串,不包含任何终止符,如果已达到末尾,则返回null

使用步骤:

  1. 创建字符缓冲输入流对象,构造方法中传递字符输入流
  2. 使用字符缓冲输入流对象中的方法read/readline读取文本
  3. 释放资源

转换流

转换流的原理

OutputStreamWriter
java.io.OutputStreamWriter extends Writer
OutputStreamWriter:是字符流通向字节的桥梁,可使用指定的charset将要写入流中的字符编码成字节。(编码:把能看懂的变成看不懂)
继承自父类的共性成员方法:
void write(int c)
写入单个字符。
void write(char[] cbuf)
写入字符数组。
abstract void write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void write(String str)
写入字符串。
void write(String str, int off, int len)
写入字符串的某一部分。
abstract void flush()
刷新该流的缓冲。
abstract void close()
关闭此流,但要先刷新它。

构造方法:
OutputStreamWriter(OutputStream out)
创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter。
参数:
OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK…

使用步骤:

  1. 创建OutputStreamWrite对象,构造方法中传递字节输出流和指定的编码表名称
  2. 使用OutputStreamWrite对象中的方法write,把字符转换为字节存储缓冲区中(编码)
  3. 使用OutputStreamWrite对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
  4. 释放资源

InputStreamReader
java.io.InputStreamReader extends Reader
InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。(解码:把看不懂的变成能看懂的)

继承自父类的共性成员方法:
int read()
读取单个字符。
int read(char[] cbuf)
一次读取多个字符,将字符读入数组。
void close()
关闭该流并释放与之关联的所有资源。

构造方法:
InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
参数:
InputStream in:字节输入流,用来读取文件中保存的字节
String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK…

使用步骤:

  1. 创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
  2. 使用InputStreamReader对象中的方法read读取文件
  3. 释放资源
    注意事项:
    构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码

序列化

ObjectOutputStream:对象的序列化流
java.io.ObjectOutputStream extends OutputStream

作用:把对象以流的方式写入到文件中保存

构造方法:
ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream。
参数:
OutputStream out 字节输出流

特有的成员方法:
void writeObject(Object obj)
将指定的对象写入 ObjectOutputStream。

使用步骤:

  1. 创建ObjectOutputStream对象,构造方法中传递字节输出流
  2. 使用ObjectOutputStream对象中特有的方法writeObject,把对象写入到文件中
  3. 释放资源

序列化和反序列化的时候,会抛出NotSerializableException没有序列化异常
类通过实现java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
Serializable接口也叫标记型接口
要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记
当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记
有:就可以进行序列化
没有就会抛出NotSerializableException异常

ObjectInputStream:对象的反序列化流
java.io.ObjectInputStream extends InputStream
作用:把文件中保存的对象,以流的形式读取出来使用

构造方法:
ObjectInputStream(InputStream in)
创建从指定 InputStream 读取的 ObjectInputStream。
参数:InputStream in:字节输入流
特有的成员方法:
Object readObject()
从 ObjectInputStream 读取对象。

使用步骤:

  1. 创建ObjectInputStream对象,构造方法中传递字节输入流
  2. 使用ObjectInputStream对象中特有的方法readObject读取保存对象的文件
  3. 释放资源
  4. 使用读取出来的对象(打印)

readObject方法声明抛出了classNotFoundException(class文件找不到异常)
当不存在对象的class文件时抛出此异常
反序列化的前提:

  1. 类必须实现Serializable
  2. 必须存在类对应的class文件

transient关键字
被transient修饰的成员变量,不能被序列化

打印流

java.io.PrintStream:打印流
PrintStream 为其他输出流添加了功能,使他们能够方便地打印各种数据值表示形式

PrintStream特点:

  1. 只负责数据的输出,不负责数据的读取
  2. 与其他输出流不同,PrintStream永远不会抛出IOException
  3. 有特有的方法,print,println
    void print(任意类型的值)
    void pintln(任意类型的值并换行)

构造方法:
PrintStream(File file) :输出的目的地是一个文件
PrintStream(OutputStream out) :输出的目的地是一个字节输出流
PrintStream(String fileName):输出的目的地是一个文件路径

PrintStream extends OutputStream
继承自父类的方法:
void close()
关闭此输出流并释放与此流有关的所有系统资源。
void flush()
刷新此输出流并强制写出所有缓冲的输出字节。
void write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流。
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
abstract void write(int b)
将指定的字节写入此输出流。

注意:
如果使用继承自父类的write方法写数据,那么查看数据的时候会查询编码表 97->a
如果使用自己特有的方法print/println方法写数据,写的数据原样输出 97->97

可以改变输出语句的目的地(打印流的流向)
输出语句,默认在控制台输出
使用System.setOut方法改变输出语句的目的地改为参数中传递的打印流的目的地
static void setOut(PrintStream out)
重新分配“标准”输出流

在这里插入代码片

  • 点赞
  • 收藏
  • 分享
  • 文章举报
llllllll__ 发布了18 篇原创文章 · 获赞 0 · 访问量 115 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: