zoukankan      html  css  js  c++  java
  • Java学习笔记28(IO字节流)

    IO定义:

      写:Output操作:将内存上的数据持久化 到设备上,这个动作称为输出;

      读:Input操作:把硬盘上的东西读取到内存,这个动作称为输入;              这两种操作称为IO流

    IO流可以分为两类:字节流   字符流

    字节流

      输入和输出:参照物,都是java程序来参照 

      字节时输入流类:InputStream   字节输出流类:OutputStream

      字节输入流类和字节输出流类都是抽象类,所以只能通过子类来创建实例化对象。示例:输出流

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    public class Demo2 {
        public static void main(String[] args) throws IOException {
            //通过子类FileOutputStream类建立输出流对象
            OutputStream out=new FileOutputStream("d:\a.txt");
            //调用OutputStream的write(int b)方法,写入字节数据到磁盘上的文件
            out.write(100);
            byte[] b={'A','B','C'};
            //写入字节数组write(byte[] b)
            out.write(b);
            //write(byte[] b,int off,int len)写入字节数据,从x下标开始,写入数据的个数
            out.write(b,2,1);
            //释放资源
            out.close();
        }
    }

    输入流:

    package com.zs.Demo;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class Demo3 {
        public static void main(String[] args) {
            try {
                fun1();
                fun2();
                fun3();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private static void fun3() throws IOException {
            FileInputStream in=new FileInputStream("d:\a.txt");
            byte[] b=new byte[1024];
            int len=0;
            while((len=in.read(b,0,2))!=-1){
                //字符数组转字符串
                System.out.println(new String(b,0,len));
               /* dA
                BC
                C*/
            }
            in.close();
        }
    
        private static void fun2() throws IOException {
            FileInputStream in=new FileInputStream("d:\a.txt");
            byte[] b=new byte[1024];
            int len=0;
            while((len=in.read(b))!=-1){
                //字符数组转字符串
                System.out.println(new String(b,0,len));//dABCC
            }
            in.close();
        }
        private static void fun1() throws IOException {
            FileInputStream in=new FileInputStream("d:\a.txt");
            //read()从输入流中读取数据的下一个字节;当没有字节时返回-1;
            int len=0;
            while((len=in.read())!=-1){
                System.out.println((char)len);//d  A B C C
            }
            in.close();
        }
    }

    续写:

    public class Demo4 {
        public static void main(String[] args) throws IOException {
            File f=new File("d:\a.txt");
            FileOutputStream  fou=new FileOutputStream(f,true);
            fou.write("hello
    ".getBytes());// 
    回车换行,getBytes()将字符串转字节数组
            fou.close();
        }
    }//如果文件存在,不会覆盖,会把内容追加到文件内容后面

    异常处理:

    package com.zs.Demo;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Demo5 {
        public static void main(String[] args) {
            FileOutputStream fou=null;
            try {
                fou=new FileOutputStream("d:\a.txt");
                fou.write("java".getBytes());
            } catch (IOException e) {
                System.out.println(e);
                throw new RuntimeException("文件写入失败");
            }finally {
                try {
                    if (fou != null) {
                        fou.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException("释放资源失败");
                }
            }
        }
    }

    复制文件:

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class CopyFile {
        public static void main(String[] args) {
            FileInputStream fin=null;
            FileOutputStream fou=null;
            try {//在main方法中,尽量使用try语句,其他方法中用throw
                fin=new FileInputStream("d:\a.txt");
                fou=new FileOutputStream("e:\a.txt");
                //首先读取d盘下的a文件内容到内存
                int len=0;
                while((len=fin.read())!=-1){
                    fou.write(len);
                }
            }  catch (IOException e) {
                throw new RuntimeException("文件复制失败");
            }finally {
                if (fou!=null){
                    try {
                        fou.close();//先打开的后关闭,后打开的先关闭,这里先关闭输出流,
                    } catch (IOException e) {
                        throw new RuntimeException("输出流资源释放失败");
                    }finally {
                        if (fin!=null){
                            try {
                                fin.close();
                            } catch (IOException e) {
                                throw new RuntimeException("输入流资源释放失败");
                            }
    
                        }
                    }
                }
            }
        }
    }

    上一个方法中,一次只复制一字节的文件,当文件太大时,复制速度太慢,如下:用上面的代码复制一个视频,一字节一字节复制

    package com.zs.Demo2;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class CopyFile {
        public static void main(String[] args) {
            FileInputStream fin=null;
            FileOutputStream fou=null;
            try {//在main方法中,尽量使用try语句,其他方法中用throw
                fin=new FileInputStream("d:\1.mp4");
                fou=new FileOutputStream("e:\1.mp4");
                //首先读取d盘下的a文件内容到内存
                int len=0;
                long l = System.currentTimeMillis();
                while((len=fin.read())!=-1){
                    fou.write(len);
                }
                long l1 = System.currentTimeMillis();
                System.out.println(l1-l);//158014 可以发现,复制了158秒,速度很慢
            }  catch (IOException e) {
                throw new RuntimeException("文件复制失败");
            }finally {
                if (fou!=null){
                    try {
                        fou.close();//先打开的后关闭,后打开的先关闭,这里先关闭输出流,
                    } catch (IOException e) {
                        throw new RuntimeException("输出流资源释放失败");
                    }finally {
                        if (fin!=null){
                            try {
                                fin.close();
                            } catch (IOException e) {
                                throw new RuntimeException("输入流资源释放失败");
                            }
                        }
                    }
                }
            }
        }
    }

    为了提高速度,采用字节数组,

    package com.zs.Demo2;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class CopyFileByByte {
        public static void main(String[] args) {
            FileInputStream fin=null;
            FileOutputStream fou=null;
    
            try {
                fin=new FileInputStream("d:\1.mp4");
                fou=new FileOutputStream("e:\1.mp4");
                int len=0;
                byte[] b=new byte[1024];//这里的意思是一次复制1kb,也可以把数组大小改变1MB(1024*1024)
                long l = System.currentTimeMillis();
                while((len=fin.read(b))!=-1){
                    fou.write(b);
                }
                long l1 = System.currentTimeMillis();
                System.out.println(l1-l);//325 只要325毫秒就复制好了
            } catch (IOException e) {
                throw new RuntimeException("复制失败");
            }finally {
                if (fou!=null){
                    try {
                        fou.close();
                    } catch (IOException e) {
                        throw new RuntimeException("释放资源失败");
                    }finally {
                        if (fin!=null){
                            try {
                                fin.close();
                            } catch (IOException e) {
                                throw new RuntimeException("释放资源失败");
                            }
                        }
                    }
                }
            }
        }
    }
    

      

  • 相关阅读:
    5道趣味Python热身题【新手必学】
    操作系统特征
    二叉树的中序遍历
    英语一图画作文模板
    函数
    双阶乘与华里士公式
    因式分解
    【】连通图——详细解释
    【】this指针——c++中的特殊指针
    咱们程序员好用的云笔记
  • 原文地址:https://www.cnblogs.com/Zs-book1/p/10594765.html
Copyright © 2011-2022 走看看