18.java IO 系统

1.File类
  File既可以代表一个文件,又可以是一组文件。FilePath更适合File类。
2.输入输出
  流
  代表又能产出数据的数据源对象或者有能力接受数据接收端对象。
  java中流类库让人迷惑主要原因是:创建单一的结果流,却需要创建多个对象。
 
               java.io.InputStream
 _______________________|______________________________
 |                                                     |
ByteArrayInputStream(内存缓冲区)                FilterInputStream(装饰器)
StringBufferInputStream(String )_____________________|____________________________
FileInputStream(文件)           |                |                    |          |
PipedInputStream(管道)     DataInputStream BufferedInputStream  LineNumInpuStream XXX
                             基本类型读取    缓冲区读取           增加行号读取


左边4个是基础流,所有流都必须从四个中选一个,根据想添加的功能,从右边选择一个装饰。如:
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(path)));


                    java.io.OutpuStream
______________________________|__________________________  
|                                                        |
ByteArrayOutputStream(送往内存缓冲区)               FilterOutputStream(装饰器)         
FileOutputStream(写往文件)             __________________|_______________
PipedOutputStream(用于多线程)          |                 |               |
                                 DataOutputStream    PrintStream   BufferedOutputStream    
                                  基本类型读取         格式化输出       缓冲区写操作

Reader 和 Writer主要是为了处理用于国际化的16位Unicode字符,老的I/O继承结构仅支持8位的字节流。
两个继承结构的对应关系中,
InputStream              Reader 适配器InputStreamReader
ByteArrayInputStream     CharArrayReader
StringBufferInputStream  StringReader

3.标准I/O
  System.in是一个没有被包装过的InputStream
  System.out System.err都是包装过的printStream
  BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));//将System.in包装成Reader
  PrintWriter out = new PrintWriter(System.out,true); //将System.out包装成Writer
  标准I/O重定向
  当屏幕上有大量输出时,滚动太快无法阅读,所以重定向。
  setIn(in)
  setOut(out)
  setErr(out)

4.新I/O
 
5.压缩
  类似于装饰类,用法直观
  BufferedOutputStream out = new BufferedOutputStream(
                                 new GZIPOutputStream(new FileOutputStream("test.gz"))); 
  其他操作留给通常的I/O读写
  如果保存多个文件,用zip
  ZipOutputStream zos = new ZipOutputStream(
                             new CheckedOutputStream(new FileOutputStream("test.zip"),new Adler32()));
                                        |                                                   |
                                      校验类                                          Adler32快CRC32慢,准

  jar打包
  jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
{ctxu} 是 jar 命令的子命令,每次 jar 命令只能包含 ctxu 中的一个,它们分别表示:
-c 创建新的 JAR 文件包
-t 列出 JAR 文件包的内容列表
-x 展开 JAR 文件包的指定文件或者所有文件
-u 更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中) 
  
[vfm0M] 中的选项可以任选,也可以不选,它们是 jar 命令的选项参数

-v 生成详细报告并打印到标准输出
-f 指定 JAR 文件名,通常这个参数是必须的
-m 指定需要包含的 MANIFEST 清单文件
-0 只存储,不压缩,这样产生的 JAR 文件包会比不用该参数产生的体积大,但速度更快
-M 不产生所有项的清单(MANIFEST〕文件,此参数会忽略 -m 参数    

[jar-文件] 即需要生成、查看、更新或者解开的 JAR 文件包,它是 -f 参数的附属参数

[manifest-文件] 即 MANIFEST 清单文件,它是 -m 参数的附属参数

[-C 目录] 表示转到指定目录下去执行这个 jar 命令的操作。它相当于先使用 cd 命令转该目录下再执行不带 -C 参数的 jar 命令,它只能在创建和更新 JAR 文          件包的时候可用。  
   
6.对象序列化
  a.基本概念
  what?将实现了Serializable接口的对象转换成一个字节序列,并能恢复。
  usage?一是java的远程方法调用(Remote Method Invocation,RMI) 消除系统间不同。
        二是保存javabean的配置信息
  可以用它实现轻量级持久性。
  持久性:对象的生存周期不依赖程序是否执行。
  轻量级:不能靠某些持久的关键字定义对象,让系统做更多工作,简而言之,不够自动化。
  例子code:
  Worm w  = new Worm(6,"a");
  ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("worm.out"));
  out.writeObeject("Worm storage\n");//先序列化了字符串
  out.writeObeject(w); //写对象w
 
  ObejectInputStream in = new ObjectInputStream(new FileInputStream("worm.out"));
  String s = (String) in.readObeject();
  Worm w2 = (Worm) in.readObeject();
  以上是序列化的流程,序列化是基于字节的,所以要使用InputStream和OutputStream继承层次结构
 
  b.序列化控制之一--Externalizable接口
    Externalizable继承Serializable,实现的Externalizable都有ReadExternal和WriteExternal方法
    分别在读写时自动调用,特别的,在恢复对象时,是通过调用pulic的默认构造器实现,所以必须在
    ReadExternal中写上域初始化语句,否则,达不到预期对象。这也是序列化过程控制的问题。
  c.序列化控制之二--transient关键字
    public transient String password;这部分不用序列化。
  d.序列化控制之三--Externalizable的替代方法
    在实现Serializable的类中添加ReadObject和WriteObject方法,并在其中加入一些自定义操作,在序列化
    时将会被自动调用,达到序列化控制的目的。
 
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值