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方法,并在其中加入一些自定义操作,在序列化
时将会被自动调用,达到序列化控制的目的。