`
Luob.
  • 浏览: 1590227 次
  • 来自: 上海
社区版块
存档分类
最新评论

java之 21天 随机读取文件,管道流,序列化

    博客分类:
  • Java
阅读更多
对象持久化 ,序列化, 串行化

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 对象持久化 ,序列化, 串行化
 * 直接操作对象的流 
 * ObjectOutputStream
 * ObjectInputStream
 *
 * Serializable:没有方法的接口 :通常 称为 标记接口 , 序列化只能 序列化 堆里面的对象属性
 * 
 *  注意:
 *  1)静态成员:  不能被序列化,因为 静态在方法区里面 ,不再 堆里面, 
 *  2)transient: 修饰静态成员, 使它不被序列化 
 * 
 */
public class ObjectStreamDemo {

	public static void main(String[] args) throws Exception {
		//method();
		//readObj();
		writeObj();
		readObj();  //斯蒂芬::59::cn  发现  country 属性没有被序列化进去
	}
	public static void writeObj() throws IOException{
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("E:\\person.object"));
		oos.writeObject(new Person("斯蒂芬",59,"kr"));
		oos.close();
	}
	//序列化
	public static void method() throws IOException{
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("E:\\person.object"));
		oos.writeObject(new Person("lisi",39));
		oos.close();
	}
	
	//反序列化
	public static void readObj() throws IOException, ClassNotFoundException{
		ObjectInputStream ois= new ObjectInputStream(new FileInputStream("E:\\person.object"));
		Person p=(Person)ois.readObject();
		System.out.println(p);
		ois.close();
	}

}

//要序列化的类  都必须 实现这个接口 
class Person implements Serializable{
	//必须 生成一个 UID 否则会有序列化后,再反序列 就会有问题.
	private static final long serialVersionUID = 7457608434653264123L;
	
	private String name;  //
	
	transient private int age;  //如果想要非静态成员也不序列化 就使用个 transient 修饰, 但是保证 堆中有
	
	static String country="cn";   //静态 成员不能被序列化 
	Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	Person(String name,int age,String country){
		this.name=name;
		this.age=age;
		this.country=country;
	}
	
	
	public String toString(){
		return name+"::"+age+"::"+country;
	}
}



管道流

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
 * 管道流
 * PipedInputStream  管道读取流
 * PipedOutputStream  管道写入流
 *  
 * 联合两者的关系
 * 1)通过构造函数 :PipedInputStream(PipedOutputStream src) 
 * 2)使用方法:  void connect(PipedOutputStream src)  进行连接
 * 
 * 
 * 总结 ::
 * 集合中涉及到 IO流的 是properties
 * IO中涉及到多线程的就是  管道流 
 *  
 */
public class PipedStreamDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			PipedInputStream pin=new PipedInputStream();
			PipedOutputStream pon=new PipedOutputStream();
			pin.connect(pon);
			
			ReadPiped rp=new ReadPiped(pin);
			WritePiped wp=new WritePiped(pon);
			new Thread(rp).start();
			new Thread(wp).start();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

//读取管道流
class ReadPiped implements Runnable{
	private PipedInputStream in;
	ReadPiped(PipedInputStream in){
		this.in=in;
	}
	
	public void run(){
		try {
			System.out.println("读取前没有数据就阻塞....");
			byte[] buf=new byte[1024];
			int len=in.read(buf);
			System.out.println("读到数据阻塞结束");
			
			String s=new String(buf,0,len);
			System.err.println(s);
			in.close();
		} catch (IOException e) {
			throw new RuntimeException("管道读取流失败!");
		}
	}
}

//写入管道流
class WritePiped implements Runnable{
	private PipedOutputStream out;
	WritePiped(PipedOutputStream out){
		this.out=out;
	}
	public void run(){
		try{
			System.out.println("6秒后开始写入数据...");
			Thread.sleep(6000l);
			out.write("Piped lai la".getBytes());
			out.close();
		}catch(IOException e){
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}



随机访问文件的类

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

/**
 * RandomAccessFile: 随机访问文件的类
 * 特点:
 *   1)该类 不算IO体系中的子类 ,而是 直接继承 Object 
 *   2)但,是IO包中的成员
 *   3)同时具备 读和写的功能.
 *   4)内部封装了一个数组,而且通过指针对数组的元素进行操作.
 *   5)可以通过 getFilePointer获取指针的位置
 *   6)可以通过seek改变指针的位置
 *   
 *   
 *   seek(long pos) :  跳到指定的索引位置上
 *   skipBytes(int n): 跳过指定的 字节数
 *   
 *   其实能够完成 读写的原因,就是内部封装了字节输入流和输出流.
 *   
 *   通过构造函数 可以看出 ,该类只能操作 文件.mod 只能 4中值
 *   r:读
 *   rw:读写
 *   而且该对象构造函数要操作的文件不存在,会自动创建, 如果存在会覆盖 .
 *   
 *   如果模式为r:只读,不会创建文件,会去读取一个已经存在的文件,如果文件不存在,则会出现异常.
 *   如果模式为rw: 操作的文件不存在,会自动创建,如果存在 则不会覆盖文件,但是会替换对应位置上的文件
 *   
 *   多线程 下载和写入
 *   可以实现,文件的分段写入 ,和下载
 */
public class RandomAccessFileDemo {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		System.out.println("不存在就创建,然后写,存在就会覆盖,");
		 //writeFile();
		//System.out.println(Integer.toBinaryString(258));  // 100000010--00000010(write 只将最低8位 写入流中)
		
		System.out.println("跳过指定的字节后再读");
		//readFile();
		System.out.println("跳过指定的字节后再写");
		writeFile_2();
	}
	public static void writeFile_2() throws IOException{
		RandomAccessFile raf=new RandomAccessFile("E:\\ran.txt","rw");
		
		//第三个 不知道 写什么 但是第四个知道写什么
		//raf.seek(8*3);
		raf.write("周期".getBytes());
		raf.writeInt(444);
		
		raf.close();
		
	}
	
	
	public static void readFile() throws IOException{
		RandomAccessFile raf=new RandomAccessFile("E:\\ran.txt","r");
		//raf.write("haha".getBytes());  //java.io.IOException: 拒绝访问。
		
		byte[] buf=new byte[4];
		
		//调整指针,  如果是有序 就这样就可以了
		//raf.seek(8*1); //跳到指定的索引,  取到的就是 王武了,否则 从头开始取  李四
		raf.skipBytes(8); //跳过指定的字节数 只能 往下跳, 不会回跳
		
		raf.read(buf);
		String name=new String(buf);
		int age=raf.readInt();  //自动读取 4个字节转换成 int
		System.out.println("name:"+name+"----age:"+age);
		
		
		raf.close();
		
	}
	public static void writeFile() throws IOException{
		
		RandomAccessFile raf=new RandomAccessFile("E:\\ran.txt","rw");
		raf.write("GGG".getBytes());
		//raf.write(97);  //存入后 变成 a 因为 是 97 对应的码表是 a
		raf.writeInt(97);  //存入后 变成 a 因为 是 97 对应的码表是 a
		//raf.writeInt(258); // 前面有三空格 ,3个字节是空的 写出了4个字节 
		raf.write("KKK".getBytes());
		raf.writeInt(99); // 
		raf.close();
	}

}

0
6
分享到:
评论

相关推荐

    文件流序列化

    4. **反序列化**:读取文件流中的数据以恢复对象状态。 ```delphi var BinaryReader: TBinaryReader; begin BinaryReader := TBinaryReader.Create(FileStream); try // 使用BinaryReader读取数据 finally ...

    java读取文件方法大全

    根据给定的文件信息,我们可以总结出一系列关于Java中读取文件的方法,这些方法涵盖了不同层次的数据读取,包括字节、字符以及行级别的读取。以下是对这些知识点的详细阐述: ### Java读取文件方法大全:读取File流...

    java 按顺序读取文件

    总结起来,Java中按顺序读取文件主要依赖于I/O流,特别是`FileReader`和`BufferedReader`类的组合。理解这些基本概念和操作对于任何Java开发者来说都是至关重要的,因为它们构成了处理文件数据的基础。在实际编程中...

    java 读取文件 文件读取操作

    本文将详细介绍Java中四种不同的文件读取方法:按字节读取、按字符读取、按行读取以及随机读取。 1. **按字节读取文件内容** Java中`java.io.FileInputStream`类提供了按字节读取文件的功能。这种方法适用于读取二...

    JAVA读取随机文件

    在Java编程中,读取随机文件是一项常见的任务,特别是在处理大型数据文件时。要实现这一功能,我们需要了解Java中的I/O流(输入/输出流)和文件操作的相关知识。这里我们将详细探讨如何在Java中读取随机文件。 首先...

    Java保存与读取文件.rar

    Java保存与读取文件代码示例,super("存储与读取对象"); //调用父类构造函数  Container container=getContentPane(); //得到容器  Icon imageIcon=new ImageIcon("image.gif"); //实例化一个图标  ...

    C#对象序列化反序列化保存与读取和对象直接保存与读取

    同样,它也可以从文件读取字节流并反序列化为原来的对象。直接保存和读取简单,但不适用于跨平台环境,且不易于人类阅读。 ```csharp using System.IO; using System.Runtime.Serialization.Formatters.Binary; ...

    java打开一个随机访问文件流,随机读取文件内容

    java随机读取文件内容,打开一个随机访问文件流,按只读方式,将读文件的开始位置移到beginIndex位置。一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。

    java基础--文件流管道.docx

    在Java NIO(New IO)框架下,文件流管道(Pipe)是一种用于在两个线程之间传递数据的机制,它允许一个线程写入数据,而另一个线程读取这些数据。文件通道(FileChannel)是与文件交互的主要接口,它提供了管道传输...

    Java序列化

    - 使用 `java.io.ObjectInputStream` 类的 `readObject()` 方法从输入流读取对象,实现反序列化。 4. **序列化版本标识符** - `serialVersionUID` 是一个特殊的字段,用于验证序列化版本的一致性。如果类的序列化...

    JAVA对象序列化保存为XML文件的工具类

    【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...

    java序列化存储读取文件.doc

    根据提供的文件标题、描述以及部分代码内容,我们可以总结出该文档主要关注的是Java中的序列化技术,特别是如何利用序列化来存储和读取文件。接下来,我们将深入探讨这些知识点。 ### Java序列化简介 Java序列化是...

    java随机读取一行文本

    java随机读取一行文本,避免了网上其他版本乱码的烦恼~!

    java序列化全解

    Java序列化是Java平台中的一种核心机制,它允许对象的状态被转换成字节流,以便存储到磁盘、数据库,或者在网络中进行传输。这对于实现持久化、远程方法调用(RMI)以及Enterprise JavaBeans(EJB)等高级功能至关...

    Java实现序列化例子

    Java序列化是Java平台提供的一种将对象转换为字节流,以便存储到磁盘、数据库或网络中的机制。它是Java语言内置的一种特性,主要用于持久化数据,也可以在进程间传递对象,或者在网络上传输对象。在Java中,如果一个...

    java中的序列化与反序列化

    这段代码会从`temp.out`文件中读取序列化的字节流,并恢复为`TestSerial`对象,然后打印出对象的`version`属性。 序列化的过程涉及到一系列复杂的内部机制,包括对象头、字段数据和引用的处理。序列化的字节流通常...

    java读取txt文件内容(java快速读取,程序已调试通)

    java读取txt文件,可以以文件路径构造这个流,:FileInputStream fin = new FileInputStream("d:/test.txt"); 然后使用这个流直接读取到文件,再使用reader构造BufferedReader,按行读取一整行的文本,作为字符串返回...

    Java读取大文件的处理

    Java读取大文件的处理 Java读取大文件的处理是Java编程中的一项重要技术,特别是在处理大文件时需要注意性能和响应速度。下面我们将对Java读取大文件的处理技术进行详细的介绍。 标题解释 Java读取大文件的处理是...

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    java读取excel之xlsl超大文件

    标题"java读取excel之xlsl超大文件"所涉及的核心知识点是优化大量数据的读取策略。在Java中,可以使用Apache POI的SXSSF API(Streaming Usermodel API)来实现这种优化。与常规的XSSF API不同,SXSSF允许我们以流的...

Global site tag (gtag.js) - Google Analytics