知识点复习
1.接口和抽象类的区别
接口的方法默认是 public,所有方法在接口中不能有实现
接口中都是抽象方法,抽象类中还可以有普通方法
抽象类中可以有构造器,接口中没有
接口中的实例变量默认是 final 类型的,而抽象类中则不一定
一个类可以实现多个接口,但最多只能实现一个抽象类
一个类实现接口的话要实现接口的所有方法,而抽象类不一定
接口中变量一定是静态的常量
2.抽象方法不能和哪些关键词共存?
1.private:修饰的方法只能在本类中使用,而抽象方法要求必须让子类实现,两者互相矛盾
2.final:修饰的方法不能被重写,而且只能赋值一次,而抽象方法必须要被重写,互相矛盾
3.static:修饰的方法可以通过类名直接调用,而抽象方法是没有方法体的,调用没有意义
3.接口中的方法不能和哪些关键词同时存在
final修饰的方法为最终方法不能被重写的,但是接口中的方法都是抽象方法必须被重写,两者矛盾
private修饰的方法或属性只能在本类中使用,抽象方法是需要被继承或实现类进行重写的
static修饰的方法或变量可以直接通过类名进行调用,抽象方法是没有方法体的,调用无意义
4.==和equals的区别
1.==用于基本数据类型时 比较的是值 , 用于引用数据类型时 比较的是地址
2.equals 在字符串中是先比较地址后比较内容
5.final、finally、finalize的区别
final修饰的变量叫常量,只能赋值一次
final修饰的放大叫最终方法,不能被重写
final修饰的类叫最终类,不能被继承
finally是异常汇总的一部分,最终必然会执行的代码块
finalize是垃圾回收机制的执行方法
IO流练习–文本文件及图片复制
IO流练习–文本文件及图片复制
1.思路
使用IO流复制文件可以总结为以下步骤
1.创建输入流,与要读取的源文件建立关联,
2.创建输出流,与要写入目标文件建立关联
3.创建中间变量用于临时存储读取的数据
4.从源文件中读取数据存入临时变量
5.把临时变量存储的数据存入目标文件
6.关闭流
按照以上步骤运用字符流与字节流方法即可
import java.io.*;
public class BufferedDemo {
public static void main(String[] args) throws IOException {
//字符缓冲流写对象
//1.创建输入流,与要读取的源文件建立关联,
FileReader fr = new FileReader("lib/1.txt");
//2.创建输出流,与要写入目标文件建立关联
FileWriter fw = new FileWriter("lib/2.txt");
//3.创建中间变量用于临时存储读取的数据
//读取数据的返回值
int len;
//4.从源文件中读取数据存入临时变量,此时read()方法返回的是字符在字符集中的编号,只有非负数,返回-1时为结束标志
while((len = fr.read()) != -1){
//5.把临时变量存储的数据存入目标文件
fw.write(len);
}
//6.关闭流
fw.close();
fr.close();
}
}
2.2 字符流使用字符数组进行读取复制
代码如下:
import java.io.*;
public class BufferedDemo {
public static void main(String[] args) throws IOException {
//字符缓冲流写对象
//1.创建输入流,与要读取的源文件建立关联,
FileReader fr = new FileReader("lib/1.txt");
//2.创建输出流,与要写入目标文件建立关联
FileWriter fw = new FileWriter("lib/2.txt");
//3.创建中间变量用于临时存储读取的数据
//读取数据的返回值
int len;
//数组大小建议为1024的整数倍
char[] chs = new char[1024];
//4.从源文件中读取数据存入临时变量,此时read(chs)方法返回的是读取到的有效字符个数,返回-1时为结束标志
while((len = fr.read(chs)) != -1){
//5.把临时变量存储的数据存入目标文件
fw.write(chs,0,len);
}
//6.关闭流
fw.close();
fr.close();
}
}
***使用字符数组效率更高***
2.3 字符流使用字符缓冲流进行读取复制
代码如下
import java.io.*;
public class BufferedDemo {
public static void main(String[] args) throws IOException {
//字符缓冲流写对象
//1.创建输入流,与要读取的源文件建立关联,
FileReader fr = new FileReader("1.txt");
BufferedReader br = new BufferedReader(fr);
//2.创建输出流,与要写入目标文件建立关联
FileWriter fw = new FileWriter("2.txt");
BufferedWriter bw = new BufferedWriter(fw);
//3.创建中间变量用于临时存储读取的数据
//读取数据的返回值
// int len;
// //4.从源文件中读取数据存入临时变量
// while((len = br.read()) != -1){
//5.把临时变量存储的数据存入目标文件
// bw.write(len);
// }
//一次读取一行
String str;
while((str = br.readLine())!= null){
bw.write(str);
//读取一行写入一行,若没有这一行,可能存在流没有关闭,就不往目标文件中写入数据的情况。
bw.flush();
//手动换行
// bw.write("\r\n");
//或新起一行
bw.newLine();
}
//6.关闭流
bw.close();
fw.close();
br.close();
fr.close();
}
}
*斜体样式*进行数据的读写时,使用缓冲流对象,读写效率更高,安全性更好
3.字节流复制图片
2.1 字节流一次读取一个字节进行复制
代码如下:
import java.io.*;
public class PutStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建输入流,与要读取的源文件建立关联,
InputStream is = new FileInputStream("lib/a.jpg");
//2.创建输出流,与要写入目标文件建立关联
OutputStream os = new FileOutputStream("lib/b.jpg");
//3.创建中间变量
int len;
//4.从源文件中读取数据存入临时变量
while((len = is.read())!=-1){
//5.把临时变量存储的数据存入目标文件
os.write(len);
}
//6.关闭流
os.close();
is.close();
}
}
2.2 字节流使用字节数组进行读取复制
import java.io.*;
public class PutStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建输入流,与要读取的源文件建立关联,
InputStream is = new FileInputStream("lib/a.jpg");
//2.创建输出流,与要写入目标文件建立关联
OutputStream os = new FileOutputStream("lib/b.jpg");
//3.创建中间变量
int len;
byte [] bys = new byte[1024];
//4.从源文件中读取数据存入临时变量
while((len = is.read(bys))!=-1){
//5.把临时变量存储的数据存入目标文件
os.write(bys,0,len);
}
//6.关闭流
os.close();
is.close();
}
}
2.3 字节流使用字节缓冲流进行读取复制
代码如下:
import java.io.*;
public class PutStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建输入流,与要读取的源文件建立关联,
InputStream is = new FileInputStream("lib/a.jpg");
BufferedInputStream bis = new BufferedInputStream(is);
//2.创建输出流,与要写入目标文件建立关联
OutputStream os = new FileOutputStream("lib/b.jpg");
BufferedOutputStream bos = new BufferedOutputStream(os);
//3.创建中间变量
int len;
//4.循环读取源数据存入中间变量,
while((len = bis.read())!=-1){
//5.循环将中间变量数据写入目标文件直到结束
bos.write(len);
}
//6.关闭流
bos.close();
bis.close();
os.close();
is.close();
}
}
4.其他
建议:在进行纯文本复制时使用字符流,在进行视频,音频,图像等文件复制时使用字节流
缓冲流中缓冲池默认大小为8Kb的字节数组。
单个字符或字节进行复制效率太低,使用自定义数组来复制也会有空间浪费的问题,建议使用缓冲流进行复制
6.sleep和wait的区别
sleep是线程Thread类中提供的用于暂停线程的方法
wait是Object类中提供的用于让线程等待的方法
7.get与post请求的区别
1.get重点在从服务器上获取资源,post重点在向服务器发送数据
2.Get传输的数据量小,因为受URL长度限制,但效率较高;Post可以传输大量数据,所以上传文件时只能用Post方式;
3.Get不安全,因为URL是可见的,可能会泄露私密信息,如密码等;Post安全性较高;
4.get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。post支持标准字符集,可以正确传递中文字符。
8.http中重定向和请求转发的区别
1.重定向特点:至少两次请求,浏览器地址发生变化,可以访问自己web之外的资源,传输的数据会丢失
2.请求转发特点:只有一次请求,浏览器地址不变,访问的是自己本身的web资源,传输的数据不会丢失