Java第二十五天-缓冲流、序列化、打印流

缓冲流

不使用缓冲流

    public static void m1()throws Exception{
        String pathname="D:\\javaProject\\recv\\智游-张奎龙\\apache-tomcat-8.5.51-windows-x64.zip";
        FileInputStream fis = new FileInputStream(pathname);
        String pathname2="D:\\javaProject\\recv\\智游-张奎龙\\copy\\新建 文本文档.zip";
        FileOutputStream fos = new FileOutputStream(pathname2);
        //每次读取一个字节数组
        byte[] bytes=new byte[1024];
        int length;
        long start = System.currentTimeMillis();
        while ((length=fis.read(bytes))!=-1){
            fos.write(bytes,0,length);
        }
        long end = System.currentTimeMillis();
        System.out.println("花费的时间"+(end-start));
        //关闭流
        fos.close();
        fis.close();
    }

使用缓冲流

    private static void m2()throws Exception{
        String pathname="D:\\javaProject\\recv\\智游-张奎龙\\apache-tomcat-8.5.51-windows-x64.zip";
        FileInputStream fis = new FileInputStream(pathname);
        String pathname2="D:\\javaProject\\recv\\智游-张奎龙\\copy\\新建 文本文档.zip";
        FileOutputStream fos = new FileOutputStream(pathname2);
        BufferedInputStream bis = new BufferedInputStream(fis);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //每次读取一个字节数组
        byte[] bytes=new byte[1024];
        int length;
        long start = System.currentTimeMillis();
        while ((length=bis.read(bytes))!=-1){
            bos.write(bytes,0,length);
        }
        long end = System.currentTimeMillis();
        System.out.println("花费的时间"+(end-start));
        bos.close();
        bis.close();
    }

模拟登录 判断用户名和密码是否正确

    public static void m6() throws Exception{
        // 准备一个路径
        String pathname = "D:\javaProject\recv\智游-张奎龙\copy\新建 文本文档.txt";
        // 准备一个文件字符输入流对象
        FileReader fr = new FileReader(pathname);
        // 准备一个缓冲字符输入流对象
        BufferedReader br = new BufferedReader(fr);
        // 输入用户名和面值
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = scanner.nextLine();
        System.out.println("请输入密码");
        String password = scanner.nextLine();
        // 判断用户名和密码值是否存在
        // 使用循环读取
        String data = null;
        // 定义一个开关
        boolean flag = false;
        while ((data = br.readLine()) != null) {// readLine()返回值为null--->读取到流的末尾
            //张三,123456
            String[] user = data.split(",");
            // 第一个值就是用户名  第二个值就是密码值
            if (user[0].equals(username) && user[1].equals(password)) {
                flag = true;
            }
        }
        if (flag) {
            System.out.println("登录成功");
        } else {
            System.out.println("用户名或者密码不正确!!");
        }
    }

Properties

  1. 它是一个属性类,属于HashTable类的一个子类,可以使用Map接口当中所有的方法
  2. 它的键值对类型都是字符串
  3. 常用API方法
    store() --->把属性集中的数据存储到文件中
    load() ---->把文件中的数据读取到Properties属性集中
    getProperty() ---->获取属性值
    setProperty() ---->设置属性值
    //Properties 把属性集中的数据存储到properties文件中
    private static void m7()throws Exception{
        //创建一个属性集
        Properties properties = new Properties();
        properties.setProperty("张三","123456");
        properties.put("李四","111111");
        //把properties属性集当中的值存储到一个文件当中
        String pathname="day22\\src\\data.properties";
        // 准备一个文件字节输出流对象
        FileOutputStream fos = new FileOutputStream(pathname);
        properties.store(fos,"data message");
        fos.close();
    }
    //把properties文件中的数据读取到Properties属性集中
    private static void m8()throws Exception{
        //创建一个属性集
        Properties properties = new Properties();
        // 准备一个输入流对象
        FileInputStream fis = new FileInputStream("day22\\src\\data.properties");
        properties.load(fis);
        String v1 = properties.getProperty("张三");
        String v2 = properties.getProperty("李四");
        System.out.println(v1+"--"+v2);

    }

对象序列化与反序列化

        private static void m9()throws Exception{
        Student s1=new Student(1,"张三1",98);
        //把s1作为一个整体存储到文件当中            序列化
        String pathname="day22\\src\\student.txt";
        //创建一个字节输出流对象
        FileOutputStream fos = new FileOutputStream(pathname);
        //可以进行序列化对象
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        //把对象数据写入到到day22\src\student.txt当中
        oos.writeObject(s1);
        //把文件当中的对象数据读取到内存当中      反序列化
        // 创建一个输入流对象
        FileInputStream fis = new FileInputStream("day22\\src\\student.txt");
        // 创建一个对象输入流
        ObjectInputStream ois = new ObjectInputStream(fis);
        // 从反序列化流中读取对象数据
        Student s11 =(Student) ois.readObject();
        System.out.println(s11);
        // 关闭流对象
        ois.close();
        fis.close();
        oos.close();
        fos.close();
    }
  • 备注:如果类中定义的成员变量为静态的,那么该静态成员变量是不能进行序列化的
  • 原因:因为静态成员变量不属于对象,储存的位置不在对象当中,在方法区中的静态区中存储所以我们在进行对象数据序列化的时候,是不能把方法区中静态区中的数据进行序列化,最终静态成员变量值是不会存储到序列化的文件中
  • 类对象在进行序列化和反序列化的时候,每次jvm都会先比对序列版本号,如果序列版本号不一致,那么程序就不允许通过反序列化读取文件中的对象数据
  • 解决办法:
    不让jvm每次为我生成序列版本号,由开发者把序列版本号写成一个常量值,这样后续再次改动类文件结构时,jvm就不会再生成一个新的序列版本号
    //使用FilenameUtils工具包
    private static void m1()throws Exception{
        String pathname="day22\\src\\io.txt";
        String name = FilenameUtils.getName(pathname);
        System.out.println(name);
        //创建一个File实例
        File file = new File(pathname);
        String path = file.getName();
        System.out.println(path);
        //获取文件的拓展名
        String extension = FilenameUtils.getExtension(path);
        System.out.println("文件的拓展名:"+extension);
        //判断是否是以指定的拓展名结尾
        boolean result = FilenameUtils.isExtension(path, "txt");
        System.out.println(result);
    }

    //使用FileUtils工具包
    private static void m2()throws Exception{
        String pathname="D:\\javaProject\\recv\\智游-张奎龙\\三国演义 (2).txt";
        File file = new File(pathname);
        String string = FileUtils.readFileToString(new File(pathname), "UTF-8");
        System.out.println(string);
        //整行读取,从流中全部读完
        List<String> list = FileUtils.readLines(file, "UTF-8");
        System.out.println(list);
        //把字符串直接写入到文件当中
        String pathname2="day22\\src\\SanGuo2.txt";
        File file2 = new File(pathname2);
        FileUtils.writeStringToFile(file2,"你好,世界","UTF-8");
        String string2 = FileUtils.readFileToString(file2, "UTF-8");
        System.out.println(string2);
        FileUtils.writeStringToFile(file2,"你好,世界","UTF-8",true);
        //拷贝文件夹
        String pathname3="D:\\javaProject\\recv\\智游-张奎龙\\三国分章节";
        //目标文件夹
        String pathname4="D:\\javaProject\\recv\\智游-张奎龙\\新建文件夹";
        FileUtils.copyDirectory(new File(pathname3),new File(pathname4));
        //拷贝文件
        String pathname5="D:\\javaProject\\recv\\智游-张奎龙\\三国分章节\\000 三国演义 上卷.txt";
        String pathname6="D:\\javaProject\\recv\\智游-张奎龙\\新建文件夹\\000.txt";
        FileUtils.copyFile(new File(pathname5),new File(pathname6));
    }

打印流

//使用打印流
    private static void m3()throws Exception{
        PrintStream printStream = new PrintStream("day22\\src\\io.txt");
        printStream.write("智游教育".getBytes());
        printStream.print("智游java");
        printStream.append('中');
    }

异常:

  1. 继承体系:Throwable 异常类(顶级父类):Error错误类/Exception异常类
  2. Exception异常类
    编译器异常(受检异常,checked):在高级开发工具中,编写代码过程中,代码中就包含的异常信息需要进行异常处理,否则编译异常
    运行期异常(非受检异常,runtime):在编译过程中不会发生异常,只有class文件加载到jvm虚拟机才能检查出的异常
  3. 编译期异常
    IO异常--->Exception
    运行期异常 --->RuntimeException
    ArithmeticException 算数异常
    索引越界异常 StringIndexOutOfBoundsException
    空指针异常 NullPointerException
  4. 结果:
    异常在程序当中发生后,会导致程序异常终止,异常后面的代码是不会执行或加载的
  5. 异常:
    首先jvm会找到匹配的异常类(对象)来接收异常信息
    异常对象包括:异常类型、异常产生的位置、异常产生的原因、异常的解决办法
  6. 异常链:一个异常可能引发其他异常
  7. 解决异常:
    通过它的提示信息来定位异常产生的位置--->原因---->日志
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容