之前了解过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; } }
分析:上述代码是直接读取的对象;
相关推荐
/** * 一、BufferedReader类 public class ...//将读取到的字符存到数组中。返回读取的字符数。 * * 三、FileWriter(少量文字) 和 BufferedWriter(大量文字)实现简单文件写操作 * @author hulk */
读取student.txt文件内容,每行作为一条数据,创建对应Student对象。 1、计算各班平均成绩,输出其信息到控制台; 2、求出年纪总分最高和各班总分最高的同学,输出其信息到控制台; 3、按科目分别创建3个单科成绩表...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
3.使用EasyExcel.write创建ExcelWriter对象,并指定文件名和Java对象类型。 4.使用sheet方法指定test名称。 5.调用ExcelUtil.easyExcelTest方法将数据写入Excel文件。 在实际项目中,你可以根据需要进一步定制Excel...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
这个代码实现了一个简单的文件传输服务器,可以接收客户端的连接请求并将指定的文件发送给客户端。主要使用了Java的网络编程和文件操作技术。 首先定义了一个FileTransferServer类,在main方法中创建了一个...
3.编写应用程序,在指定目录下创建一个文件随机读写流,在第11题的文件1.dat的后面写入逻辑值true、写入字符’a’、 写入字符串“程序设计”,然后读取文件中写入这些数据并在屏幕上输出。 4.编写应用程序,把某个...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...
java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
序列化和反序列化对象(将不长用的对象暂时持久化到文件中为对象的序列化,反之用时再把对象恢复到内存为反序列化); 控制对象的序列化和反序列化; 读jar包的资源文件;用zip格式压缩 和解压文件;操作Excel文件;...
//在指定的文件夹中创建文件 dir.createNewFile(); } catch (Exception e) { } } } //向已创建的文件中写入数据 public void print(String str) { FileWriter fw = null; ...