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 ...
随机推荐
- WPF应用App.Config文件的保存路径
App.Config文件有更改后,自动会保存到以下路径: C:\Users\你的系统用户名\AppData\Local\你的应用名\
- painter半透明的 底层窗口全透明背景
- PRML Chapter4
超平面(hyperplane) 超平面:超平面是n维欧氏空间中余维度等于一的线性子空间,也就是说必须是(n-1)维度.这是平面中的直线.三维空间中平面的推广(n大于3才被称为"超" ...
- AspNetCore 小记
1. Microsoft.AspNetCore.Hosting.IHostingEnvironment 的接口获取的值: WebRootPath:D:\参考资料\C#\AspNetCore开源项目\n ...
- Homebrew 1.0.0 发布,MacOS 上的包管理器,比如安装qt5keychain
神器,没有它不知道怎么用macos https://www.oschina.net/news/77367/homebrew-1-0-0 Mac OS X用户,qt5keychain可以使用homebr ...
- 因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间
导致你的问题的,应该有2种可能性: 1.存放你的primary文件组的磁盘,已经满了: use master--你的数据库名称 go --看看你的primary组里的文件 select ds.name ...
- sql小计汇总 rollup用法实例分析
这里介绍sql server2005里面的一个使用实例: ),city ),score int) GO 1. 只有一个汇总 select province as 省,sum(score) as 分数 ...
- UTM (Urchin Tracking Module) codes
UTM Codes are a great way to see the results of your offline marketing In today’s day and age, we ar ...
- C#制作浮动图标窗体
先看效果: 这个小图标可以进行随意拖拽,点击还可以产生事件 随便演示一下,效果就是这样的. 下面直接演示如何制作: 新建一个窗体,设置窗体的FormBorderStyle为None(去掉窗体边框): ...
- 27 background
先来讲讲颜色表示法 一共有三种:单词.rgb表示法.十六进制表示法 rgb:红色 绿色 蓝色 三原色 光学显示器,每个像素都是由三原色的发光原件组成的,靠明亮度不同调成不同的颜色的. 用逗号隔开,r. ...