最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
public class DiGuiDemo {
public static void main(String[] args) {
//回顾不死神兔问题,求第20个月兔子的对数
//每个月的兔子对数:1,1,2,3,5,8,…
System.out.println(f(20));
}
/*
递归解决问题,首先就是要定义一个方法:
定义一个方法f(n):表示第n个月的兔子对数
那么,第n-1个月的兔子对数该如何表示呢?f(n-1)
同理,第n-2个月的兔子对数该如何表示呢?f(n-2)
StackOverflowError:当堆栈溢出发生时抛出一个应用程序递归太深
*/
public static int f(int n) {
if(n1 || n2) {
return 1;
} else {
return f(n - 1) + f(n - 2);
}
}
}
注意事项:
-
递归一定**要有出口****,**否则内存溢出
-
递归虽然有出口,但是递归的**次数也不宜过多****,**否则内存溢出
IO流
===
概述:
-
IO:输入/输出(Input/Output)
-
流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
-
IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载
分类:
-
字节流、字节缓冲流
-
字节输入流;字节输出流;字节缓冲输入流;字节缓冲输出流
-
字符流、字符缓冲流
-
字符输入流;字符输出流;字符缓冲输入流;字符缓冲输出流
-
特殊操作流
-
标准输入输出流;打印流;对象序列化流;对象反序列化流
使用场景:
-
如果操作的是纯文本文件,优先使用字符流
-
如果操作的是图片、视频、音频等二进制文件。优先使用字节流
-
如果不确定文件类型,优先使用字节流。字节流是万能的流
字节流、字节缓冲流
抽象基类:
-
InputStream:这个抽象类是表示字节输入流的所有类的超类
-
OutputStream:这个抽象类是表示字节输出流的所有类的超类
-
子类名特点:子类名称都是以其父类名作为子类名的后缀
**字节输出流:FileOutputStream(String name)**创建文件输出流以指定的名称写入文件
字节输出流写数据的步骤:
-
创建字节输出流对象 (调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
-
调用字节输出流对象的写数据方法
-
释放资源 (关闭此文件输出流并释放与此流相关联的任何系统资源)
写数据的三种方式:
| 方法名 | 说明 |
| — | — |
| void write(int b) | 将指定的字节写入此文件输出流 一次写一个字节数据 |
| void write(byte[] b) | 将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据 |
| void write(byte[] b, int off, int len) | 将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据 |
写数据实现换行:不同系统下实现的换行代码不同
-
windows:\r\n
-
linux:\n
-
mac:\r
追加写入数据:
-
public FileOutputStream(String name,boolean append)
-
创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头
写数据加异常处理:
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}finally{
执行所有清除操作;
}
finally特点:被finally控制的语句一定会执行,除非JVM退出
异常处理案例:
public class FileOutputStreamDemo {
public static void main(String[] args) {
//加入finally来实现释放资源
FileOutputStream fos = null;
//异常处理
try {
//设置文件路径(相对路径)
fos = new FileOutputStream("myByteStream\\fos.txt");
//写入数据到文件
fos.write("hello".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
//判断fos是否为null
if(fos != null) {
//异常处理
try {
//释放资源
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
读数据:一次读一个字节数据、一次读一个字节数组数据
**字节输入流:FileInputStream(String name)**通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名
字节输入流读取数据的步骤:
-
创建字节输入流对象
-
调用字节输入流对象的读数据方法
-
释放资源
一次读一个字节数组的方法:
-
public int read(byte[] b):从输入流读取最多b.length个字节的数据
-
返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
字节流读数据案例:
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
//myByteStream\fos.txt表示要读取的文件(相对路径)
FileInputStream fis = new FileInputStream(“myByteStream\fos.txt”);
//一次读一个字节数据
int by;
while ((by=fis.read())!=-1) {
System.out.print((char)by);
}
//一次读一个字节数组数据
byte[] bys = new byte[1024]; //1024及其整数倍
int len;
while ((len=fis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
//释放资源
fis.close();
}
}
字节流图解:
字节缓冲流:
-
**BufferOutputStream:**该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
-
**BufferedInputStream:**创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
构造方法:
| 方法名 | 说明 |
| — | — |
| BufferedOutputStream(OutputStream out) | 创建字节缓冲输出流对象 |
| BufferedInputStream(InputStream in) | 创建字节缓冲输入流对象 |
字节缓冲流读写数据案例:
public class BufferStreamDemo {
public static void main(String[] args) throws IOException {
//字节缓冲输出流:BufferedOutputStream(OutputStream out)
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“myByteStream\bos.txt”));
//写数据
bos.write(“hello\r\n”.getBytes());
bos.write(“world\r\n”.getBytes());
//释放资源
bos.close();
//字节缓冲输入流:BufferedInputStream(InputStream in)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“myByteStream\bos.txt”));
//一次读取一个字节数据
int by;
while ((by=bis.read())!=-1) {
System.out.print((char)by);
}
//一次读取一个字节数组数据
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
//释放资源
bis.close();
}
}
字符流、字符缓冲流
抽象基类:
-
Reader:字符输入流的抽象类
-
Writer:字符输出流的抽象类
字符流中的编码解码:
-
InputStreamReader:是从字节流到字符流的桥梁。它读取字节,并使用指定的编码将其解码为字符,它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
-
OutputStreamWriter:是从字符流到字节流的桥梁。使用指定的编码将写入的字符编码为字节,它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
构造方法:
| 方法名 | 说明 |
| — | — |
| InputStreamReader(InputStream in) | 使用默认字符编码创建InputStreamReader对象 |
| InputStreamReader(InputStream in,String chatset) | 使用指定的字符编码创建InputStreamReader对象 |
| OutputStreamWriter(OutputStream out) | 使用默认字符编码创建OutputStreamWriter对象 |
| OutputStreamWriter(OutputStream out,String charset) | 使用指定的字符编码创建OutputStreamWriter对象 |
写数据的五种方式、刷新和关闭 :
| 方法名 | 说明 |
| — | — |
| void write(int c) | 写一个字符 |
| void write(char[] cbuf) | 写入一个字符数组 |
| void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
| void write(String str) | 写一个字符串 |
| void write(String str, int off, int len) | 写一个字符串的一部分 |
| 刷新和关闭 |
| flush() | 刷新流,之后还可以继续写数据 |
| close() | 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
读数据的两种方式:
| 方法名 | 说明 |
| — | — |
| int read() | 一次读一个字符数据 |
| int read(char[] cbuf) | 一次读一个字符数组数据 |
PS:字符流写数据可直接根据方法实现,字符流读数据和字节流读数据的代码大同小异 (基本一样),可参考上述代码自行实现。
字符流图解:
字符缓冲流:
-
BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
-
BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途
构造方法:
| 方法名 | 说明 |
| — | — |
| BufferedWriter(Writer out) | 创建字符缓冲输出流对象 |
| BufferedReader(Reader in) | 创建字符缓冲输入流对象 |
特有功能:
| 方法名 | 说明 |
| — | — |
| void newLine() | 写一行行分隔符,行分隔符字符串由系统属性定义 |
| String readLine() | 读一行文字。 结果包含行的内容的字符串,不包括任何行终止字符如果流的结尾已经到达,则为null |
字符缓冲流读写数据案例:使用特有功能
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
//创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter(“myCharStream\bw.txt”));
最后
由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。
本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
BufferedWriter(new FileWriter(“myCharStream\bw.txt”));
最后
由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。
[外链图片转存中…(img-Li3eG8uU-1715570205589)]
本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
[外链图片转存中…(img-g7vSxGaC-1715570205589)]
[外链图片转存中…(img-uAkcn4PC-1715570205590)]