Java核心库—IO(三)

来源:互联网 发布:梧州网络问政 编辑:程序博客网 时间:2024/05/03 12:57
1.序列化和反序列化
序列化:把堆内存中的java对象数据,通过某种方式存储到磁盘文件中或者传递给其他网络节点(网络传播时候)
反序列化:把磁盘中文件的对象数据或者网络节点上的对象数据,恢复成java对象的过程

为什么要做序列化:
(1)在分布式系统中,需要共享的数据的JavaBean对象都得做序列化,此时需要把对象在网路络上传输,此时旧的把对象数据转换为二进制形式
以后存储在HttpSession中的uid,都应该实现序列化接口(只有实现序列化接口的类,才能做序列化操作)
(2)服务器钝化:如果服务器发现某些对象很久没有活动,此时服务器要把这些内存中的对象,持久化在本地磁盘文件(java对象——>二进制文件)
如果某些对象需要活动的时候,先在内存中去寻找,找不到再去磁盘我呢见在,反序列化我们的对象数据,恢复成java对象
需要做序列化的对象的类,必须实现序列化接口
java.io Interface Serializable,标志接口:没有抽象方法
boolean rot = 对象 instanceof Serializable
在java中大多数类都已经实现了Serializable接口
----------------------------------------
使用对象流来完成序列化和反序列化:
ObjectInputStream :通过writerObject方法做序列化操作
ObjectOutputStream:通过readerObject方法做反序列化操作
此时报错是因为没有实现Serializable接口
User
//需要序列化操作的对象public class User implements Serializable{String name;int age;String career;String password;public User(String name, int age, String career, String password) {super();this.name = name;this.age = age;this.career = career;this.password = password;}public String toString() {return "User [name=" + name + ", age=" + age + ", career=" + career + ", password=" + password + "]";}}
ObjectStreamDemo
//通过文件输出流来实现序列化/反序列化操作操作public class ObjectStreamDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {File f = new File("file/objstream.txt");//writeObject(f);readObject(f);}public static void readObject(File f) throws IOException, ClassNotFoundException {FileInputStream fis = new FileInputStream(f);ObjectInputStream ois = new ObjectInputStream(fis);Object obj = ois.readObject();System.out.println(obj);ois.close();}//序列化操作public static void writeObject(File f) throws IOException {FileOutputStream fos = new FileOutputStream(f);ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(new User("allen",17,"programmer","qweasd123"));oos.close();}}

2.扫描器类:输入操作
//扫描器类
public class ScannerDemo {
public static void main(String[] args) throws IOException {
//扫描键盘输入的数据
Scanner sc = new Scanner(System.in);
while( sc.hasNext()){
String si = sc.nextLine();
System.out.println(si);
}
sc.close();
}
}

3.properties类资源加载文件
资源文件(以properties作为扩展名的文件)/属性文件:

做项目开发,为何使用配置文件?
把所有的数据存储在代码中,写死“硬编码”。
数据库的链接信息保存在db.properties文件中,而java代码需要获取该文件中的信息
java如何加载propertie文件,如何获取该文件中的数据
必须使用properies类(Hashtable的子类,map接口的实现类)

public class LoadResourceDemo {
public static void main(String[] args) throws IOException {
//创建properties对象
Properties p = new Properties();
InputStream in =new FileInputStream("D:/javaApp2/IO/src/db.properties");
//加载输入流中的数据,加载之后数据都在p对象中
p.load(in);
System.out.println(p);
System.out.println("账号: "+ p.getProperty("username"));
System.out.println("密码: "+ p.getProperty("password"));
}
}

----------------------------------------------------
4.数据流:提供了可以写/读任意数据类型的方法
DataOutputStream 提供了 wrtieXxx()方法
DataInputStream 提供了readXxx()方法
注意:wrtieXxx和 readXxx必须对应起来,writeByte 写出的数据必须用 readByte读取
//数据流public class DataStreamDemo {public static void main(String[] args) throws IOException {File f = new File("file/out.txt");write(f);//写数据流read(f);//度数据流}public static void read(File f) throws IOException {DataInputStream in = new DataInputStream(new FileInputStream(f));System.out.println(in.readByte());System.out.println(in.readInt());System.out.println(in.readUTF());in.close();}public static void write(File f) throws IOException {DataOutputStream dout = new DataOutputStream(new FileOutputStream(f));dout.writeByte(65);dout.writeInt(12);dout.writeUTF("AA");dout.close();}}
---------------------------------------
randomaccessfile经常用来做多线程断点下载:
1)多线程
2)断点下载
------------------------------
5.管道流:实现两个线程直接的数据交互
pipedinputstream
pipedoutputstream
pipedwriter
pipedreader


----------------------------
6.总结:
四大基流:
InputStream——OutputStream
Reader ——Writer
文件流:
FileInputStream
FileOutputStream
FileReader
FileWriter
缓冲流:
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
转换流(字节转换为字符):
InputStreamReader
OutputStreamWriter
内存流(临时存储数据):
ByteArrayInputStream
ByteArrayOutputStream
CharArrayReader
CharArrayWriter
StringArrayWriter
StringArrayReader
合并流(顺序流):
SequenceInputStream
对象流:序列化和反序列化
ObjectInputStream
ObjectOutputStream
打印流:
PrintStream
PrintWriter
数据流:
DataInputStream
DataOutputStream
管道流:
PipedInputStream
PipedOutputStream
PipedReader
PipedWriter

原创粉丝点击