zoukankan      html  css  js  c++  java
  • Java中的流操作

    1. 字符流
    1.1字符输入流 - Reader - FileReader
    涉及到连接的,用完了就要关闭。
     
    **为什么read方法  返回的值是 int,而不是char?因为读到结尾的时候,char不好使,结尾 int 就为 -1。
     
    案例:编写一个字符输入流,来读取外部文件中的数据
    根据数据流动的方向 - 输入流
    根据操作的数据类型 - 字符流
    字符输入流 - Reader(FileReader  前面是来的源,后面是操作)
     
    1.2 字符输出流 - Writer - FileWriter
     
    案例:编写一个流  来将指定的字符写出到外部文件中
     
    1.3 关流的过程
            IO流用过之后必须保证关闭,但是 IO 流的代码中往往存在大量的异常,为了保证关流的操作一定会被执行,所以通过关流都在 finally 代码块中进行。而为了保证 finally 中可以看到流对象,通常
     
    案例:编写一个程序,实现文件的拷贝
    所谓的文件拷贝,实际上就是
     
    1.4 使用缓冲区来提升程序的性能
     
    1.5 使用缓冲流提升程序的性能
            功能:
                   自带缓冲区  提升程序性能
                   提供一些新方法,方便操作
            BufferedReader
     
            BufferedWriter
     
    1.6 增强类的方式
    a. 继承
        可以通过继承父类,在子类中增强能力,缺点是对父类对象无效。
    b.装饰设计模式
        可以对已有对象生效
    c.动态代理
     
    1.7 装饰设计模式
        java中共有 23 种设计模式。装饰模式是其中的一种。所谓的设计模式,其实就是前人总结的写代码的套路。(动态代理,适配器)
        主要的功能:就是在原有的被装饰者的基础上增加其他能力。
        实现方式:
     
    案例:为 Person 类通过装饰设计模式 使其能够飞
     
    缓冲流 - BufferedReader 和 BufferedWriter 就是使用了装饰设计模式实现的。
    实验:翻阅BufferedReader  BufferedWriter 的源代码。
     
    1.8 字符流 - 其他字符流
        StringReader
            数据来源是字符串的字符流
    案例:利用StringWriter以一段
     
    字节流 - 字节输入流
        InputStream
     
    字节流 - 字节输出流
        OutputStream
     
    案例:通过字节流,直接实现文件的复制
     
    2. 转换流
        字符流的底层也是字节流,只不过在字节流的基础上增加了缓冲区和编解码器。
        字符流内置的但是 java 提供的字符流  缓冲区和编解码器是无法调整的,这在使用
     
    案例:拷贝一个 utf-8 编码集  包含中文的文本文件  要求产生的文件也是 utf-8/gbk。
     
    3. 系统流
    在java中有一个重要的类,叫做System,代表当前系统,
     
    通过系统流向控制台写数据
     
    系统输出流
     
    修改标准系统输出流输出位置
     
    系统输入流
     
    修改标准系统输入流输入位置
     
    打印流  系列化流
     
     
    1. File
    代表文件或者目录(文件夹)的类
     
    练习:删除目录
    思路分析:写一个单独的方法来删除目录或者文件:判断是一个目录(isDirectory)还是是一个文件(isFile);如果是文件直接删除,如果是目录,获取这个目录下的所有子目录和子文件 --- 后续功能和当前方法要完成的功能是一致的 --- 递归
     
    练习:统计工作空间中 Java 文件和 class 文件的个数
    思路分析:定义一个新的方法进行统计:先获取工作空间中所有的子文件和子目录。如果是子目录 --- 递归;如果是子文件,需要判断这个文件是否是一个 Java 文件还是一个class文件
     
    Java API 中的方法前缀:
    can 能不能
    is 是不是
    has 有没有
     
    2. 路径
    绝对路径:以盘符或者/开头的路径。指定的位置和文件当前的位置没有什么关系。
    相对路径:不以盘符或者/开头的路径(跟后面的资源的定位有关系,比如一直)<!-- 锚 - 超链接 --> href。<!-- 相对路径如果不指定默认在当前的路径下寻找资源 -->
    <!-- .. 表示往上蹦(上一级目录) -->。是以当前路径为基准来计算指定的文件的所在路径。
     
    练习:以path.html 作为基准来找test.html
    ../../../c/f/test.html
     
    3. IO流
    (生活中,水流,电流,车流,很常见,总会让某些东西在里面流动和传递起来,计算机中能够流动的也就只有数据了)
    用于数据的传输机制。IO -> Input Output Stream -> 输入输出流。数据从外部流向程序 - 输入流;数据从程序流向外部 - 输出流。读取文件  --  数据是从文件读到程序中 -> 输入流;向一个 TXT 文件中写入字符串 “abc” ->数据是从程序写到文件中 -> 输出流。
     
    根据数据传输方向:输入流和输出流
    根据数据传输形式:字符流和字节流
     
     
    输入流
    输出流
    字符流
    Reader
    Writer
    字节流
    InputStream
    OutputStream
    四个基本的流都是抽象类。
    数据的来源/目的地:存储设备(U盘、硬盘、光盘)、物理设备(话筒,麦克风)、内存(键盘中敲击)、网络(QQ、微信这些读取、接收的数据,其中套接字就是使用的网络)
     
    向一个 TXT 文件中写入字符串 -> 输出流、字符流、和文件相关的流
     
    4. 流的异常处理
    1.将流对象放在try之外声明并且赋值为null;放到try之内进行初始化
    2.在关流之前需要判断流对象是否为空
    3.为了防止关流失败导致流依然占用文件,所以需要将流对象强制置为 null。
    4.为了防止关流的时候自动冲刷缓冲区失败导致一部分数据产生丢失,需要在关流之前进行一次手动的冲刷
     
    JDK1.7特性:
    二进制 0b
    int i = 100_000;
    <>
    try-with-resources
     
    1. 其他流 - 打印流 - PrintStream
            本身是一个字节流  是一个装饰者  
     
    1.1 打印流的优点:
      1.更多的类型的输出方法
      2.自动刷新流
      3.永远不抛出IOException
     
    2. 其他流 - 打印流 - PrintWriter
           跟PrintStream类似
     
    3. 其他流 - Java属性对象 - Properties
        (单独的一个工具,只是用到流里面的一些知识。)
        在 java.util包下有一个工具类Properties,可以用作java常用的配置对象来使用,可以在其中保存键值对的类型,而且此对象可以在流中构建,也可以写到
        从继承结构上来看,Properties 来自于集合类中的 HashTable,所以本身也可以存储键值对类型的数据。
     
    3.1 properties文件
        java属性文件,通常用作java的配置文件来使用
        文件格式:
                        一行一个键值对
                        键和值之间用等号相连
                        通常其中不可以包含非 ISO8859-1 的字符  如果遇到非 ISO8859-1需要使用\转义 \u5F02:unicode编码
    4. 序列化流
        java是面向对象的语言,对象是存活在虚拟机的内存中,是动态灵活可变的数据。
     
    4.1 序列化、反序列化主要的目的:
        将对象序列化后保存到磁盘中,这个过程称之为将对象持久化,而将持久化的对象信息再读取回内存恢复为对象的过程,称之为反持久化。
     
    4.2 serializable接口:
        想要实现序列化的接口
        没有任何要求实现的方法,此接口为一个标记接口,功能仅仅是用来声明当前类可以被序列化
     
    4.3 java实现序列化/反序列化:
     
    4.4 序列化中的 serialVersionUID:
        在序列化/反序列化中唯一的标识这个类,与当前类的属性紧密相关,所以不同的类的serialVersionUID是不同的。
        serialVersionUID 在需要的时候,可以自己指定,在当前的类中,通过静态的名为 serialVersionUID 属性指定(在网络传递对象时,在机器两端手动指定这个值相同,反序列化时就不会报错了!!值不同是为了保证类型转换时的安全性)
     
    4.5 Transient 关键字
            实现了Serializable接口的类的属性上通过transient关键字来申明该属性不能被序列化。(某些比较重要的信息)实现在序列化时堆属性的隐藏。
            另外,静态的属性也不会被序列化,
            另外,集合类型也不会被序列化
            另外,类的属性如果是一个非基本类型
     
     
    案例:实现将对象序列化/反序列化
     
    5. 多线程
        5.1 进程和线程
            a.进程
                所谓的进程其实就是一个程序或服务(没有界面的程序,功能是背后提供一系列的支持,360 加速的原理就是将某些服务的启动改一下,如不能关闭,就转到进程直接关闭),操作系统中一个独立运行的程序或服务就是一个进程
            b.多进程
            c.线程
            d.多线程
            **计算机中只有一个cpu,实际上同一个时刻,只能处理一个运算,但是由于cpu的运算速度非常的快,通过不停的切换处理的任务,从而使多个进程多个线程一次都能得到处理,处理的很快,切换的也很快,人看来似乎这些进程和线程同时进行(CPU 的发展:286  386  586(不让用了) 奔腾(单核),酷睿(四核、八核)在处理多线程时可以做好多的事)
     
            **JVM也是一个进程,可以在其中开辟多个线程执行并发的任务,这样的开发多个线程的技术成为java多线程技术。
     
    5.2 Java中的多线程
      5.2.1Thread 类
              java是面向对象的语言,万物皆对象。在java中也是用对象来代表底层的物理线程,来方便我们操作。这样的线程对象归属于Thread类。
     
      5.2.2 启动线程的过程:
          a.启动线程的方式一:
                
          b.启动线程的方式二:
     
    5.3 两种线程启动方式的比较:
        java是单继承,继承的方式创建线程,将会占用extends关键字
        java是多实现的,实现接口的数量没有限制,
     
    5.4 关闭线程:
            stop,已过时,不安全,现在已经都不用了。
            后面也没有提供任何类似的方法了,就给程序了一个开关,通常是boolean类型的。
          
     
    5.5 线程并发的细节:
    **主线程和其它线程没有什么特殊的地方,只是程序的入口。
    **多个线程的并发过程中,在无序地、不停地争夺CPU,由于CPU运行地非常快,看起来似乎这些线程在并发的执行。
    **只要进程活着,线程就活着。
     
    5.6 线程的优先级:
     
    5.7 多线程并发安全问题: 
            多个线程的执行顺序不确定,操作共享资源时,就有可能因为线程的无需执行,产生以写以外的情况。安全性!!(打印机中,如果有十个人都来争夺这个资源,产生多线程并发问题,就会这里打印一点,那里打印一点)
    多线程并发安全问题产生的条件:
    a.有共享资源
    b.有线程并发操作了共享资源
    c.有线程并发操作了共享资源且涉及到了修改操作
     
     
    5.8 解决多线程并发安全问题:
        破坏产生多线程并发问题的条件
        禁止共享资源 -- 有些情况下是可以的  例如买火车票的例子  --- ThreadLocal
        禁止多线程并发操作 ---Syncronized代码块
        禁止修改 --- ReadWriteLock
     
    5.9 Syncronized 代码块的使用:
        原理:
                锁对象可以任意的选择,但是要保证并发的线程操作的都是同一个锁对象。
        语法:
                syncronized(锁对象){要同步的代码}
     
     
     
  • 相关阅读:
    强化学习的基本迭代方法
    基于文本描述的事务聚类
    学习强化学习之前需要掌握的3种技能
    其它 华硕 ASAU S4100U 系统安装 win10安装 重装系统 Invalid Partition Table 解决
    数据分析 一些基本的知识
    Python 取样式的内容 合并多个文件的样式 自定义样式
    电商 Python 生成补单公司需要的评论格式3
    SpringBlade 本地图片上传 生成缩略图
    SQL Server 字符串截取
    SpringBlade 本地图片上传
  • 原文地址:https://www.cnblogs.com/hanease/p/15677075.html
Copyright © 2011-2022 走看看