`
百合不是茶
  • 浏览: 354817 次
社区版块
存档分类
最新评论

将JAVA对象写到指定创建的文件中并读取出来

阅读更多

之前了解过java中的字符流和字节流来保存数据,但是使用字节流和字符流是不能保存对象的,java是面向对象语言 一切问题都当成是对象,保存一个对象我们可以使用数据流和对象流;

 

数据输入流:DataInputStream

 

对象输出流:ObjectInputStream

 

下面有一个类,保存其中的对象的方法如下:

 

 

public class Student {

	String name;// 名字
	byte age;// 年龄
	float score;// 分数
	int num;// 学号
	String desc;// 个人简介

	public Student(String name, byte age, float score, int num, String desc) {
		this.name = name;
		this.age = age;
		this.score = score;
		this.num = num;
		this.desc = desc;
	}

}

 在使用对象数据流时,需要注意的是对字符串的处理(将字符串转化为字节来处理,在对象流中不需要),先获得字符串的长度-->根据长度创建字节数组-->写字节数组的长度-->写字符

//使用数据流来操作
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * 学生操作类
 * 
 * @author
 * 
 */
public class StudentDB {

	public static void main(String args[]) {
		File file = new File("F:\\abc\\student.db");

		// 字节数4+1+4+4+6
		Student stu = new Student("张三", (byte) 20, 95.5F, 20120101, "youxiu");

		saveStudent(file, stu);
		System.out.println("保存成功!");
		
		//创建一个读取对象的方法,在此接受并打印出来
		Student stu2 = getStudent(file);

		System.out.println(stu2.name);
		System.out.println(stu2.age);
		System.out.println(stu2.score);
		System.out.println(stu2.num);
		System.out.println(stu2.desc);
		
		

	}

	/**
	 * 将学生对象保存到指定的文件
	 * 
	 * @param file
	 *            保存学生的文件
	 * @param stu
	 *            要保存的学生对象
	 */
	public static void saveStudent(File file, Student stu) {
		try {
			// 建立文件输出流
			FileOutputStream fos = new FileOutputStream(file);
			// 将输出流包装成基本数据类型输出流
			DataOutputStream dos = new DataOutputStream(fos);

			// 操作字符串的时候,还是采用字节来操作
			// //获得名字的字节数组
			byte[] names = stu.name.getBytes();
			// 写名字字符串的字节长度
			dos.writeInt(names.length);
			// 写名字
			dos.write(names);

			// 写年龄
			dos.writeByte(stu.age);
			// 写分数
			dos.writeFloat(stu.score);
			// 学号
			dos.writeInt(stu.num);
			// 简介
			byte[] descs = stu.desc.getBytes();
			dos.writeInt(descs.length);
			dos.write(descs);

			// 强制输出
			dos.flush();
			// 关闭流
			fos.close();

		} catch (Exception ef) {
			ef.printStackTrace();
		}

	}

	/**
	 * 从文件中获取学生对象
	 * 
	 * @param file
	 *            要获取对象的文件
	 * @return 返回获得的学生对象
	 */
	public static Student getStudent(File file) {
		try {
			// 建立文件输入流
			FileInputStream fis = new FileInputStream(file);
			// 包装成基本数据类型流
			DataInputStream dis = new DataInputStream(fis);

			// 读取名字的长度
			int len = dis.readInt();
			// 定义字节数组
			byte[] names = new byte[len];
			// 从流中读取字节填满数组
			dis.read(names);
			// 将字节数组转成字符串
			String name = new String(names);

			// 读取年龄
			byte age = dis.readByte();
			float score = dis.readFloat();
			int num = dis.readInt();

			// 简介
			int len2 = dis.readInt();
			byte[] descs = new byte[len2];
			dis.read(descs);
			String desc = new String(descs);

			// 根据属性的值创建学生对象
			Student stu = new Student(name, age, score, num, desc);
			return stu;
		} catch (Exception ef) {
			ef.printStackTrace();
		}
		return null;
	}

}

 

分析:数据流保存对象的难点在于对字符串的操作;上述的例子中:姓名和个人简介 是字符;串读取字符串的步骤:

先获取字符串长度-->根据获取长度创建字节数组--》从流中读取字节到数组中--》将字节组装换成字符串

将读到的字符串写出去的步骤:先获取数组中读到的字符串的字节数组-->将读取字节数组的长度写出去--》将字符串写出去;

 

 

//使用对象流来保存对象
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 学生操作类
 * 
 * @author
 * 
 */
public class StudentDB {

	public static void main(String args[]) {
		File file = new File("F:\\abc\\student.db");

		// 字节数4+1+4+4+6
		Student stu = new Student("张三", (byte) 20, 95.5F, 20120101, "youxiu");

		saveStudent(file, stu);
		System.out.println("保存成功!");
		
		//从文件中读取对象
		Student stu2 = getStudent(file);
		System.out.println(stu2.name);
		System.out.println(stu2.age);
		System.out.println(stu2.score);
		System.out.println(stu2.num);
		System.out.println(stu2.desc);
		
		

	}

	/**
	 * 将学生对象保存到指定的文件
	 * 
	 * @param file
	 *            保存学生的文件
	 * @param stu
	 *            要保存的学生对象
	 */
	public static void saveStudent(File file, Student stu) {
		try {
			// 建立文件输出流
			FileOutputStream fos = new FileOutputStream(file);
			// 将输出流包装成对象输出流
			ObjectOutputStream dos = new ObjectOutputStream(fos);

			
			// 写名字
			dos.writeObject(stu.name);

			// 写年龄
			dos.writeByte(stu.age);
			// 写分数
			dos.writeFloat(stu.score);
			// 学号
			dos.writeInt(stu.num);
			// 简介
			dos.writeObject(stu.desc);

			// 强制输出
			dos.flush();
			// 关闭流
			fos.close();

		} catch (Exception ef) {
			ef.printStackTrace();
		}

	}

	/**
	 * 从文件中获取学生对象
	 * 
	 * @param file
	 *            要获取对象的文件
	 * @return 返回获得的学生对象
	 */
	public static Student getStudent(File file) {
		try {
			// 建立文件输入流
			FileInputStream fis = new FileInputStream(file);
			// 包装成对象输入流
			ObjectInputStream dis = new ObjectInputStream(fis);

			
			// 读取名字
                         //对象中将字符串看做是一个Object来保存,使用向下转型
			String name = (String)dis.readObject();

			// 读取年龄
			byte age = dis.readByte();
			float score = dis.readFloat();
			int num = dis.readInt();

			// 简介
			String desc = (String)dis.readObject();

			// 根据属性的值创建学生对象
			Student stu = new Student(name, age, score, num, desc);
			return stu;
		} catch (Exception ef) {
			ef.printStackTrace();
		}
		return null;
	}

}

 分析:1,在使用对象流来保存对象,对字符串的保存时先将其强制转型为String String desc = (String)dis.readObject();   写字符串只用将object写出去就可以了writeObject();

  2,在读写的方法中都是将对象中的属性分别读取出来,不是整天的读取

 

 

//使用对象流来保存数据2

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 学生操作类
 * 
 * @author
 * 
 */
public class StudentDB2 {

	public static void main(String args[]) {
		File file = new File("F:\\abc\\student.db");

		// 字节数4+1+4+4+6
		Student stu = new Student("张三", (byte) 20, 95.5F, 20120101, "youxiu");

		saveStudent(file, stu);
		System.out.println("保存成功!");

		// 从文件中读取对象
		Student stu2 = getStudent(file);
		System.out.println(stu2.name);
		System.out.println(stu2.age);
		System.out.println(stu2.score);
		System.out.println(stu2.num);
		System.out.println(stu2.desc);

	}

	/**
	 * 将学生对象保存到指定的文件
	 * 
	 * @param file
	 *            保存学生的文件
	 * @param stu
	 *            要保存的学生对象
	 */
	public static void saveStudent(File file, Student stu) {
		try {
			// 建立文件输出流
			FileOutputStream fos = new FileOutputStream(file);
			// 将输出流包装成对象输出流
			ObjectOutputStream dos = new ObjectOutputStream(fos);

			//将对象写到输出流
			dos.writeObject(stu);

			// 强制输出
			dos.flush();
			// 关闭流
			fos.close();

		} catch (Exception ef) {
			ef.printStackTrace();
		}

	}

	/**
	 * 从文件中获取学生对象
	 * 
	 * @param file
	 *            要获取对象的文件
	 * @return 返回获得的学生对象
	 */
	public static Student getStudent(File file) {
		try {
			// 建立文件输入流
			FileInputStream fis = new FileInputStream(file);
			// 包装成对象输入流
			ObjectInputStream dis = new ObjectInputStream(fis);
			//读取对象
			Student stu = (Student) dis.readObject();
			return stu;
		} catch (Exception ef) {
			ef.printStackTrace();
		}
		return null;
	}

}

 

分析:上述代码是直接读取的对象;

 

 

 

 

分享到:
评论

相关推荐

    java中读取目录下指定的文件

    在Java编程语言中,读取目录下指定的文件是一项常见的任务,这主要涉及到文件I/O操作。Java提供了丰富的API来处理文件系统相关的操作,包括读取、创建、删除文件以及遍历目录等。这里我们将详细讲解如何在Java中实现...

    java 二进制文件的读写操作

    1. **创建File对象**:首先通过指定文件路径创建了一个`File`对象`fi`,这里指定了一个rmvb格式的视频文件。 2. **创建输入流**:接着使用`FileInputStream`创建了一个输入流`fis`,指向了前面创建的`File`对象。 3....

    java 读取Ftp指定位置的文件解析并入库

    标题 "java 读取Ftp指定位置的文件解析并入库" 涉及到的是使用Java编程语言通过FTP(File Transfer Protocol)协议从远程服务器上下载文件,然后对下载的文件进行解析,并将解析得到的数据存储到数据库中。...

    java读写properties文件,解决系统找不到指定路径,解决写入后读取正常,但文件数据未更新问题

    总结一下,处理Java中的Properties文件读写时,需要注意文件路径的准确性、文件的读写权限以及缓存问题。通过以上方法,应该能够有效解决描述中提到的问题。对于提供的"新建文本文档.txt",虽然不是Properties文件,...

    java 按顺序读取文件

    首先,Java提供了多种类来处理文件读取,如`FileReader`,`BufferedReader`等。`FileReader`主要用于读取字符流,而`BufferedReader`则通过缓冲区提高读取效率。在按顺序读取文件时,通常我们会先创建一个`...

    java 写文件 java 写文件 java 写文件 java 写文件

    以上就是关于Java写文件的基本知识,理解并熟练掌握这些概念和方法,将能有效地在Java程序中实现文件的写入操作。在实际应用中,根据具体需求选择合适的方法和策略,确保数据的正确存储和传输。

    Java实现从jar包中读取指定文件的方法

    在给定的代码示例中,`JarFileAccess`类展示了如何读取JAR文件中的指定文件并将其复制到目标目录。 1. **创建`JarFile`对象**: 使用`new JarFile()`构造函数创建`JarFile`对象,传入JAR文件的路径。这将打开JAR...

    详解Java无需解压直接读取Zip文件和文件内容

    Java无需解压直接读取Zip文件和文件内容是Java语言中的一种常见操作,通过使用java.util.zip包中的ZipFile、ZipInputStream和ZipEntry类,我们可以轻松地读取Zip文件和文件内容。下面,我们将详细介绍如何使用Java...

    在Java中读写Excel文件

    在Java中读写Excel文件是一项常见的任务,尤其是在数据处理、报表生成或数据分析等场景下。Apache POI是一个广泛使用的开源库,它允许开发者使用Java语言来处理Microsoft Office格式的文件,包括Excel(XLS和XLSX)...

    java下载文件到指定路径(不打开窗口)

    本文档主要介绍如何使用Java编程语言实现从网络上下载文件并将其保存至本地指定路径的功能,且在执行过程中不会弹出任何用户界面窗口。这种方法非常适合后台服务或自动化脚本场景。 #### 核心知识点详解 1. **URL...

    java读写xml文件

    2. **创建DocumentBuilder**:`DocumentBuilderFactory`用于创建`DocumentBuilder`实例,该实例负责加载XML文件并将其解析为`Document`对象。 3. **解析XML文件**:使用`DocumentBuilder`的`parse()`方法解析XML文件...

    java上传本地文件到oss指定目录

    在Java开发中,将本地文件上传到阿里云OSS(Object Storage Service)是常见的操作,尤其在处理大数据存储和分发时。阿里云OSS提供了一种高效、安全且经济的云端存储解决方案。本篇文章将详细讲解如何使用Java SDK...

    java文件读写操作

    在Java编程语言中,文件读写操作是程序与外部数据交互的基本能力。这篇学习笔记将带你初探这个领域,适合新手入门。我们将讨论如何使用Java进行文件的读取、写入以及一些常见的应用场景。 首先,Java提供了java.io...

    JAVA读取指定文件里面的指定内容

    本文将详细介绍如何使用Java读取指定文件内的特定内容,并深入解析代码中涉及的关键概念和技术要点。 #### 文件读取概述 在Java中,文件读取通常涉及到以下几个步骤: 1. **打开文件**:通过文件路径获取文件对象...

    java 删除某行和读写txt文件

    通常的做法是先将文件中的所有内容读取到内存中,然后根据需要过滤掉不需要的行,最后再将处理后的结果写回原文件或者新的文件中。下面我们将详细讲解这一过程。 #### 读取TXT文件 首先,我们需要创建一个`...

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

    另一方面,`objectXmlDecoder`方法打开XML文件,创建一个`XMLDecoder`实例,读取XML数据并将其转换回Java对象。这些对象被添加到一个`ArrayList`中并返回。注意,如果XML文件中包含多个序列化的对象,`XMLDecoder`将...

    java Apache poi 对word doc文件进行读写操作

    一旦创建了所需的结构,你可以将 `HWPFDocument` 写入到一个文件中,使用 `write(OutputStream)` 方法完成此操作。 在实际应用中,Apache POI 的功能不仅限于简单的读写操作,还支持复杂的格式转换、样式调整和模板...

    JAVA 文件读写操作

    // 创建一个文件读取器对象 FileReader fr = new FileReader("mydata.txt"); // 创建一个缓冲读取器对象 BufferedReader br = new BufferedReader(fr); String line; // 逐行读取文件内容 while ((line = br....

    Excel文件读写java代码

    提供的Java代码示例可能包含一个读取Excel文件的类,这个类通常会通过JXL库打开Excel文件,遍历每个工作表和单元格,读取其中的数据,并可能将其存储到内存中的数据结构(如数组、列表或自定义对象)中。 5. **写入...

Global site tag (gtag.js) - Google Analytics