在上面的继承关系图中可以看出:
-
Reader 是所有的输入字符流的父类,它是一个抽象类。
-
CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。
-
BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。
-
FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。
-
InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。
5.字符输出流Writer
在上面的关系图中可以看出:
-
Writer 是所有的输出字符流的父类,它是一个抽象类。
-
CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。PipedWriter 是向与其它线程共用的管道中写入数据,
-
BufferedWriter 是一个装饰器为Writer 提供缓冲功能。
-
PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。
-
OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream 极其类似,后面会有它们的对应图。
6.字符流的输入与输出的对应
7.字符流与字节流转换
转换流的特点:
-
其是字符流和字节流之间的桥梁
-
可对读取到的字节数据经过指定编码转换成字符
-
可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
-
当字节和字符之间有转换动作时;
-
流操作的数据需要编码或解码时。
具体的对象体现:
-
InputStreamReader:字节到字符的桥梁
-
OutputStreamWriter:字符到字节的桥梁
这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。
8.File类
File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
9.RandomAccessFile类
该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区(字符数组),通过内部的指针来操作字符数组中的数据。 该对象特点:
-
该对象只能操作文件,所以构造函数接收两种类型的参数:a.字符串文件路径;b.File对象。
-
该对象既可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式
实例:
File:
package com.nf147.manage.Test;
import java.io.File;
public class file {
public static void main(String[] args) {
/*
File 类对象可以管理文件和文件夹
*/
//创建一个File对象(传入文件或文件夹的路径及名称)
//创建一个File对象管理文件夹
File file = new File(“E:\File”);
//exists()方法判断文件或文件夹是否存在
if (!file.exists()) {
//创建文件夹
if (file.mkdir()) {
System.out.println(“创建成功”);
} else {
System.out.println(“创建失败”);
}
}
File dir = new File(“E:\/a/b/c”);
//mkdirs创建文件夹可以将父目录一块创建
if (dir.mkdirs()) {
System.out.println(“创建成功”);
} else {
System.out.println(“创建失败”);
}
System.out.println(“文件夹名称:” + dir.getName());
System.out.println(“文件夹所在的路径及名称:” + dir.getPath());
System.out.println(“文件是否可读:” + dir.canRead());
System.out.println(“文件是否可写:” + dir.canWrite());
System.out.println(“文件 是否隐藏:” + dir.isHidden());
}
}
InputStream :
package Demo;
import java.io.*;
public class TestFileINputStream {
public static void main(String[] args)throws IOException {
//创建文件对象
File file=new File(“E:\第二学期\abc.txt”);
//根据文件对象创建输入流对象
FileInputStream fs=new FileInputStream(file);
//定义字节数组,用于保存每次读取的内容
byte[]b=new byte[10];
//定义变量保存每次读取的字节数
int len;
//read方法读取文件里的内容,该方法会返回读取的字节数
//如果读取不到东西,则返回-1
while((len=fs.read(b)) != -1)
{
System.out.println(new String(b,0,len));
}
//释放资源
fs.close();
}
}
OutpuStream:
package Demo;
import java.io.*;
public class TestFileOutpuStream {
public static void main(String[] args) throws IOException { //异常抛出不处理
//创建对象时,只给一个文件路径名称参数,则写入信息时会将原来的信息覆盖
//FileOutputStream file=new FileOutputStream(“E:\第二学期\abc.txt”);//创建输出对象
//第二个参数设置写入的内容是否采用追加的方式
FileOutputStream file=new FileOutputStream(“E:\第二学期\text.txt”,true);
//如果文件在磁盘上不存在,会先创建该文件,再写入内容
//只能输出byte数组,所有将字符串变为byte数组
file.write(“大家好!\r\n”.getBytes());
//使用完了记住要关闭流,释放资源
file.close();
System.out.println(“程序结束”);
}
}
FileReader:
package Demo1;
import java.io.*;
public class TestFileReader {
public static void main(String[] args)throws IOException {
//创建输入的字符流
FileReader fr=new FileReader(“E:\第二学期\file.txt”);
char[]chs=new char[10];//创建字符数组
int len; //定义变量保存每次读取的字符数
//read方法读取文件里的内容,该方法会返回读取的字节数
//如果读取不到东西,则返回-1
while((len=fr.read(chs))!=-1)
{
System.out.print(new String(chs,0,len));
}
fr.close();
}
}
FileWriter:
package Demo1;
import java.io.*;
public class TestFileWriter {
public static void main(String[] args)throws IOException {
//创建输出字符流对象
FileWriter fw=new FileWriter(“E:\第二学期\file.txt”,true);
fw.write(“大家好!\r\n”);//调用write的方法输出
fw.write(“好好学习,天天向上\r\n”);
fw.close();//关闭输出流
System.out.println(“文件写入完毕”);
}
}
BufferedReader:
package Demo2;
import java.io.*;
public class TestBufferedReader {
public static void main(String[] args)throws IOException {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)
学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)
除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)
[外链图片转存中…(img-73WC3yZy-1711983087255)]
除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!