day20 Java学习(IO(字节流))
IO流(IO流概述及其分类)
概念:
* IO流用来处理设备之间的数据传输。
* Java对数据的操作是通过流的方式。
* Java用于操作流的类都在IO包中,
* 流按流向分为两种:输入流 ,输出流。
* 流按操作类型分为两种:
* 字节流:字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的。
* 字符流:字符流只能操作纯字符数据,比较方便。
IO流常用父类:
* 字节流的抽象父类:
* InputStream
* OutputStream
* 字符流的抽象父类:
* Reader
* Writer
IO程序书写:
* 使用前,导入IO包中的类
* 使用中,进行IO异常处理
* 使用后,释放资源
IO流(FileInputStream)
public static void main(String[] args) throws IOException { // FileInputStream FileInputStream fis=new FileInputStream("xxx.txt");//创建流对象 int b; while ((b=fis.read())!=-1) { //读取文件内容 System.out.println(b); } fis.close(); }
IO流(FileOutputStream)
public static void main(String[] args) throws IOException { // 创建字节流输出对象(如果没有,就自动创建一个) FileOutputStream list=new FileOutputStream("yy.txt"); list.write(97); //虽然写出的是int数,但是到文件上的是一个字节,会自动取除前三个8位。 list.write(98); list.write(99); list.close(); }
* 追加: 如果向在文件夹续写内容,就在第二个参数传true。
( FileOutputStream list=new FileOutputStream("yy.txt",true);)
IO流(拷贝图片)
public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("图片.jpg"); // 创建字节流输入对象 FileOutputStream fos = new FileOutputStream("copy.jpg"); // 创建字节流输出对象 int b; while ((b = fis.read()) != -1) { //在不断的读取每一个字节 fos.write(b); //将每一个字节写出 } fis.close(); //关流释放资源 fos.close(); }
IO流(字节数组拷贝之available()方法)
public static void main(String[] args) throws IOException { //不推荐使用,有可能会内存溢出。 FileInputStream fis = new FileInputStream("拷贝音频.mp4");// 创建字节流输入对象 FileOutputStream fos = new FileOutputStream("copy.mp4");// 创建字节流输出对象 byte [] arr=new byte[fis.available()]; //创建与文件一样大小的字节数组。 fis.read(arr); //将文件上的字节数读取带内存中 fos.write(arr); //将字节数组中的字节数据写到文件上 fis.close(); // 释放资源 fos.close(); }
IO流(定义小数组)
public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("xxx.txt"); FileOutputStream fos = new FileOutputStream("yy.txt"); byte[] arr = new byte[1024*8]; //通常是1024或其倍数 int len; while ((len = fis.read(arr)) != -1) { //如果忘记夹arr,返回的就不是读取的字节个数,而是字节的码表值 fos.write(arr, 0, len); ; } }
IO流(BufferedInputStream和BufferedOutputStream拷贝)
缓冲思想:
* 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,Java提供了字节缓冲区流。
BufferedInputStream:
* BufferedInputStream内置了一个缓冲区(数组),从BufferedInputStream中读取一个字节时,BufferedInputStream会一次性从文件中读取8192个,存在缓冲区中,返回给程序一个。程序再次读取时,就不用找文件了,直接重缓冲区中获取。直到缓冲区中所有的都被使用过,才重新从文件中读取8192个。
BufferedOutputStream:BufferedOutputStream也内置了一个缓冲区(数组),程序向流中写出字节时,不会直接写到文件,先写到缓冲区中,直到缓冲区写,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。
public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 FileInputStream fis = new FileInputStream("xxx.txt"); //创建文件输入流对象 BufferedInputStream dis=new BufferedInputStream(fis); //创建缓冲区对dis装饰 FileOutputStream fos = new FileOutputStream("yy.txt"); //创建输出流对象 BufferedOutputStream dos=new BufferedOutputStream(fos);//创建缓冲区对dos装饰 int b; while ((b=dis.read())!=-1) { dos.write(b); } dis.close(); dos.close(); }
IO流(fluch和close方法的区别)
close方法:具备刷新功能,在关闭流之前,就会先刷新一次缓冲区,将缓冲区的字节全部刷新到文件上,再关闭。
fluch方法:具备刷新功能,刷完以后还可以继续写。
IO流(流的标准处理异常代码1.6版本)
public static void main(String[] args) throws IOException { // 流的标准处理异常代码 FileInputStream fis=null; FileOutputStream fos=null; try { fis = new FileInputStream("xxx.txt"); fos = new FileOutputStream("yy.txt"); int b; while ((b = fis.read()) != -1) { //在不断的读取每一个字节 fos.write(b); //将每一个字节写出 } } finally { try { if (fis!=null) { fis.close(); } } finally { // try...finally的目的是能关一个尽量关一个 if (fos!=null) { fos.close(); } } } }
IO流(流的标准处理异常代码1.7版本)
public static void main(String[] args) throws IOException { try ( FileInputStream fis = new FileInputStream("图片.jpg"); // 创建字节流输入对象 FileOutputStream fos = new FileOutputStream("copy.jpg");// 创建字节流输出对象 ) { int b; while ((b = fis.read()) != -1) { fos.write(b); } } }
IO流(拷贝图片)