一、IO
1.1简介
1、I:Input 输入 O:Output 输出 用于不同设备来进行数据的交换
2、使用场景:
A、文件copy复制
B、文件上传与下载
C、即时通讯(微信聊天)
3、分类:
按照流向进行划分:输入流与输出流
按照类型进行划分:字节流与字符流
4、输入流与输出流解释
硬盘到内存:输入流
内存到硬盘:输出流
5、字节流与字符流解释
6、字节流
A、万物皆字节 电脑任何资源都可以使用字节来表示
B、字节流用来操作图片 音频 视频
C、分类:字节输入流与字节输出流
7、字符流
A、字符流=字节流+编码表 字符流的底层也是使用字符流来进行操作 只是通过编码表进行转换(将字节转换字符)
B、字符流用于操作纯文本内容
C、分类:字符输入流与字符输出流
8、IO注意事项
A、所有的流资源都在使用java.io包下
B、使用流资源的时候 可能会产生异常 处理异常:抛出 与捕获
C、使用完流资源 需要关闭资源 因为流资源比较消耗内存
二、字节输出流
2.1简介
1、此抽象类是表示输出字节流的所有类的超类
A、OutputStream是一个抽象类
B、OutputStream是字节流的所有类的超类
2.2常用的方法
方法的名称 | 方法的描述 |
public void close() | 关闭流资源 |
public void flush() | 刷新(将缓冲区(在内存中)的数据刷新到硬盘中) |
public abstract void write(int b) | 一个一个字节写入 |
public void write(byte[] b) | 一次写入多个字节 |
public void write(byte[] b, int off, int len) | 一次写入指定长度的字节 |
2.3子类
三、FileOutputStream
3.1简介
A、文件输出流是用于将数据写入 File
B、FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用FileWriter
3.2构造方法
构造方法名称 | 构造方法的描述 |
public FileOutputStream(Filefile) | 创建一个向指定File对象表示的文件中写入数据的文件输出流 |
public FileOutputStream(Filefile, boolean append) | 创建一个向指定 File 对象表示的文件中写入数据的文件输出流(如果为 true,则将字节写入文件末尾处,而不是写入文件开始处) |
publicFileOutputStream(Stringname) | 创建一个向具有指定名称的文件中写入数据的输出文件流 |
publicFileOutputStream(Stringname, boolean append) | 创建一个向具有指定 name 的文件中写入数据的输出文件流(如果为 true,则将字节写入文件末尾处,而不是写入文件开始处) |
3.3构造方法的三件事
A、实例化FileOutputStream对象
B、船舰一个空的文件
C、将FileOutputStream指向创建的空文件
3.4使用步骤
A、实例化FileOutputStream对象
B、调用写的方法
C、关闭流资源
3.5一个一个字节写入
package com.gkd.test01; import java.io.FileOutputStream; import java.io.IOException; public class Test01 { public static void main(String[] args) throws IOException { //实例化FileOutputStream对象 FileOutputStream fos=new FileOutputStream("D:\\QF\\admin\\cc.txt"); //调用写的对象一个一个存入 fos.write(97); fos.write(98); fos.write(99); //关闭资源 fos.close(); } }
3.6一次写入多个字节
package com.gkd.test01; import java.io.FileOutputStream; import java.io.IOException; public class Test02 { public static void main(String[] args) throws IOException { //实例化FileOutputStream对象 FileOutputStream fos=new FileOutputStream("D:\\QF\\admin\\dd.txt"); //定义字节数组 byte [] b={97,98,99}; //调用方法 fos.write(b); //关闭资源、 fos.close(); } }
3.7使用字节流写入字符串
package com.gkd.test01; import java.io.FileOutputStream; import java.io.IOException; public class Test03 { public static void main(String[] args) throws IOException { //实例化FileOutputStream对象 FileOutputStream fos=new FileOutputStream("D:\\QF\\admin\\ee.txt",false); String str="拉稀哥瞒着阿蒙看美女"; //转换成字节数组 byte[] b = str.getBytes(); fos.write(b); fos.close(); } }
3.8字节流写入的原理
3.9写入的内容说明
1、使用OutputStream 写入的内容是: 97 98 99 记事本打开的内容:a b c
2、原因:
使用记事本打开文件的时候 如果字节范围是0-127 使用ASCII码表来进行转换
使用记事本打开文件的时候 如果超过了这个范围 使用记事本默认的码表 默认的码表是GBK
四、Input Stream
4.1简介
1、此抽象类是表示字节输入流的所有类的超类
A、InputStream 是一个抽象类
B、InputStream是字节输入流的所有类的超类
4.2常用方法
方法名称 | 方法的描述 |
public void close() | 关闭资源 |
public abstract int read() | 一个一个字节读取 |
public int read(byte[] b) | 一次读取多个字节放入到缓冲区数组 |
public int read(byte[] b, int off, int len) | 一次读取指定字节数放入缓冲区数组中 |
4.3子类
五、FileInputStream
5.1简介
A、FileInputStream从文件系统中的某个文件中获得输入字节 读取文件中字节(内容)
B、FileInputStream用于读取诸图象数据之类的原始字节流,要读取字符流,请考虑使用FileReader
5.2构造方法
构造方法名称 | 构造方法描述 |
public FileInputStream(File file) | 通过打开一个到实际文件的连接来创建一个FileInputStream |
public FileInputStream(Stringname) | 过打开一个到实际文件的连接来创建一个FileInputStream |
5.3构造方法两件事
A、实例化FileInputStream对象
B、FileInputStream将指向要操作的文件
5.4使用步骤
A、实例化FileInputStream对象
B、调用该方法
C、关闭资源
5.5一个一个字节读取
package com.gkd.test01; import java.io.FileInputStream; import java.io.IOException; public class Test04 { public static void main(String[] args) throws IOException { //实例化 FileInputStream fis=new FileInputStream("D:\\QF\\admin\\cc.txt"); //调用读取方法 int r1 = fis.read(); System.out.println((char) r1); int r2 = fis.read(); System.out.println((char) r2); int r3 = fis.read(); System.out.println((char) r3); int r4 = fis.read(); System.out.println(r4); //关闭资源 fis.close(); } }
5.6读取原理
改造后代码:
package com.gkd.test01; import java.io.FileInputStream; import java.io.IOException; public class Test05 { public static void main(String[] args) throws IOException { //实例化对象 FileInputStream fis=new FileInputStream("D:\\QF\\admin\\cc.txt"); //使用循环,因为不清楚有多少个字节,所有使用while,条件是不等于-1 //这样在判断的时候读一次,在条件内又读一次,所有需要定义一个变量来记录 // while(fis.read()!=-1){ // System.out.println((char) fis.read()); // } int lng=-1; while ((lng=fis.read())!=-1){ System.out.println((char) lng); } fis.close(); } }
5.7一次读取多个字节
代码:
package com.gkd.test01; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; public class Test06 { public static void main(String[] args) throws IOException { //实例化对象 FileInputStream fis=new FileInputStream("D:\\QF\\admin\\cc.txt"); //定义数组 byte [] b= new byte[2]; //调用方法读取 //第一次读取 int r1 = fis.read(b); System.out.println(Arrays.toString(b)); System.out.println(r1); //第二次读取 int r2 = fis.read(b); System.out.println(Arrays.toString(b)); System.out.println(r2); //第三次读取 int r3 = fis.read(b); System.out.println(Arrays.toString(b)); System.out.println(r3); //第四次读取 int r4 = fis.read(b); System.out.println(Arrays.toString(b)); System.out.println(r4); fis.close(); } }
5.8一次读取多个字节的原理
改造后的代码:
package com.gkd.test01; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; public class Test07 { public static void main(String[] args) throws IOException { //实例化对象 FileInputStream fis=new FileInputStream("D:\\QF\\admin\\cc.txt"); //定义数组 //定义缓冲区数组的大小是1024的倍数 byte [] b =new byte[1024]; int leg=-1; //使用循环来读取 while((leg=fis.read(b))!=-1){ // System.out.println(Arrays.toString(b)); //为了最后不要读取重复的值,参数第一个数数组,第二个是字节的索引,第三个是长度; System.out.println(new String(b,0,leg)); } fis.close(); } }
5.9 read()与read(b)比较
A、read()一个一个字节读取 效率低 read(b)一次读取多个字节 效率高
B、read()返回的是读取的数据 read(b)返回的是读取的有效的字节个数
5.9.1案例
step01需求将C盘中的图片copy到其他盘中
step02分析
A、使用字节输入流读取图片 FileInputStream读
B、使用字节输出流写入图片 FileOutputStream写
代码:
package com.gkd.test01; import java.io.*; public class Test08 { public static void main(String[] args) throws IOException { //实例化输入流 InputStream is=new FileInputStream("C:\\Users\\廖国庆\\22.jpeg"); //实例化输出流 OutputStream os=new FileOutputStream("d:\\QF\\admin\\22.jpeg"); //定义一个缓冲区数组 byte [] b= new byte[1024]; //定义变量记录 int leng=-1; //使用循环 while ((leng=is.read(b))!=-1){ os.write(b,0,leng); } //关闭资源 os.close(); is.close(); } }
六、高效流
6.1简介
1、
A、高效读
B、在创建时,会创建一个内部缓冲区数组 默认缓冲区大小 8192
2、
A、高效写
B、在创建时,会创建一个内部缓冲区数组 默认缓冲区大小 8192
3、没有读写文件的功能 只是对InputStream与OutputStream的封装
4、高效的原因
高效读:每次读取8192个字节的数据放入到缓冲区数组 再从缓冲区数组(内存)中获取数据 避免与磁盘进行多次交互
6.2构造方法
方法的名称 | 方法的描述 |
创建一个新的缓冲区输出流,以将数据写入指定的底层输出流 | |
构建一个并保存其参数, | |
6.3高效读
package com.gkd.test01; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class Test09 { public static void main(String[] args) throws IOException { //实例化InputStream InputStream is=new FileInputStream("D:\\QF\\admin\\cc.txt"); //实例化BufferedInputStream BufferedInputStream bis= new BufferedInputStream(is); int leng=-1; //使用循环读取 while ((leng=bis.read())!=-1){ System.out.println((char) leng); } //关闭资源 bis.close(); is.close(); } }
6.4高效写
package com.gkd.test01; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Test10 { public static void main(String[] args) throws IOException { //实例化OutputStream OutputStream os=new FileOutputStream("D:\\QF\\admin\\ff.txt"); //实例化BufferedOutputStream BufferedOutputStream bos=new BufferedOutputStream(os); bos.write(97); bos.write(98); bos.write(99); bos.write(100); bos.write(101); bos.write(102); bos.write(103); //关闭资源 bos.close(); os.close(); } }
6.5案例
step01需求:使用高效流 将c盘中视频copy d盘
step02分析
A. BufferedOutputStream 高效写
B. BufferedInputStream 高效读
package com.gkd.test01; import java.io.*; public class Test11 { public static void main(String[] args) throws IOException { //实例化 InputStream is=new FileInputStream("D:\\QF\\admin\\4.jpeg"); //实例化 BufferedInputStream bis=new BufferedInputStream(is); //实例化 OutputStream os=new FileOutputStream("C:\\Users\\廖国庆\\Desktop\\5.jpeg"); //实例化 BufferedOutputStream bos=new BufferedOutputStream(os); int leng=-1; while ((leng=bis.read())!=-1){ bos.write(leng); } bos.close(); bis.close(); os.close(); is.close(); } }
七、关闭流资源
A、关闭流资源 必须从下往上进行关闭
B、关闭流资源需要再finally中进行关闭
C、关闭流资源之前 必须先非空判断
package com.gkd.test01; import java.io.*; public class Test12 { public static void main(String[] args) { InputStream is=null; BufferedInputStream bis=null; OutputStream os=null; BufferedOutputStream bos=null; try { //实例化InputStream is=new FileInputStream("D:\\QF\\admin\\4.jpeg"); //实例化BufferedInputStream bis=new BufferedInputStream(is); //实例化OutputStream os=new FileOutputStream("C:\\Users\\廖国庆\\Desktop\\6.jpeg"); //实例化BufferedOutputStream bos=new BufferedOutputStream(os); int leng=-1; while ((leng=bis.read())!=-1){ bos.write(leng); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (bos!=null){ bos.close(); } if (bis!=null){ bis.close(); } if (os!=null){ os.close(); } if (is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
八、总结