Java IO(4)
来源:互联网 发布:mentohust mac.tar.gz 编辑:程序博客网 时间:2024/06/18 09:28
上次回顾:
File类:直接与文件本身有关系
字节流:OutputStream、InputStream
字符流:Writer、Reader
存放在文件中的都是字节,而读到内存中才可能变成字符
打印流:PrintStream/PrintWriter:提供了各种打印功能,可以输出任意的内容,根据实例化对象的不同输出的位置也不同。
System.in:键盘输入流、System.out:屏幕输出流
输入数据的一个基本格式:BufferedReader
一、字符集: 文件保存时所使用的编码。
GB2312<GBK<ISO8859-1 (中文简体<中文简体加繁体的字符集 <国际通用字符集)
设置系统编码字符集:
System.getProperties().put("file.encoding","iso8859-1")
列出系统全部设置属性:
System.getProperties().list(System.out)
转换编码:
String类中的:byte[] getBytes(String charsetName)
使用指定的字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中。
file.encoding=GBK :说明JVM中默认的文件编码为GBK。
在这种编码下,可以正常在文件中输出中文,如果在程序中将编码变成ISO8859-1,则会出现乱码。
乱码产生的根本原因:两国语言不通,即两个操作间的字符集没有匹配。
二、SequenceInputStream类 用来合并文件。
SequenceInputStream(InputStream s1, InputStream s2)
通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。
接收两个InputStream对象,这就意味着程序要先使用InputStream找到这两个文件。
例:将csdn1.txt和csdn2.txt文件合成一个新的csdn文件,把内容也合并。
后面内容为 Java → J2EE中都占用很大比重的部分 ----- 序列化
三、对象序列化(1)
对象序列化是指把对象写入到流中,对象的饭序列化是指从流中恢复对象
优点在于即使程序运行结束,对象仍然可以保存下来(到文件中)。
对象所在的类必须实现java.io.Serializable接口,才能被序列化。
▼对象序列化的步骤:
1.创建一个对象输出流,他可以连接到一个其他的流,比如文件输出流
ObjectOutputStream out=new ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream。
new FileOutputStream("F://object.obj")
2.通过对象输出流的writeObject方法序列化对象
void writeObject(Object obj)
将指定的对象写入 ObjectOutputStream。
例:
out.writeObject("hello")
out.writeObject(new date())
out.writeObject(serialObject)
如果需要将对象变为byte流,则需要将对象进行转化:ObjectOutputStream实现
此种做法类似于PrintWriter/PrintStream,谁为ObjectOutputStream实例化就向那里输出。
▼对象反序列化的步骤
1.创建一个对象输入流,他可以连接到一个其他的流,比如文件输入流
ObjectInputStream in=new ObjectInputStream(InputStream in)
创建写入指定 InputStream 的 ObjectInputStream。
new FileInputStream("F://object.obj")
2.通过对象输入流的writeObject方法序列化对象
Object readObject()
从 ObjectInputStream 读取对象。
例:
in.readObject("hello")
in.readObject(new date())
in.readObject(serialObject)
必须明确告诉ObjectInputStream从哪里读内容。
一个序列化的核心部分:Serializable接口
Ψ疑问的是:在Person类中并没有重写接口中的任何方法?(Person类为被序列化的类)
因为此接口只是一个声明性接口,表示实现此接口的类可以被序列化。
也可以这样理解:此接口只是一个标识,说明可以被序列化;与克隆类似,如果一个类要被克隆,则必须实现Cloneable接口,这个接口也是一个标识。
Ψ又疑的是:现在程序中姓名和年龄都被序列化,现在不希望年龄被序列化。
可以使用transient关键字:当不希望类中的某个字段被序列化时,可用此关键字。
例:private transient int age;
小结一下:
变量声明的完整定义:
[public | protected | private] [final] [static] [transient] 数据类型 变量名 ;
方法的完整定义:
[public | protected | private] [final] [static] [synchronized]
方法返回类型 | void 方法名 ( [参数列表]) { }
练习一下:
设计以程序Copy.java,实现文件的拷贝工作
要求:模仿DOS的Copy命令,输入两个路径名
提示:可以使用File、FileInputStream、FileOutputStream实现
执行如下:java Copy C://1.txt d://
本次IO学习重点:
File类
字节流和字符流的操作
打印流的使用
对象序列化(重点)
- Java IO(4)
- Java IO 4:字符编码
- 【Java-IO】IO入门
- Java IO:IO框架
- 【IO】java IO 总结
- java IO
- IO.java
- JAVA IO
- JAVA IO
- java IO
- java io
- JAVA IO
- java IO
- java IO
- java io
- java io
- java io
- java IO
- 功能的类
- 我经常中一些小木马
- 初学者的心得体会
- 坚持就是胜利
- 学C#心得
- Java IO(4)
- Ubuntu系统请把所有问题解决完再发布 [转]
- 四十岁的盈利模式
- 使用ASP.NET从零开始制作设计网站之七
- ..........
- 使用ASP.NET从零开始制作设计网站之八
- Java JDK配置
- 全球最动听的英文花名
- Java和C#学习闲谈