zoukankan      html  css  js  c++  java
  • Java基础总结--IO总结2

    1.键盘录入--Java具有特定的对象封装这些输入输出设备
    在System类定义 in-InputStream类型和out-PrintStream类型成员变量
    阻塞是方法:read()无数据就阻塞
    windows里面回车键对于两个字节 -13 -10
    从系统获得流对象只有一个,所以别关流
    InputStream in = System.in(调用的是系统的流,在Java中被定义为该中类型)
    不要进行关闭,因为关闭的是系统的流否则会用不了。
    StingBulider/StringBuffer清空用的是delete()
    键盘录入的结束通常都是自定义结束的

    2.转换流(字节流与字符流之间的转化)
    字节流想利用字符缓冲流的readLine()--先转化为字符流,在被缓冲流装饰
    InputStreamReader和OutputStreamReader继承Reader
    InputStreamReader(InputStream in)--字节流转化为字符流可以指定charset编码
    对于字节与字符流的区别:字节对于一个中文需要读两次,字符对于中文其实也是利用底层的字节流读两次再进行查表,返回一个中文字符。
    字符流 = 字节流 + 编码表(未指定按照操作系统默认的码表)
    编码:文字转化为数字encode
    解码:数字转化为文字decode
    流的传送:源A地--小管道--大管道--大管道--小管道--目的B地
    转化流:可以指定编码表(未指定就用本机默认和其子类相同)
    中文GBK-2B/UTF-8(国际标准-按照实际长度定字节数-每字节存在编码头)
    指定用UTF-8写就要用UTF-8读
    * 什么时候使用转化流:
    源或目是字节流操作是文本数据,可以使用转化流,提高对 文本的操作
    一旦文本操作涉及具体的编码表时候,必须使用转化流

    3.流操作的基本规律---流只能对传送的数据进行操作
    * 明确源地和目地
    * 明确数据是否是纯文本数据--确定使用的具体体系
    是:字符流
    否:字节流
    * 明确具体的设备
    源设备:
    硬盘--文件
    键盘--System.in
    内存--数组
    网络--Socket流
    目设备:
    硬盘--文件
    控制台--System.out
    内存--数组
    网络--Socket流
    * 是否需要提高额外功能
    需要高效(缓冲区)
    是否需要转换流

    4.File类--将存在/不存在的文件或文件夹封装成对象
    * 方便对文件或文件夹的属性信息进行操作
    * File类对象可以作为参数传递给流对象
    * File类的常见方法
    构造方法
    File(File parent, String child) //1,2类似
    File(String parent, String child)
    File(String pathname)
    字段
    char separatorChar系统默认名称分隔符\
    char pathSeparatorChar系统默认路径分隔符
    常见的方法
    1.获取:文件名,文件路径,文件大小(不存在就0B),文件修改时间
    注意文件路径:相对路径和绝对路径(从根目录开始)
    2.创建与删除(文件、文件夹)
    boolean-创建createNewFile()不存在就创建,存在就不创建,与输出来不同,每次 都是进行覆盖/或者续写 --只能操作的文件或目录,不可以操作里面的数据
    删除boolean-delete() windows删除从里往外删除
    创建单极或多级目录(删除多级目录--只会删除最里面的一个目录)
    文件正在被访问不能删除
    3.判断
    先文件是否存在(是否目录/是否文件-针对存在)是否隐藏
    4.重命名renameTo(File dest) 重命名文件
    5.获取指定的当前目录下的文件及文件夹名称 String[]-list()
    (包含隐藏的文件夹)
    注意:封装File对象的时候必须是目录,不能是文件名
    如果目录存在,会返回一个长度为0的数组
    6.文件过滤器(重点)
    list(FilenameFilter filter)-String[]
    FilenameFilter--文件过滤器(接口)定义类--实现FilenameFilter接口
    将该类的对象传递给List()方法
    过滤器方法原理:先遍历目录,放在数组中并遍历,满足条件放在容器里面,
    把集合转化为数组返回
    7.深度变量文件夹--对指定目录的所有目录的列出[递归]
    8.递归
    * 一定要明确递归的条件,否则容易栈溢出
    5.Map接口的子类Properties--可以和IO技术结合--Map集合的属性集
    特点:集合中键和值都是字符串类型
    集合中的数据可以保存在流中,或者从流中获取
    作用:通常该集合用于操作以键值对形式存在的配置文件
    配置文件:存储配置信息的文件,用于配置某些应用程序<键值对,xml,数据库>
    遍历集合中元素:Set<String> stringPropertyNames()--变成集合,再迭代器
    Properties与流的结合
    list(PrintStream out)--直接将集合信息打印在控制台
    store(OutputStream out, String comments)--将集合信息存储硬盘--这就叫持久化
    两个参数,前面指定写的位置,后面字符串对数据进行描述--不要写中文注释
    修改硬盘上存储的键值对信息
    先读文件(保证里面是键值对)--放到集合--修改--存储
    load(InputStream inStream) 读数据
    java里面配置信息文件命名XX.properties/ini(windows系统)/xml文件
    eg:记录程序使用的次数---使用Properties--仅仅是Properties一个使用方面
    配置信息--通常用在保存应用程序的个性化设置(保存设置后关掉依然存在)
    注意:递归过程保证容器唯一,不要将容器定义在方法里面,要传参数容器
    定义方法的时候需要确定传入的参数--针对谁进行的处理

    6.其他的流对象--辅助功能
    打印流(不跑出异常):PrintStream--System.out返回值
    构造方法:接收File,字符串路径,流out对象
    常见方法:提供操作各种数据的打印方法。print方法保存数据的表示形式
    print(97)--文件里面就是97,write(97)--会选择最低的1B存储不会保留形式
    实现原理:将数字变成字符串然后写字符串
    PrintWriter--使用平台默认编码方式
    构造方法:接收File,字符串路径,流out对象,写字符流

    序列流:SequenceInputStream--对于多个流的合并--只有处理源的对象
    输入流的逻辑串联--把多条流封装为一条流(SequenceInputStream)
    本质就是集合中装入多个流--最后一个流返回值当作是结束
    将多个源合并成一个源
    eg:文件切割(按照顺序切割)+文件合并
    注意切割文件时候将文件类型和文件的个数存在一个配置文件里面,因为合并
    的时候需要用到这些信息

    对象流:ObjectInputStream/OutputStream--为了能够保存对象数据的关联性
    存储的对象--在硬盘的文件里面(对象的持久化存储)对象流+文件流的配合使用
    对象流的前提:要操作的对象必须实现serializable(标记接口)将对象转化为二进制数字流--对象要按照顺序存储在文件中--writeObject(Object obj)、readObject()
    注意:*存储对象仅仅只是想延长对象的生命周期,所以并不关心写出去的格式。
    *读对象所在文件时候必须使用基本流+对象流才能将数据转化为一个对象
    *读对象的时候必须保证有该对象的类文件在内存在+写出去的文件--两个存在 才可以成功读对象--强制转型
    *写对象--序列化;读对象--反序列化(类似于编码和解码)
    *关于存储对象--存储的是对象的非静态成员变量(被transient修饰的也不会 写到对象文件里面--其他并无差别--非静态数据不想被序列化)
    serializable(标记接口)存在的意义?--给类加ID
    存储对象--序列化的时候得到一个序列化id号(对应的类也有相同的id号),再进行读对象的反序列化的过程中,会检测加载的类与原来的类的对象id是否一致,不一致就会发生异常,就不能读对象
    不同版本的编译器可能编译的id结果不一致,解决办法自己定义对象序列化id号
    ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;


    RandomAccessFile--随机访问文件--不属于任何io的继承体系--字节流
    特点
    * 自身具备对随机访问文件的读写功能
    * 该对象内部维护了一个byte数组,并通过指针可以操作数组中的元素--数组可以延长--自动扩展
    * 可以设置和获取当前指针的位置
    * 其实该对象将字节输入流和字节输出流的封装--为一个整体的工具对象
    * 操作随机文件---只能是文件(源/目的)
    * 构造方法的特殊之处--指定操作文件的模式(读写的控制四种可选)
    * 该类里面有许多有用的方法读写基本数据类型(保证原本的字节数),字节数组等
    * 如果文件不存在则创建,存在则不创建-不会覆盖
    * 可以指定存储和写的位置,随机的对文件操作seek(long pos)--设置当前指针位置
    没有指定的情况下是从0角标开始写(若原来存在则覆盖)
    * 随机写--可以给任意位置写,可以从任意位置开始读
    * 随机访问文件要求数据要有规律,长度可以进行规律的估计
    * 小应用:利用多个线程负责不同地方的数据写数据(利用该类可以指定开始写位置)

    PipedInputStream/PipedOutputStream-管道流[应用于多线程]
    特点
    * 输入流与输出流可以直接连接 read()<-->write()
    * 管道流读必须要读管道流的输出
    read()[阻塞方法没管道输出数据,就一直等待]-->write()[后面就执行不到]
    程序就等待在这--一般用多线程可以处理该问题,写线程写出数据唤醒读线程
    * 管道流内部含有一个缓冲区
    * 需要调用connect()方法连接两个流

    DataInputStream/DataOutputStream---操作基本数据类型
    特点--保存基本数据类型的形态
    * 使用结合+InputStream--读和写的类型必须一致
    * writeUTF()--readUFT()对于使用(编码和解码是utf8修改版)自动添加的头信息

    操作数组的流对象--[源与目都是内存上]
    ByteArrayInputStream/ByteArrayOutputStream--用流的思想操作数组
    特点
    * 内存中存在可变长度的数组缓冲数据
    * 不用关闭流(关闭流原因:调用底层的资源)--操作的内存不用底层的资源


    * 不会抛出io异常
    * ByteArrayInputStream(byte[] buf)--明确源内存
    ByteArrayOutputStream()--自动包含数组--也可以指定缓冲区的大小
    * 如果要操作的源是内存--直接就用ByteArrayInputStream
    CharArrayReader/CharArrayWriter
    StringReader/StringReader

    7.常见的编码表
    ASCII-可以是7bit字符
    GBK--中文编码
    unicode--统一处理方式固定长度编码--2B
    utf-8--不固定长度的编码,最多可以用三个字节表示一个字符

  • 相关阅读:
    hdu2191(多重背包)
    hdu3664(递推dp)
    hdu2955(变形01背包)
    hdu1712(分组背包)
    hdu1114(完全背包)
    hdu4004(二分)
    hdu2870(dp求最大子矩阵)
    POJ 1979 Red and Black(水题,递归)
    POJ 1922 Ride to School(贪心+模拟)
    POJ 1182 食物链(种类并查集)
  • 原文地址:https://www.cnblogs.com/sun1993/p/7616031.html
Copyright © 2011-2022 走看看