IO流概念
IO: 输入/输出 (input / output)
流: 是一种抽象概念,是对数据传输的总成,也就是说数据在设备间的传输称之为流, 本质就是数据传输
IO流是用来处理设备间数据传输的,常见用于: 文件复制,文件上传,文件下载
IO流的流向分为两种: 输入流 输出流
IO流传输的数据类型分为两种: 字符流 字节流
如果是操作纯文本文件,优先使用字符流
图片,视频,音频,不确定文件类型使用字节流
字节输出流: (进行写数据)
创建对象方法:
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
//创建字节输出流对象 指向路径c:\\aaa.txt的aaa.txt文件(也就是将数据输出到aaa.txt文件夹) FileOutputStream fos = new FileOutputStream("c:\\aaa.txt"); //将指定的字节写入 一次写入一个字节数据 fos.write(2); //int类型的可以直接传入 fos.write("张三".getBytes()); //其他数据类型需要调用getBytes方法转换成字节类型 //将指定的数组写入 一次写入一个字节数组数据 byte[] bytes = new byte[1024]; fos.write(bytes); //一次写入一个bytes数组字符数据 //将指定的数组写入 可以指定写入范围 byte[] bytes1 = new byte[1024]; fos.write(bytes1,0,100); //一次写入一个bytes1数组个数组的数据,范围是从0索引开始,100个字节数据 //最后进行关流 fos.close();
字节输入流: (进行读数据)
创建对象方法:
FileInputStream(String name):参数传入一个文件的路径名,来和这个文件建立链接,进行读取这个文件
读取数据方法:
int read() 一次读取一个字节,int类型的返回值代表读到的字节,若返回值是-1,代表读完了
int read(byte b [ ]) 一次读取一个字节数组,返回值代表读到的字节个数,读到的内容保存到数组" b "中,若返回值是-1,代表数据读完.
//创建字节输入流对象 指向路径D:\\bbb.txt 代表读取bbb.txt这个文件中的数据 FileInputStream fis = new FileInputStream("D:\\\\bbb.txt"); //int read()方法一次读取一个字节,返回值i代表读取的字节,若是-1代表读完 int i; //配合循环实现循环读取数据,直到数据读完停止 while ((i = fis.read()) != -1) { System.out.println((char) i); //此时的i是字节,转换成字符方便阅读 } //int read(byte b []) 方法一次读取一个字节数组,返回值是读取到的字节个数, 若返回值是-1 代表读取完毕 int len; //配合循环实现循环读取数据,直到数据读完停止 byte[] bytes2 = new byte[1024]; while ((len = fis.read(bytes2)) != -1) { //使用循环把读取的数据放进字节数组中 //再把字节数组转换成String类型,参数以此是要转换的数组,转换起始位置索引, 转换的个数 System.out.println(new String(bytes2, 0, len)); }
字节流复制文件实现
案例需求
把“D:\\ddd.jpg”复制到C盘下的“aaa.jpg” (文件可以是任意文件夹)
实现步骤
根据数据源创建字节输入流对象
根据目的地创建字节输出流对象
读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
释放资源
//创建字节输入流准备读取D:\\ddd.jpg文件 FileInputStream fis = new FileInputStream("D:\\\\ddd.jpg"); //创建字节输出流,关联C:\\aaa.jpg文件, 准备将数据复制到这个文件 FileOutputStream fos = new FileOutputStream("C:\\\\aaa.jpg"); //使用循环将D盘下的文件读取出来,并写入C盘下,实现对文件的复制 //第一种方法,一个字节一个字节的复制 int a; while ((a = fis.read()) != -1) { //使用fis.read()读取一个字节,赋值给a fos.write(a); //使用fos.write() 写入字节 a } //第二种方法. 一个字节数组一个字节数组的复制 效率提升 int len; //len用来接收一次一共读取到多少个字节 byte[] bytes = new byte[1024]; while ((len = fis.read(bytes)) != -1) { //使用fis.read(bytes) 一次可以最多读取一个1024数组长度的字节, fos.write(bytes, 0, len); //将读取到的字节数组写入字符输出流, 从0索引开始,写入len个字节 } //操作完毕进行关流 fis.close(); fos.close();
字节缓冲流:
概念:
缓冲流其实就是java帮我们创建了一个长度为8192字节的数组,我们调用缓冲流可以一次将8192个字节长度的数组读取(写入)到内存中,这样会提高效率
构造方法/创建对象:
BufferedOutputStream(OutputStream out)
创建字节缓冲输出流对象,参数是一个字节输出流对象
BufferedInputStream(InputStream in)
创建字节缓冲输入流对象,参数是一个字节输入流对象
//创建一个字节缓冲输出流,参数是一个字节输出流,同时关联一个aaa.txt文件, 表示将数据写入这个文件中 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\aaa.txt")); //一次写入一个字节数据 bos.write(1); bos.write("张三".getBytes()); //一次写入一个字节数组 byte[] bytes = {1, 2, 3, 4}; bos.write(bytes); //关流 bos.close(); //创建一个字节缓冲输入流,参数是一个字节输入流,同时关联一个aaa.txt文件, 表示读取这个文件中的数据 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\aaa.txt")); //一次读取一个字节 int a; while ((a = bis.read()) != -1) { System.out.println((char) a); } //一次读取一个数组 int len; byte[] bytes1 = new byte[1024]; while ((len = bis.read(bytes1)) != -1) { System.out.println(new String(bytes1, 0, len)); } //关流 bis.close();
字节缓冲流复制文件实现
案例需求
把“D:\\ddd.jpg”复制到C盘下的“aaa.jpg” (文件可以是任意文件夹)
实现步骤
根据数据源创建字节缓冲输入流对象
根据目的地创建字节缓冲输出流对象
读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
释放资源
//创建字节缓冲输入流准备读取D:\\ddd.jpg文件 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\\\ddd.jpg")); //创建字节缓冲输出流,关联C:\\aaa.jpg文件, 准备将数据复制到这个文件 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\\\aaa.jpg")); //使用循环将D盘下的文件读取出来,并写入C盘下,实现对文件的复制 //第一种方法,一个字节一个字节的复制 int a; while ((a = bis.read()) != -1) { bos.write(a); } //第二种方法. 一个字节数组一个字节数组的复制 效率提升 int len; //len用来接收一次一共读取到多少个字节 byte[] bytes = new byte[1024]; while ((len = bis.read(bytes)) != -1) { bos.write(bytes, 0, len); } //操作完毕进行关流 bis.close(); bos.close();