Java学习日志(21-1-IO流-序列化、管道流与随机读取)

原创
2016/10/10 11:09
阅读数 29

对象的序列化

//建立对象
import java.io.*;
class Person implements Serializable{
	// 固定ID,私有化后仍可引用
	public static final long serialVersionUID=421;
	private String name;
	// 被transient修饰则不再序列化
	transient int age;
	static String country="cn";
	Person(String name,int age,String country){
		this.name=name;
		this.age=age;
	}
	public String toString(){
		return name+":"+age+":"+country;
	}
}

//序列化
import java.io.*;
class ObjectStreamDemo{
	public static void main(String[] args)throws Exception{
		// writeObj();
		readObj();
	}
	
	public static void readObj()throws Exception{
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream("obj.txt"));
		Person p=(Person)ois.readObject();
		System.out.println(p);
		ois.close();
	}
	
	public static void writeObj()throws IOException{
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("obj.txt"));
		oos.writeObject(new Person("lisi",39,"cn"));
		oos.close();
	}
}

管道流

    PipedlnputStream    PipedOutputStream

    需要调用线程运行

import java.io.*;
class Read implements Runnable{
	private PipedInputStream in;
	Read(PipedInputStream in){
		this.in=in;
	}
	public void run(){
		try{
			byte[]buf=new byte[1024];
			int len=in.read(buf);
			String s=new String(buf,0,len);
			System.out.println(s);
			in.close();
		}
		catch(IOException e){
			throw new RuntimeException("管道读取流失败");
		}
	}
}
class Write implements Runnable{
	private PipedOutputStream out;
	Write(PipedOutputStream out){
		this.out=out;
	}
	public void run(){
		try{
			out.write("oioed laile".getBytes());
		}
		catch(IOException e){
			throw new RuntimeException("管道输出流失败");
		}
	}
}

class PipedStreamDemo{
	public static void main(String[] args)throws IOException{
		PipedInputStream in=new PipedInputStream();
		PipedOutputStream out=new PipedOutputStream();
		in.connect(out);
		Read r=new Read(in);
		Write w=new Write(out);
		
		new Thread(r).start();
		new Thread(w).start();
	}
}

RandomAccessFile

    该类不算IO的子类,直接继承自Object

    具备读和写的功能,内部封装了一个数组,通过指针对数组的元素进行操作

    可以通过getFilePointer获取指针位置,seek改变指针位置

    完成读写的原理就是内部封装了字节输入列和输出流

    通过构造函数可以看出,该类只能操作文件

    而且操作文件还有模式:只读r,,读写rw等

    如果模式为r,不会创建文件,会读取一个已存在的文件,如果不存在则出现异常

    如果模式为rw,操作的文件不存在,则会自动创建,如果存在不会覆盖

    可以实现数据的分段写入

import java.io.*;
class RandomAccessFileDemo{
	public static void main(String[] args)throws Exception{
		// writeFile();
		writeFile_2();
		// readFile();
		
	}
	
	public static void readFile()throws Exception{
		RandomAccessFile raf=new RandomAccessFile("ran.txt","r");
		// 调整指针,即开始读取的位数
		// raf.seek(8);
		
		// 跳过指定的字节数,不能往回跳
		raf.skipBytes(8);
		
		// 读取数组
		byte[]buf=new byte[4];
		raf.read(buf);
		String name=new String(buf);
		int age=raf.readInt();
		System.out.println("name  "+name);
		System.out.println("age  "+age);
		raf.close();
	}
	
	public static void writeFile_2()throws IOException{
		RandomAccessFile raf=new RandomAccessFile("ran.txt","rw");
		raf.seek(8*3);
		raf.write("周期".getBytes());
		raf.writeInt(103);
		
		raf.close();
	}
	
	public static void writeFile()throws Exception{
		RandomAccessFile raf=new RandomAccessFile("ran.txt","rw");
		raf.write("李四".getBytes());
		raf.writeInt(97);
		raf.write("王五 ".getBytes());
		raf.writeInt(99);
		raf.close();
	}
}

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部