最后
小编利用空余时间整理了一份《MySQL性能调优手册》,初衷也很简单,就是希望能够帮助到大家,减轻大家的负担和节省时间。
关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。
这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)!
写数据的三种方式:
| 方法名 | 说明 |
| — | — |
| 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”));
//写数据
for (int i = 0; i < 10; i++) {
bw.write(“hello” + i);
bw.newLine(); //换行
bw.flush(); //刷新
}
//释放资源
bw.close();
//创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader(“myCharStream\bw.txt”));
//读数据
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
//释放资源
br.close();
}
}
特殊操作流
标准输入输出流:
-
System类中有两个静态的成员变量
-
**public static final InputStream in:标准输入流。**通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源
-
**public static final PrintStream out:标准输出流。**通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标
-
输出语句的本质:是一个标准的输出流
-
PrintStream ps = System.out;
-
PrintStream类有的方法,System.out都可以使用
打印流特点:
-
只负责输出数据,不负责读取数据
-
永远不会抛出IOException
-
有自己的特有方法
**分类:**字节打印流 (PrintStream);字符打印流 (PrintWriter)
字节打印流:
-
PrintStream(String fileName):使用指定的文件名创建新的打印流
-
使用继承父类的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出
-
可以改变输出语句的目的地,public static void setOut(PrintStream out):重新分配“标准”输出流
字符打印流构造方法:
| 方法名 | 说明 |
| — | — |
| PrintWriter(String fileName) | 使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新 |
| PrintWriter(Writer out, boolean autoFlush) | 创建一个新的PrintWriter out:字符输出流 autoFlush: 一个布尔值,如果为真,则println , printf ,或format方法将刷新输出缓冲区 |
对象序列化概述:
-
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
-
这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息
-
字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
-
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
**对象序列化流 (ObjectOutputStream):**将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象
构造方法:ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream
序列化对象的方法:void writeObject(Object obj):将指定的对象写入ObjectOutputStream
注意事项:
-
一个对象要想被序列化,该对象所属的类必须实现Serializable接口
-
Serializable是一个标记接口,实现该接口,不需要重写任何方法
总结
这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!
某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!
成功只会留给那些有准备的人!
eam(OutputStream out)**:创建一个写入指定的OutputStream的ObjectOutputStream
序列化对象的方法:void writeObject(Object obj):将指定的对象写入ObjectOutputStream
注意事项:
-
一个对象要想被序列化,该对象所属的类必须实现Serializable接口
-
Serializable是一个标记接口,实现该接口,不需要重写任何方法
总结
这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!
某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!
成功只会留给那些有准备的人!
[外链图片转存中…(img-saJn2dlb-1714861002787)]