DataInputStream类和RandomAccessFile类的使用方法
- // DataInputStream类实现了DataInput接口,要想从文件中读入二进制数据,
- // 你需要将DataInputStream与某个字节源相结合,例如FileInputStream
- // 与此同时,要想写出二进制数据,可以使用实现了DataOutput接口的DataOutputStream类
- // RandomAccessFile类同时实现了DataInput和DataOutput接口。
- // 以下程序将三条记录写到一个数据文件中,然后以逆序将它们从文件中读回。
- // 为了高效地执行,这里需要使用随机访问,因为我们需要首先读入第三条记录
- // 让我们来计算每条记录的大小:我们将使用40个字符来 表示姓名字符串,因此每条记录包含100个字节:
- // 40字符 = 80字节,用于姓名
- // 1 double = 8字节,用于薪水
- // 3 int = 12字节,用于日期
- package com.example.io;
- import java.io.DataInput;
- import java.io.DataOutput;
- import java.io.DataOutputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.RandomAccessFile;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.GregorianCalendar;
- public class RandomFileTest {
- public static void main(String[] args) {
- Employee[] staff = new Employee[3];
- staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15);
- staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
- staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15);
- try {
- // 保存所有雇员记录到文件当中
- DataOutputStream out = new DataOutputStream(new FileOutputStream("employee.dat"));
- for (Employee e : staff) {
- e.writeData(out);
- }
- out.close();
- // 读取所有记录到新数组中
- RandomAccessFile in = new RandomAccessFile("employee.dat", "r");
- // 计算数组的尺寸
- int n = (int) (in.length() / Employee.RECORD_SIZE);
- Employee[] newStaff = new Employee[n];
- //反序读入雇员记录
- for (int i = n - 1, j = 0; i >= 0; i--) {
- newStaff[j] = new Employee();
- in.seek(i * Employee.RECORD_SIZE);
- newStaff[j].readData(in);
- j++;
- }
- in.close();
- // 打印新读入数组记录内容
- for (Employee e : newStaff) {
- System.out.println(e);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- class Employee {
- public Employee() {
- }
- public Employee(String n, double s, int year, int month, int day) {
- name = n;
- salary = s;
- GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
- hireDay = calendar.getTime();
- }
- public String getName() {
- return name;
- }
- public double getSalary() {
- return salary;
- }
- public Date getHireDay() {
- return hireDay;
- }
- public void raiseSalary(double byPercent) {
- double raise = salary * byPercent / 100;
- salary += raise;
- }
- @Override
- public String toString() {
- return "Employee{" + "name=" + name + ", salary=" + salary + ", hireDay=" + hireDay + '}';
- }
- public void writeData(DataOutput out) throws IOException {
- DataIO.writeFixedString(name, NAME_SIZE, out);
- out.writeDouble(salary);
- GregorianCalendar calendar = new GregorianCalendar();
- calendar.setTime(hireDay);
- out.writeInt(calendar.get(Calendar.YEAR));
- out.writeInt(calendar.get(Calendar.MONTH) + 1);
- out.writeInt(calendar.get(Calendar.DAY_OF_MONTH));
- }
- public void readData(DataInput in) throws IOException {
- name = DataIO.readFixedString(NAME_SIZE, in);
- salary = in.readDouble();
- int y = in.readInt();
- int m = in.readInt();
- int d = in.readInt();
- GregorianCalendar calendar = new GregorianCalendar(y, m - 1, d);
- hireDay = calendar.getTime();
- }
- public static final int NAME_SIZE = 40;
- public static final int RECORD_SIZE = 2 * NAME_SIZE + 8 + 4 + 4 + 4;
- private String name;
- private double salary;
- private Date hireDay;
- }
- class DataIO {
- public static String readFixedString(int size, DataInput in) throws IOException {
- StringBuilder b = new StringBuilder(size);
- int i = 0;
- boolean more = true;
- while (more && i < size) {
- char ch = in.readChar();
- i++;
- if (ch == 0) {
- more = false;
- } else {
- b.append(ch);
- }
- }
- in.skipBytes(2 * (size - i));
- return b.toString();
- }
- public static void writeFixedString(String s, int size, DataOutput out) throws IOException {
- for (int i = 0; i < size; i++) {
- char ch = 0;
- if (i < s.length()) {
- ch = s.charAt(i);
- }
- out.writeChar(ch);
- }
- }
- }
DataInputStream类和RandomAccessFile类的使用方法的更多相关文章
- [Java IO]01_File类和RandomAccessFile类
File类 File类是java.io包中唯一对文件本身进行操作的类.它可以进行创建.删除文件等操作. File类常用操作 (1)创建文件 可以使用 createNewFille() 创建一个新文 ...
- File类和RandomAccessFile类
目录 File类 File类常用操作 (1)创建文件 (2)删除文件 (3)创建文件夹 (4)列出指定目录全部文件 (5)删除目录 RandomAcce ...
- 通过扩展RandomAccessFile类使之具备Buffer改善I/O性能--转载
主体: 目前最流行的J2SDK版本是1.3系列.使用该版本的开发人员需文件随机存取,就得使用RandomAccessFile类.其I/O性能较之其它常用开发语言的同类性能差距甚远,严重影响程序的运行效 ...
- Java基础(二十八)Java IO(5)RandomAccessFile类与过滤器流(Filter Stream)
一.RandomAccessFile类 使用RandomAccessFile类可以读取任意位置数据的文件. 1.构造方法 RandomAccessFile(String name, String mo ...
- 在对文件进行随机读写,RandomAccessFile类,如何提高其效率
花1K内存实现高效I/O的RandomAccessFile类 JAVA的文件随机存取类(RandomAccessFile)的I/O效率较低.通过分析其中原因,提出解决方案.逐步展示如何创建具备缓存读写 ...
- RandomAccessFile类
File类只是针对文件本身进行操作,而如果要对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机地读取一个文件中指定位置的数据. //============ ...
- 使用RandomAccessFile类对文件进行读写
1. RandomAccessFile类简介 前面一篇随笔<File类遍历目录及文件>中有说到,File类只能用于表示文件或目录的名称.大小等信息,而不能用于文件内容的访问.而当需要访 ...
- 【Java IO流】RandomAccessFile类的使用
RandomAccessFile类的使用 RandomAccessFile类是java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. RandomAc ...
- 输入和输出--RandomAccessFile类
RandomAccessFile 类 RandomAccessFile 类既可以读取文件内容,也可以向文件输出数据. RandomAccessFile 类支持 "随机访问" 的方式 ...
随机推荐
- How to configure windows machine to allow file sharing with dns alias (CNAME)
Source: http://serverfault.com/questions/23823/how-to-configure-windows-machine-to-allow-file-sharin ...
- Asp.Net Web API 2第十四课——Content Negotiation(内容协商)
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...
- 【点滴javascript】变量与作用域
基本类型与引用类型 ECMAScript的的变量有两种类型: 基本类型(值类型):简单数据段 引用类型:多个值构成的对象 在变量赋值结束后,解析器必须知道这个变量时基本数据类型还是引用类型,需要注意的 ...
- jQuery的XX如何实现?——4.类型检查
往期回顾: jQuery的XX如何实现?——1.框架 jQuery的XX如何实现?——2.show与链式调用 jQuery的XX如何实现?——3.data与cache机制 -------------- ...
- django with mysql (part-3)
step01: write second view-function vim views.py step02: configure your ( urls.py ) vim urls.py step0 ...
- 02_Hello World!
hello word ? 学习任何语言,我们都喜欢在屏幕上直接输出一点什么,作为最简单基本的案例.很多人习惯输出 hello world ,世界你好.感觉很有情况的样子——然而很多人都只停留在这个阶段 ...
- paip.性能跟踪profile原理与架构与本质-- python扫带java php
paip.性能跟踪profile原理与架构与本质-- python扫带java php ##背景 弄个个输入法音标转换atiEnPH工具,老是python性能不的上K,7k记录浏览过k要30分钟了. ...
- APP顶号逻辑
登录的接口login.do接口上需要记录关键的信息:userId.设备型号(Android|iPhone).登录时间.登录IP.设备唯一标识(UUID) 当在另外一台新设备上登录同一帐号时,将user ...
- iOS 9 failed for URL: "XXX://@" - error: "This app is not allowed to query for scheme XXX" iOS 从APP里启动另一APP
iOS 从C APP里启动 D APP 首先在D APP里设置 URL Schemes 在info.plist 文件里添加URL Schemes URL Types -->item0 --> ...
- 2016年 最火的 15 款 HTML5 游戏引擎
HTML5游戏从2014年Egret引擎开发的神经猫引爆朋友圈之后,就开始一发不可收拾,今年<传奇世界>更是突破流水2000万!从两年多的发展来看,游戏开发变得越来越复杂,需要制作各种炫丽 ...