Java读写二进制数据
import java.io.*; import java.time.LocalDate; public class Test { public static void main(String[] args){ RandomAccessTest.test(); } } /* 2.3 读写二进制数据 */ /* 2.3.2 随机访问文件 写了大半天,突然发现这个实验好像不是太严谨: 1.RandomAccessFile算长度时,应该是根据字节数算出来的 2.写字符串时,我们只是指定了码元数量,我们写的是固定码元数量的字符串 3.这样的化,我们记录的Employee.RECORD_SIZE根本就代表不了一条记录的长度 4.但是我们最后又通过RandomAccessFile的长度和Employee.RECORD_SIZE来计算记录数量 5.我觉得这个实验有问题,以后研究吧 */ class Employee { private String name; private double salary; private LocalDate hireDay; public static final int NAME_SIZE = 30; public static final int RECORD_SIZE = 50; public Employee(String name, double salary, LocalDate hireDay) { this.name = name; this.salary = salary; this.hireDay = hireDay; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public LocalDate getHireDay() { return hireDay; } public void setHireDay(LocalDate hireDay) { this.hireDay = hireDay; } @Override public String toString() { return "Employee{" + "name='" + name + '\'' + ", salary=" + salary + ", hireDay=" + hireDay + '}'; } } class DataIO { //Java核心技术 卷二 第十版 2.3.2节 //写出从字符串开头开始的指定数量的码元,如果码元过少,该方法会用‘0’来补齐字符串 public static void writeFixedString(String s, int size, DataOutput output) throws IOException { for (int i = 0; i < size; i++) { char ch =0; if(i<s.length()) ch = s.charAt(i); output.write(ch); } } //Java核心技术 卷二 第十版 2.3.2节 //从输入流中读入字符,直至读入size个码元,或者直至遇到具有0值的字符串,然后跳出输入字段中剩余的0值。 public static String readFixedString1(int size, DataInput in) throws IOException { StringBuilder sb = new StringBuilder(); for (int i = 0; i < size; i++) { char c; if ((c = in.readChar()) != 0) { sb.append(c); } } return sb.toString(); } //功能和上一个方法是一样的,但是这个效率会高那么一点点 public static String readFixedString2(int size, DataInput in) throws IOException { StringBuilder sb = new StringBuilder(); /* int i; for (i = 0; i < size; i++) { char c; if ((c = in.readChar()) == 0) { break; } sb.append(c); } in.skipBytes(2*(size-i)); //这个地方不是太严谨 */ //用书中代码测试一下 int i =0; boolean more = true; while (more && i < size) { char ch = in.readChar(); i++; if (ch == 0) { more = false; } else { sb.append(ch); } } in.skipBytes(2 * (size - i)); return sb.toString(); } } class RandomAccessTest { public static void test() { Employee[] staff = new Employee[]{ new Employee("A", 10, LocalDate.now()), new Employee("B", 20, LocalDate.now()), new Employee("C", 30, LocalDate.now()) }; //写入 try(DataOutputStream out = new DataOutputStream(new FileOutputStream("employee1.dat"))) { for (Employee e : staff) { writeData(out, e); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //读取 try(RandomAccessFile in = new RandomAccessFile("employee1.dat","r")) { int n = (int) (in.length() / Employee.RECORD_SIZE); Employee[] newStaff = new Employee[n]; for (int i = n - 1; i >= 0; i--) { in.seek(i*Employee.RECORD_SIZE); newStaff[i] = readDate(in); } for (Employee e : newStaff) { System.out.println(e); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private static void writeData(DataOutput out, Employee employee) throws IOException { DataIO.writeFixedString(employee.getName(), Employee.NAME_SIZE, out); out.writeDouble(employee.getSalary()); LocalDate hireDay = employee.getHireDay(); out.writeInt(hireDay.getYear()); out.writeInt(hireDay.getMonthValue()); out.writeInt(hireDay.getDayOfMonth()); } private static Employee readDate(DataInput input) throws IOException { String name = DataIO.readFixedString2(Employee.NAME_SIZE, input); double salary = input.readDouble(); int y= input.readInt(), m= input.readInt(), d= input.readInt(); return new Employee(name, salary, LocalDate.of(y, m, d)); } } /* 2.3.3 ZIP文档 ZipFile API: ZipFile(String name) ZipFile(File file) Enumeration entries() ZipEntry getEntry(String name) InputStream getInputStream(ZipEntry ze) String getName() 从这个类的API中可以看出来,还有一种使用Zip的方案。先通过ZipFile对象,得到 这个压缩包中的每一条记录,然后再指定某条具体的记录,得到其中的数据。 */
《Java核心技术卷二》笔记
Java读写二进制数据的更多相关文章
- IO流-文本IO\读写二进制数据
文本IO 一.简述 OutputStreamWriter类使用选定的编码方式吧Unicode字符流转换为字节流,InputStreamReader类将包含字节的输入流转为可以产生Unicode字符的读 ...
- 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据
[源码下载] 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 读写文本数 ...
- [Java] 读写字节数据,过滤流DataOutputStream和DataInputStream
package test.stream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io ...
- [Java] 读写字符串数据
package test.stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- Java/Android 二进制数据与String互转
将经过加密的二进制数据保存到本地的方法 byte[] src = new byte[] { 122,-69, -17, 92, -76, 52, -21, -87, -10, 105, 76, -75 ...
- SQLite入门(二)读写二进制数据
//读二进制数据的函数 BOOL OpenBinDataFile(BYTE **pBUf,UINT &len) { if (pBUf == NULL) { re ...
- java读写串口数据
本博文参考自https://www.cnblogs.com/Dreamer-1/p/5523046.html 最近接触到了串口及其读写,在此记录java进行串口读写的过程. 1.导入串口支持包 需要下 ...
- java:判断二进制数据中第n位是否为1
可以使用位运算来判断. &是位的与运算符,是指二进制数按位“与”的操作, 逻辑与就是两者都为真的时候才为真,其他真假,假真,假假的运算结果都是假.二进制写法如下 1 & 1 = 1 , ...
- Qt里怎么处理二进制数据
Qt里有个专门的类QDataStream就是专门读写二进制数据的, 它与QByteArray搭配在网络编程中有奇效. 来个栗子: // write data QByteArray data; QDat ...
随机推荐
- Win10《芒果TV》更新v3.8.40青春版:优化推送策略、新增缓存清理
芒果TV暑期重磅活动-青春芒果节拉开帷幕,炫酷的3D视觉大秀.王牌IP互动体验馆.众星云集的青春炙燥夜晚会.神秘的芒果吉祥物发布,Win10版<芒果TV>全平台同步更新青春版v3.8.40 ...
- WPF判断两个PNG图片是否碰撞
这个方法有几个前提 1.两个Image必须在一个Canvas中 2.两个Image的Canvas.Top和Canvas.Left必须赋值 上一篇讲了判断一个PNG图片某个点是否透明 这个基本类似的方法 ...
- C++/CLI 中使用 ref 和 out
void fun(int^ % i){} // C# ref void fun([out]int^ % i) {} // C# out
- SQL Server 将某一列的值拼接成字符串
名称 海鲜水产 水果蔬菜 海参 肉禽蛋 牛排 腊味 生鲜食品 将以上一列变成: 生鲜食品,海鲜水产,水果蔬菜,海参,牛排,肉禽蛋,腊味 sql for xml path('')
- Vista之前的版本,默认本地登陆用户都以管理员权限启动程序
Vista之前的版本,默认本地登陆用户都以管理员权限启动程序,之后的OS版本默认都没有管理员权限,需要用户提权才能做某些操作,否则需要管理员权限的操作都会失败MSSQL是用户名账号连接,Socket方 ...
- 【Linux】Linux 环境下splite以及一些正则使用
由于在windows下,遍历目录,想查找满足条件的文件: dir /s > ..\fileresult.txt 结果得到的文件过大,999多MB的txt: split -b 10k date.f ...
- spring3升级到spring4通用异常处理返回jsonp多了/**/的解决办法
问题描述 在spring3中定义了通用的异常处理,具体代码如下: public class CommonExceptionHandler implements HandlerExceptionReso ...
- 解释为什么.net 第一次请求比较慢
通过这个图可以很好的解释为什么第一次请求比较慢,为了提高访问速度,也便有了预编译. 关于ASP.NET网站:每个页面都编译成一个.dll文件 用Assembly.GetExecutingAssembl ...
- ios开发系列之内存泄漏分析(下)
接上篇,本篇主要讲解通知和 KVO 不移除观察者.block 循环引用 .NSThread 和 RunLoop一起使用造成的内存泄漏. 1.通知造成的内存泄漏 1.1.ios9 以后,一般的通知,都不 ...
- python三大主流web框架之Django安装、项目搭建
这一篇我们将迎来python强大的web框架Django,相信大家都已经不陌生,本篇将介绍Django的安装及基础项目搭建,大神略过~ Django是需要我们手动pip安装的,首先我们来安装Djang ...