1.字节流
1)字节缓冲流
字节缓冲流:
- BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节 ,而不必为写入的每个字节导致底层系统的调用
- BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
构造方法:
- 字节缓冲输出流:BufferedOutputStream(OutputStream out)
- 字节缓冲输入流:BufferedInputStream(InputStream in)
为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
- 字节缓冲流
仅仅提供缓冲区
,而真正的读写数据还得依靠基本的字节流对象进行操作
使用字节流实现视频复制的四种方式:
public class VideoCopy{
/*需求:
* 复制视频
* 思路:
* 1.根据数据源创建字节输入流对象
* 2.根据目的地创建字节输出流对象
* 3.读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
* 4.释放资源
* 四种方式实现复制视频,并记录每种方式复制视频的时间
* 1.基本字节流一次独写一个字节
* 2.基本字节流一次读写一个字节数组
* 3.字节缓冲流一次读写一个字节
* 4.字节缓冲流一次读写一个字节数组
*/
public static void main(String[] args) throws Exception{
//记录开始时间
long startTime = System.currentTimeMillis();
//复制视频
String sourcePath = "D:\\01.mp4";
String desPath = "D:\\02.mp4";
//method1(sourcePath, desPath);
//method2(sourcePath,desPath);
//method3(sourcePath,desPath);
method4(sourcePath,desPath);
//记录结束时间
long endTime = System.currentTimeMillis();
System.out.println("共耗时:"+(endTime-startTime)+"毫秒");
}
//1.基本字节流一次独写一个字节
private void method1(String sourcePath, String desPath) throws IOException {
FileInputStream fis = new FileInputStream(sourcePath);
FileOutputStream fos = new FileOutputStream(desPath);
int by;
while ((by=fis.read())!=-1){
fos.write(by);
}
fos.close();
fis.close();
}
//2.基本字节流一次读写一个字节数组
private void method2(String sourcePath, String desPath) throws IOException {
FileInputStream fis = new FileInputStream(sourcePath);
FileOutputStream fos = new FileOutputStream(desPath);
byte[] bys = new byte[1024];
int len;
while ((len=fis.read(bys))!=-1){
fos.write(bys,0,len);
}
fos.close();
fis.close();
}
//3.字节缓冲流一次读写一个字节
private void method3(String sourcePath, String desPath) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourcePath));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desPath));
int by;
while ((by=bis.read())!=-1){
bos.write(by);
}
bos.close();
bis.close();
}
//4.字节缓冲流一次读写一个字节数组
private void method4(String sourcePath, String desPath) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourcePath));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desPath));
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1){
bos.write(bys,0,len);
}
bos.close();
bis.close();
}
}
2.字符流
2.1 为什么会出现字符流
由于字节流操作中文不是特别方便,所以Java就提供字符流
- 字符流 = 字节流 + 编码表
用字节流复制文本文件时,文本文件也会有中文,但是却不会出现乱码,原因是最终底层操作会自动进行字节拼接成中文,那么如何识别是中文的呢?
- 汉字在存储时,无论选择那种编码存储,第一个字节都是负数
2.2 编码表
基础知识:
- 计算机中存储的信息都是用二进制数表示的;我们在屏幕上看到的英文、汉字等字符是二进制数转化之后的结果
- 按照某种规则,将字符存储到计算机中,成为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,成为节码。这里强调一下:按照A编码存储,必须按照A编码解析,这样才能显示正确的文本符号。否则就会导致乱码现象
字符集:
- 是一个系统支持的所有字符集合,包括各国家文字、标点符号、图形符号、数字等
- 计算机要准确的存储知识和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码(常见的字符集有ASCII字符集、GBXXX字符集、Unicode字符集等)
2.3 字符缓冲流
字符缓冲流:
- BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
- BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途