Java笔记-下
1.Stream流
1. Stream流的作用
- 结合了Lambda表达式,简化集合、数组的操作
2. Stream的使用步骤
- 获取Stream流对象
- 使用中间方法处理数据
- 使用终结方法处理数据
3. 如何获取Stream流对象
- 单列集合:Collection中的默认方法stream
- 双列集合:不能直接获取
- 数组:Arrays工具类型中的静态方法stream
- 一堆零散的数据:Stream接口中的静态方法of
4. 常见方法
- 中间方法:filter,limit,skip,distinct,concat,map
- 终结方法:forEach,count,collect
2.异常
1.异常是什么?
程序中可能出现的问题
2.异常体系的最上层父类是谁?异常分为几类?
父类:Exception。
异常分为两类:编译时异常、运行时异常
3.编译时异常和运行时异常的区别?
编译时异常:没有继承RuntimeExcpetion的异常,直接继承于Excpetion。
编译阶段就会错误提示
运行时异常:RuntimeException本身和子类。
编译阶段没有错误提示,运行时出现的
运行时异常和编译时异常的区别?
- 编译时异常:除了RuntimeException和他的子类,其他都是编译时异常。
编译阶段需要进行处理,作用在于提醒程序员。
- 运行时异常:RuntimeException本身和所有子类,都是运行时异常。
编译阶段不报错,是程序运行时出现的。
一般是由于参数传递错误带来的问题。
异常的作用
- 作用一:异常是用来查询bug的关键参考信息
- 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
异常的处理方式
1.JVM默认的处理方式
把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
程序停止执行,下面的代码不会再执行了
2.自己处理(捕获异常)
目的:当代码出现异常时,可以让程序继续往下执行
ctrl + alt + t
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}
细节:
1:如果try中没有遇到问题,怎么执行?
答:会把try里面所有的代码全部执行完毕,不会执行catch里面的代码。
2:如果try中可能会遇到多个问题,怎么执行?
答:会写多个catch与之对应,父类异常需要写在下面。
3:如果try中遇到的问题没有被捕获,怎么执行?
答:相当于finally...catch白写了,当前异常会交给虚拟机处理。
4:如果try中遇到了问题,那么try下面的其他代码还会执行吗?
答:不会执行了。try中遇到问题,直接跳转到对应的catch,如果没有对应的catch与之匹配,则交给虚拟机处理。
3.抛出异常
在方法中,出现异常了,方法就没有继续运行下去的意义了,采取抛出处理
让改方法结束并告诉调用者出现的问题
自定义异常
1.定义异常类
2.写继承关系
3.空参构造
4.带参构造
意义:就是为了让控制台的报错信息更加的见名知意
3.File
1. File表示什么?
File对象表示路径,可以是文件、也可以是文件夹。
这个路径可以是存在的,也可以是不存在的
2. 绝对路径和相对路径是什么意思?
绝对路径是带盘符的。
相对路径是不带盘符的,默认到当前项目下去找。
3. File三种构造方法的作用?
public File(String pathname) 把字符串表示的路径变成File对象
public File(String parent, String child) 把父级路径和子级路径进行拼接
public File(File parent, String child) 把父级路径和子级路径进行拼接
File的常见的成员方法
1.判断获取:isDirectory,isFile,exists,length,getAbsolutePath,getPath,getName,lastModified
2.创建删除:createNewFile,mkidr, mkdirs,delete
3.获取并遍历:listFiles
当调用者File表示的路径:
不存在时,返回null
是文件时,返回null
是一个空文件夹时,返回一个长度为0的数组
是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
是需要权限才能访问的文件夹时,返回null
FIle类只能对文件本身进行操作,不能读写文件里面存储的数据
4.IO流
1. 什么是IO流?
存储和读取数据的解决方案
I: input O: output
流:像水流一样传输数据
2. IO流的作用?
用于读写数据(本地文件,网络)
3. IO流按照流向可以分类哪两种流?
输出流:程序 ➔ 文件
输入流:文件 ➔ 程序
4. IO流按照操作文件的类型可以分类哪两种流?
字节流:可以操作所有类型的文件
字符流:只能操作纯文本文件
5. 什么是纯文本文件?
用windows系统自带的记事本打开且能读懂的文件
txt文件,md文件,xml文件,lrc文件等
IO流的体系
字节流
FileOutputSream
可以把程序中的数据写到本地文件上,是字节流的基本流。
字节输出流的细节:
1. 创建字节输出流对象
细节1:参数是字符串表示的路径或者是File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
细节3:如果文件已经存在,则会默认清空文件
2. 写数据
细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
write(byte) write(bytes[]) write(bytes[], off, len)
3. 释放资源
每次使用完流之后都要释放资源
三步操作的细节
创建对象:文件存在、文件不存在、追加写入
写出数据:写出整数、写出字节数组、换行写
FileInputSream
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
字节输入流的细节:
1. 创建字节输入流对象
细节1:如果文件不存在,就直接报错。
2. 读数据
细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字
细节2:读到文件末尾了,read方法返回-1。
read(byte) read(bytes[])
FileInputSream循环读取
FileInputStream fis = new FileInputStream("a.txt");FileOutputStream fos = new FileOutputStream("b.txt");int len;byte[] buf = new byte[2];while ((len = fis.read(buf)) != -1) {fos.write(buf, 0, len);}fos.close();fis.close();
3. 释放资源
细节:每次使用完流之后都要释放资源
字符集
1. 在计算机中,任意数据都是以二进制的形式来存储的
2. 计算机中最小的存储单元是一个字节
3. ASCII字符集中,一个英文占一个字节
4. 简体中文版Windows,默认使用GBK字符集
5. GBK字符集完全兼容ASCII字符集
一个英文占一个字节,二进制第一位是0
一个中文占两个字节,二进制高位字节的第一位是1
Unicode字符集的UTF-8编码格式
一个英文占一个字节,二进制第一位是0,转成十进制是正数
一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数
如何不产生乱码?
1.不要用字节流读取文本文件
2.编码解码时使用同一个码表,同一个编码方式
Java中编码的方法
public byte[] getBytes() 使用默认方式进行编码
public byte[] getBytes(String charsetName) 使用指定方式进行编码
Java中解码的方法
String(byte[] bytes) 使用默认方式进行解码
String(byte[] bytes, String charsetName) 使用指定方式进行解码
字符流
1.字符流:字符流的底层其实就是字节流
字符流 = 字节流 + 字符集
2.特点:
输入流:一次读一个字节,遇到中文时,一次读多个字节
输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中
3.使用场景:对于纯文本文件进行读写操作
FileReader
FileReader fr = new FileReader("a.txt");//2.读取数据read()/*read()细节:1. read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个2. 在读取之后,方法的底层还会进行解码并转成十进制。最终把这个十进制作为返回值这个十进制的数据也表示在字符集上的数字英文:文件里面二进制数据 0110 0001read方法进行读取,解码并转成十进制97中文:文件里面的二进制数据 11100110 10110001 10001001read方法进行读取,解码并转成十进制27721我想看到中文汉字,就是把这些十进制数据,再进行强转就可以了*/int ch;while ((ch = fr.read())!=-1){System.out.print((char)ch);}fr.close();
FileReader fr = new FileReader("a.txt");char[] chars = new char[3];//read(chars):读取数据,解码,强转三步合并了,把强转之后的字符放到数组当中//空参的read + 强转类型转换int len;while ((len = fr.read(chars))!=-1){System.out.print(new String(chars,0,len));}fr.close();
FileWriter
void write(int c) 写出一个字符
void write(String str) 写出一个字符串
void write(String str, int off, int len) 写出一个字符串的一部分
void write(char[] cbuf) 写出一个字符数组
void write(char[] cbuf, int off, int len) 写出字符数组的一部分
字符流原理解析
① 创建字符输入流对象
底层:关联文件,并创建缓冲区(长度为8192的字节数组)
② 读取数据
1. 判断缓冲区中是否有数据可以读取
2. 缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区
如果文件中也没有数据了,返回-1
3. 缓冲区有数据:就从缓冲区中读取。
空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回
有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中
③输出数据
存入缓冲区,符合条件了再输出:
情况1:装满了(大于8192)
情况2:flush刷新
情况3:close