`
zhangxiang390
  • 浏览: 214755 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java的文件和流(下)

阅读更多

8.对象流

    串行化:对象通过写出描述自己状态的数值来记述自己的过程叫串行话
    对象流:能够输入输出对象的流
    将串行化的对象通过对象流写入文件或传送到其他地方
    对象流是在普通流上加了传输对象的功能,所以构造对象流时要先构造普通文件流
    注意:只有实现了Serializable接口的类才能被串行化
    例子:

import java.io.*;
class Student implements Serializable{
	private String name;
	private int age;
	
	public Student(String name,int age){
		this.name=name;
		this.age=age;
	}
	
	public void greeting(){
		System.out.println("hello ,my name is "+name);
	}
	
	public String toString(){
		return "Student["+name+","+age+"]";
	}
}

public class ObjectOutTest{
	public static void main(String args[]){
		ObjectOutputStream oos=null;
		try{
			oos=new ObjectOutputStream(
			new FileOutputStream("student.txt"));
			Student s1=new Student("Jerry",24);
			Student s2=new Student("Andy",33);
			
			oos.writeObject(s1);
			oos.writeObject(s2);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(oos!=null)
			try{
				oos.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
}

import java.io.*;
public class ObjectInTest{
	public static void main(String args[]){
		ObjectInputStream ois=null;
		Student s=null;
		try{
			ois=new ObjectInputStream(
			new FileInputStream("student.txt"));
			System.out.println("--------------------");
			s=(Student)ois.readObject();
			System.out.println(s);
			s.greeting();
			System.out.println("--------------------");
			s=(Student)ois.readObject();
			System.out.println(s);
			s.greeting();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(ois!=null)
			try{
				ois.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
}

 9.字符流 InputStreamReader/OutputStreamWriter

    上面的几种流的单位是 byte,所以叫做字节流,写入文件的都是二进制字节,我们无法直接看,下面要学习的是字节流
    Java采用 Unicode 字符集,每个字符和汉字都采用2个字节进行编码,ASCII 码是 Unicode 编码的自集
    InputStreamReader 是 字节流 到 字符桥的桥梁 ( byte->char 读取字节然后用特定字符集编码成字符)
    OutputStreamWriter是 字符流 到 字节流的桥梁 ( char->byte )
    他们是在字节流的基础上加了桥梁作用,所以构造他们时要先构造普通文件流
    我们常用的是:
    BufferedReader 方法:readLine()
    PrintWriter 方法:println()

    例子:

import java.io.*;
public class PrintWriterTest{
	public static void main(String args[]){
		PrintWriter pw=null;
		try{
			pw=new PrintWriter(
			new OutputStreamWriter(
			new FileOutputStream("bufferedwriter.txt")));
			pw.println("hello world");
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(pw!=null)
			try{
				pw.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
}

import java.io.*;
public class BufferedReaderTest{
	public static void main(String args[]){
		BufferedReader br=null;
		try{
			br=new BufferedReader(
			new InputStreamReader(
			new FileInputStream("bufferedwriter.txt")));
			System.out.println(br.readLine());
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(br!=null)
			try{
				br.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
}

  10.随机存取文件 RandomAccessFile

    可同时完成读写操作
    支持随机文件操作的方法:
    readXXX()/writeXXX()
    seek() 将指针调到所需位置
    getFilePointer() 返回指针当前位置
    length() 返回文件长度
    例子:把若干个32位的整数写到一个名为 “temp.txt”的文件中,然后利用seek方法,以相反的顺序再读取这些数据

import java.io.*;
public class RandomFile{
	public static void main(String args[]){
		RandomAccessFile raf=null;
		int data[]={12,31,56,23,27,1,43,65,4,99};
		try{
			raf=new RandomAccessFile("temp.txt","rw");
			for(int i=0;iraf.writeInt(data);
			for(int i=data.length-1;i>=0;i--){
			raf.seek(i*4);
			System.out.println(raf.readInt());
			}
		}catch(Exception e){
			e.getMessage();
		}finally{
			if(raf!=null)
			try{
				raf.close();
			}catch(Exception e){
				e.getMessage();
			}
		}
	}
}

 

11.小结
    
    这部分的难点就是类比较复杂,尤其是每个类的构造方式,我认为记住下面这个图比记类的继承关系更好些

    a. 字节流:
    InputStream
    |-- FileInputStream (基本文件流)
    |-- BufferedInputStream
    |-- DataInputStream
    |-- ObjectInputStream
    OutputStream 同上图
    BufferedInputStream DataInputStream ObjectInputStream 只是在 FileInputStream 上增添了相应的功能,构造时先构造FileInputStream

    b. 字符流:
    Reader
    |-- InputStreamReader (byte->char 桥梁)
    |-- BufferedReader (常用)

    Writer
    |-- OutputStreamWriter (char->byte 桥梁)
    |-- BufferedWriter
    |-- PrintWriter (常用)

    c. 随机存取文件 RandomAccessFile

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics