IO流体系

分类                 字节输入流                       字节输出流                         字符输入流                    字符输出流


抽象基类          InputStream                       OutputStream                     Reader                        Writer

访问文件          FileInputStream                 FileOutputStream                FileReader                  FileWriter

访问数组          ByteArrayInputStream       ByteArrayOutputStream      CharArrayReader        CharArrayWriter

访问管道          PipedInputStream             PipedOutStream                   PipedReader               PipedWriter

访问字符串                                                                                             StringReader               StringWriter

缓冲流              BufferedInputStream         BufferedOutputStream         BufferedReader          BufferedWriter

转换流                                                                                                     InputStreamReader    OutputStreamWriter

对象流             ObjectInputStream              ObjectOutputStream          

抽象基类          FilterInputStream                FilterOutputSteam              FilterReader                 FilterWriter

打印流                                                          PrintStream                                                            PrintWriter

推回输入流      PushbackInputStream                                                    PushbackReader

特殊流             DataInputStream                  DataOutputStream


-----------------------------------------------------------------------------------------------------------------------------------------------

对象流:资料来自尚硅谷

1.1 对象的序列化

对象序列化的目标是将对象保存到磁盘上,或允许在网络中直接传输对象。

序列化是RMI(Remote Method Invoke - 远程方法调用) 过程的参数和返回值都必须实现的机制,而RMI是javaEE的举出。因此序列化机制是JAVAEE平台的基础。

如果需要让某一个对象支持序列化机制,则必须让该类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:

--Serializable

--Externalizable

1.2 使用对象流序列化对象

  *   若某个类实现了Serializable 接口,该类的对象就是可序列化的:

             --创建一个ObjectOutputStream

             -- 调用ObjectOutputStream 对象的writeObject()方法输出可序列对象

 *   反序列化

            --创建一个ObjectInputStream

            --调用readObject()方法读取对象

注意:如果某个类的字段不是基本数据类型或String类型,而是另一个引用类型,那么这个引用类型必须也是可序列化的,否则拥有该类性的Field 的类也不能序列化。

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

import org.junit.Test;

public class IOTest2 {
	@Test
	public void test() throws IOException{
		//指定输出目标文件,创建输出流
		OutputStream out = new FileOutputStream("person.txt");
		//创建对象输出流
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
		//创建要输出对象
		Object object = new Person("Tom",24);
		//调用对象输出流的writeObject(Object obj)方法,输出序列化对象
		objectOutputStream.writeObject(object);
		//关闭流
		out.close();
		objectOutputStream.close();
	}
	@Test
	public void test2() throws IOException, ClassNotFoundException{
		//指定序列化对象在硬盘上的存储文件,创建输入流
		InputStream in = new FileInputStream("person.txt");
		//创建对象输入流
		ObjectInputStream objectInputStream =  new ObjectInputStream(in);
		//调用对象输入流的readObject()方法,读入对象(反序列化操作)
		Object obj = objectInputStream.readObject();
		//显式读入的对象
		System.out.println(obj);
		//关闭流
		in.close();
		objectInputStream.close();
	}
}

创建Personl类,实现Serializable接口

package test;

import java.io.Serializable;

public class Person implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Person(){}
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		
		return "Person=[name =" +name +", age ="+ age +" ]";
	}
	
}


-------------------------------------------------------------------------------------------------------------------

RandomAccessFile类

 -- RndomAccessFile类既可以读取文件内容,也可以向文件输出数据

 -- RandomAccessFile类支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读写文件

            --支持只访问文件的部分内容

            --可以向已经存在的文件后追加内容

 --RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile类可以自由的移动记录指针:

            -- long getFilePoint() :获取文件记录指针的当前位置

            -- void seek(long pos) :将文件记录指针定位到pos位置

 -- 创建RandomAccessFile类可以指定一个mode参数,该参数指定R俺都没AccessFile的访问模式:

           -- r :以只读方式打开

           -- rw :以读写方式打开

 下面举例说明RandomAccessFile类的使用:


demo.txt 内容:

1234567890
java
hello world
abcdefghijklmnop

代码:

package test;

import java.io.IOException;
import java.io.RandomAccessFile;

import org.junit.Test;

public class IOTest3 {
	/*
	 * 在demo.txt文件中的第二行写入数据:"I lOVE YOU",不能覆盖原有数据
	 */
	@Test
	public void test1() throws IOException{
		//创建RandomAccessFile对象
		RandomAccessFile random = new RandomAccessFile("demo.txt", "rw");
		//先读取一行
		String line = random.readLine();
		//将剩余内容读入byte数组中
		byte[] buffer = new byte[(int) (random.length()-line.length())];
		random.read(buffer);
		//将指针移回第一行结束位置
		random.seek(line.length());
		//写入数据
		random.writeBytes("\nI LOVE YOU\n");
		//将buffer中缓存的数据写入
		random.write(buffer);
		//关闭流
		random.close();
	}
	
	
	
} 

运行完之后的demo.txt内容:

1234567890
I LOVE YOU
java
hello world
abcdefghijklmnop



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值