您的位置:首页 > 编程语言 > Java开发

初学者对于I/O流的小节-下

2016-07-09 12:48 417 查看
**

初学者对于I/O流的小节-下

**

**

- 对象的序列化与反序列化

对象的序列化的 意思 就是把一个 Obj 转换为一个byte 序列 。

反之 就是 反序列化

序列化流 ObjectOutputStream 是过滤流

反序列化流就是 ObjectInputStream

注: 所要保存的 Obj 必须实现 序列化接口! 这个接口里面没有任何方法

如下类 首先是序列化 之前创建了一个 这个 Student的 类 里面有学号姓名身高 三个属性

//对 对象进行序列化的实质 就是要对于对象保存
public static void main(String[] args) {
File file = new File("d://Student.obj");
//这里文件后缀名可以自定义
try {
OutputStream out = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(out);
Student stu = new Student("20222", "小名", 180);
oos.writeObject(stu);
oos.flush();
oos.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}


对象的反序列化

File file = new File("d://Student.obj");//找到刚才的文件
try {
InputStream in = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(in);
Student stu1 = (Student)ois.readObject();
System.out.println(stu1.toString());

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


注:

1.有一种特殊情况 当 我对象中的 一个类 不想被序列化的时候 只需要在类定义的时候 加上transient 关键字 就可以了。

2.如果一个类的父类实现了序列化接口,那么他的子类可以序列化。

3.在子类进行反序列化的时候,如果其父类没有实现序列化接口,那么其父类的构造方法会被调用

- New Io –NIO

顾名思义 就是新的IO 库

原来也就是上文所提到的,i/o 是使用流的方式去处理数据,而Nio 是用块的方式去处理数据。

基础实例

public static void main(String[] args) {

//向内存申请 8 个字节的空间  的 一块缓存
ByteBuffer buf= ByteBuffer.allocate(8);

System.out.println(buf.position());//头指针的位置
System.out.println(buf.limit());//限制指针的位置
System.out.println(buf.capacity());//容量大小
System.out.println("之后");
buf.put((byte)11);//写入一个元素
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
System.out.println("之后");

buf.flip();//因为在添加的时候 这个头指针 也就是 position 会随着增加元素的操作 往后移动
//调用flip 方法就可以使得 position 回到开始的位置
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());

//取值
for (int i = 0; i < buf.remaining(); i++) {
//remaining 返回当前位置 与限制之间的元素数字!!
System.out.println(buf.get(i));
}

}


加上文件通道 利用文件通道实现文件拷贝

public static void copy(File src,File dest)
{
try {
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dest);
FileChannel fcIn = in.getChannel();//获取文件通道
FileChannel fcOut = out.getChannel();

ByteBuffer buf = ByteBuffer.allocate((int)src.length());//分配一个大小等于目标文件大小的内存块
fcIn.read(buf);
buf.flip();
fcOut.write(buf);
fcIn.close();
fcOut.close();
in.close();
out.close();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}


RandomAccessFile

这个类既可以读取文件,又可以写文件。有两种模式打开文件 rw 和 r

内部有文件指针,打开文件的的时候 指针在开头。

public static void main(String[] args) {
try {
RandomAccessFile raf = new RandomAccessFile("d://a.txt", "rw");
raf.writeInt(18);
raf.writeUTF("世界");
raf.seek(0);//开始读取之前 指针指定到初始的位置
//开始读取
int i = raf.readInt();
String str = raf.readUTF(
aad5
);
System.out.println(str+ i);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}


此文章为自己总结 ,欢迎大家改正批评! 不喜勿喷
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  io 对象 java