初学者对于I/O流的小节-下
来源:互联网 发布:科比个赛季数据统计 编辑:程序博客网 时间:2024/05/15 01:15
**
初学者对于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(); 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(); } }
此文章为自己总结 ,欢迎大家改正批评! 不喜勿喷
0 0
- 初学者对于I/O流的小节-下
- 初学者对于I/O流的小节-上
- 对于I/O流的理解
- 对于java i/o流的看法
- 初学者说i/o流
- 对于I/O操作的部分整理
- Linux 下的I/o
- Linux 下的I/O
- Linux下的I/O
- linux下的I\O
- Linux下的I/O
- Linux下的I/O
- Linux下的I/O
- Linux下的I/O
- Linux下的I/O
- 对于I/O完成端口机制我的理解
- Google I/O 2015对于开发者的福利
- I/O流学习--InputStream下的常用方法
- Tomcat内存溢出和Myeclipse的JVM内存溢出
- github使用
- [2016/7/9]素数筛
- hello world
- 四种方案解决ScrollView嵌套ListView问题
- 初学者对于I/O流的小节-下
- Codeforces Round #357 (Div. 2) -- D. Gifts by the List(DFS)
- 今天开始正式入住CSDN
- Java并发编程与技术内幕:聊聊锁的技术内幕(上)
- 对于javascript四舍五入保留多少位小数的问题
- Linux编写一个孤儿进程,这个孤儿进程可以同时创建100个僵死进程。
- Python cx_Oracle & Oracle Client for Mac OS
- C++深拷贝和浅拷贝
- SVN服务器搭建和使用