Java IO集合

java IO
字节流
    数据流,但是却是按照字节来的  byte

字符流
    数据流,但是确实按照字符来操作的
    读取字节流后不直接操作,先查编码集,获取对应字符
    然后对字符操作,简单点 字节流+编码表

输入流
输出流
    对于内存而言的,
    将外设(硬盘也算)中的数据读到内存:输入(读入内存)
    将内存的数据写入到外设(硬盘也算):输出(从内存写入设备中)

字节流的两个顶层父类
    InputStream OutputStream

字符流的两个顶层父类
    Reader    输入流 (从文件读取到内存)
    Write     输出流 (从内存写入到文件)
    
    两个重要方法,读取一个字符,读取字符到数组。
    
FileReader/FileWriter
BufferedReader/BufferedWriter

    特色功能 newline  readline

    BufferedWriter如果不使用newline以为着这一行没有换行符,这行还没有打完!

    所有的write(String)方法都不包含换行符的,会导致对应的readline继续阻塞!
    都是针对字符流的操作,针对文本的操作!


FileReader 和 BufferedReader 共同继承了Reader
如果想对FileReader功能进行加强 如果走继承的路的话,
每一种字符流都继承一个的话,继承的体系会变的非常复杂
通过装饰器模式更加清晰,将需要加强的功能抽象出来形成一个装饰器类,
比如是增加缓冲功能,那么装饰器接受不同的类,对这些类提供缓冲功能,
有一个限制,装饰器接收的类和装饰类必须有同一语义上的父类。

装饰比继承灵活得多。

字节流的两个顶层父类    
    InputStream OutputStream
    
    InputStreamReader(InputStream)字节流转字符流读取出来(可以指定字符集)
        按字符流读取字节流
    OutputStreamWriter(OutputStream)字符流转字节流输出(可以指定字符集)
        把字符编码 写入字节流

System.in/out 是字节流
    

流的选择
    
    1明确源和目的
        源:字节流 InputStream 
            字符流 Reader
        目的地:字节流 OutStream
                字符流 Writer
    
    2明确数据是否是纯文本数据
        是-->字符流
        不是-->字节流
    
    3明确是否需要额外的功能
        比如说要不要缓冲
        
字符集 编码表
    两者是不是一个概念我还需要搞清楚
    
    当往一个文件中写数据的时候如果设计到编码表/字符集
    
    这个只有字节流是支持的,(字符集都是字符,你不知道'a'底层到底是哪一个编码值)
    字节流可以设定编码表 "UTF-8",写入的时候是什么编码表,读取的时候也要是相应的编码表

File类 (File类实际上是路径,跟有没有文件两码事)
    
    创建文件/目录 删除文件/目录(删除子目录包括文件的时候,最好递归,从里删到外)全部外面直接delete不了
    判权限 设权限 canExcute canRead canWrite setExcutable
    路径   绝对相对 父路径
    路径空间 
    文件大小长度,上次修改时间 lastModified() 
    路径下 文件列表
    
    list() 文件名列表
    listfiles() 一堆文件路径的列表

Properties
    可以往打印流输出 list
    可以从字节流读入
    可以从字符流读入
    可以从xml读入 loadFromXML
    返回keyset 视图 StringPropertyNames()
    
    store具备一个向输出流中 存储的功能
    
printStream
    输出到字节流!
    仅仅为了实现打印功能,即参数里面传的是什么,就按照对应的字符的编码写入
    
PrintWriter
    输出到字符流!!
    仅仅为了实现打印功能
    
sequenceInputStream    
    序列流(字节流)
    排列输入流,从第一个流读完了接着读第二个流
    
对象序列化
    ObjectOutputStream
    ObjectInputStream

    可以手动设定序列号
    private static final long serialVersionUID = 9527;
    在写入对象的时候,吧对象所属类的序列号(类的ID,用于读取的时候判定是不是同一个类)
    但是不同版本的编译器,序列号的计算实现未必一直,可能老版本的序列号新版本已经不支持
    为了避免这个可以使用手动设定类的序列号!    
    
    静态属性
    在对象序列化的时候,共有的静态属性是写不进去的,原本运行环境中类的静态属性是什么就还是什么;

    不想序列话的非静态域
    关键字tansient 标记的域使用默认内容填充

随机访问文件RandomAccessFile
    字面意思,随机访问文件,按照字节来的
    getFilePointer() 
    read/write各种字节,字符,line
    
    seek设置指针,可以多线程写入,每个线程都可以同时写文件,从不同的位置开始
    
    也要close
    

有关字符串和字节数组的转换 getBytes/new String
    String str = "阿道夫zdk";
    byte[]by = str.getBytes("字符集");
    String strNew = new String(by,"字符集");
    对于字节流写入字符串可以用 getBytes 
    从字节流读取出来后转字符串可以 new String(bytes[]);

DataInputStream、DataOutputStream
    操作基本数据的流对象
    比较特别的是,一般的字节流仅仅支持单字节或者字节数组写入/读取
    这个支持写int long等等多字节写入,支持这个功能的还有ObjectOutputStream,RandomAccessFile


    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值