java的二进制_Java 二进制I/O处理

在Java中如何处理文本I/O

使用Scanner类读取文本数据,使用PrintWriter类写文本数据

例子:

public classIO {public static void main(String [] args) throwsFileNotFoundException {//PrintWriter printWriter = new PrintWriter("123.txt"); 输出文本数据//printWriter.print("chenzquan");//printWriter.close();

Scanner input = new Scanner(new File("123.txt")); //输入文本数据

System.out.print(input.nextLine());

}

}

ca3f741152e783ec8b60772f222c358c.png

文本I/O需要编码、解码而二进制I/O不需要,所以二进制I/O比较快

63259e4e3f4a83920469c67f77a2c5db.png

112351e09a02c2b9a4111134a4b38d33.png

二进制I/O类

fcbf49465315d17583a4d7f9a585f04c.png

InputStream类的方法

ee00b9e1846c576829754c4a8dcabe52.png

fc47aa99b969606b22f791eafc0f4c14.png

OutputStream类方法

c656eb77a709136663152f732f5bb1e6.png

FileInputStream和FileOutputStream

FileInputStream类和FileOutputStream类用于从/向文件读取/写入字节

FileInputStream

c911e32b14062c09aae93644fbd8a460.png

580267c75624a68f66a18e658f5f6117.png

FileOutputStream

4a1585e5c3b23e46de89c05fabcafa53.png

public classTestFileStream {public static void main(String [] args) throwsFileNotFoundException, IOException {try(FileOutputStream fileOutputStream = new FileOutputStream("temp.dat");

){for(int i=0;i<100; i++) {

fileOutputStream.write(i);

}

}try(FileInputStream fileInputStream = new FileInputStream("temp.dat");){intvalue;while((value=fileInputStream.read()) != -1) {

System.out.print(value+ " ");

}

}

}

}

DataInputStream和DataOutputStresam

7d66334a53205aa6f147fc9bf8415a51.png

DataInputStream

实现DataInput接口

594cef915ccd49bed3b94e943974b2fd.png

DataOutputStream

实现DataOutput接口

c8a599acf0251dd557d6f6b888275dfc.png

创建DataInputStream类和DataOutputStream类

aa0ea74ea1f5aa36f10350f58525cc01.png

例子:

4899ddb432024d3dc9130e2679c0d014.png

例子:

public classTestDataStream {public static void main(String [] args) throwsFileNotFoundException, IOException {try(DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("temp.dat"));){

dataOutputStream.writeUTF("John");

dataOutputStream.writeDouble(85.5);

dataOutputStream.writeUTF("chenzquan");

dataOutputStream.writeDouble(100.0);

}try(DataInputStream dataInputStream = new DataInputStream(new FileInputStream("temp.dat"));){

System.out.println(dataInputStream.readUTF()+ " " +dataInputStream.readDouble());

System.out.println(dataInputStream.readUTF()+ " " +dataInputStream.readDouble());

}

}

}

4995da6a2d20f9bfebfd9fe2e4c37d12.png

DataInputStream类和DataOutputStream类以同机器平台无关的方式读写Java基本类型值和字符串,所以,一台机器写好数据,可以在另一台读取该文件

7ab7ee688e1c6acfb36db8a32310391f.png

1bc025f6d5f667ac40b903425b2be083.png

BufferedInputStream类和BufferedOutputStream类

他们可以通过减少磁盘读写次数提高输入和输出的速度

10735ccfc601a549721b5c495a7011d0.png

使用BufferedInputStream时,磁盘上的整块数据一次性地读入到内存中的缓冲区中,然后从缓冲区将个别数据传到程序中

使用BufferedOutputStream时,个别数据写进缓冲区,当缓冲区满了,缓冲区的数据一次性写入到磁盘中

1a1db67e535a098c1d30d74f5d848a88.png

fe42a7426eaabcb52b9d88f532010b63.png

d7ea2959bf7df8cf951ef3f55ba33448.png

对象I/O

ObjectInputStream类和ObjectOutputStream类可以用于读/写可序化的对象

ObjectInputStream类和ObjectOutputStreram类除了可以实现基本类型与字符串的输入和输出之外,还可以实现对象的输入和输出。

ObjectInputStream类和ObjectOutputStream类包含DataInputStream类和DataOutputStream类的所有功能,所以完全可以由ObjectInputStream类和ObjectOutputStream类代替DataInputStream类和DataOutputStream类

ObjectInputStream类

03e98eb439cd500f6d9d0f0a9f4745e8.png

cb75c3687be6cd447fad75c0767d71f6.png

ObjectOutputStream类

4d7bdb3519710d6721f6391d35998973.png

6cdf33966ab66312d7944a33e027c04d.png

他们的构建方法:

57daccb12d67ea1ecac6ebc35c8f4211.png

例子:

public classTestOjbectOutputStream {public static void main(String [] args) throwsFileNotFoundException, IOException {try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.dat"));){

objectOutputStream.writeUTF("John");

objectOutputStream.writeDouble(85.5);

objectOutputStream.writeObject(newDate());

}

}

}

public classTestObjectInputStream {public static void main(String [] args) throwsFileNotFoundException, IOException, ClassNotFoundException {try(ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.dat"));){

String name=inputStream.readUTF();double score =inputStream.readDouble();

Date date=(Date) inputStream.readObject();

System.out.println(name+ " " + score + " " +date);

}

}

}

380a282878caa7044c7b2c0df1522271.png

可以向数据流中写入多个对象或基本类型数据。从对应的ObjectIutputStream中读回这些对象时,必须与其写入的类型和顺序相同。

为了得到所需的类型,必须使用java安全的类型转换。

Serializable接口

不是每个对象都可以写到输出流。可以写入输出流中的对象称为可序列化的。因为可序列化的对象是Serializable接口的实例,所以,可序列化对象必须实现Serializable接口。

Java提供一个内在机制自动完成写对象的过程,这过程称为对象序列化,他是在ObjectOutputStream中实现的。相反的,读取对象的过程称为对象反序列化,他是在ObjectInputStream中实现的。

用transient 关键字 表示这个不用序列化

7ef2720035b281ef00c9348216069f78.png

如果没有transient就会发生异常NotSerializableException

0c65c999d4c7e1bd6579b6c6a07d2349.png

序列化数组

ac6af373625b05a93448f1ba83143079.png

d01c94a6202cbf4230e5520dfaa51f95.png

随机访问文件

RandomAccessFile类允许文件的任何位置进行数据的读写。

9f6a6ff13f44f0a982de0f90f478ae92.png

当创建RandomAccessFile时,可以指定两种模式(“r”或“rw”)之一。

例子:

3dc61342b3d7b29419f5acdac7d7b97a.png

b37e00c14c54562d0c06dd2ceeb5f00a.png

9c0e679fd9cb821436241ba0f182c9b7.png

例子:

public classTestRandomAccessFile {public static void main(String [] args) throwsFileNotFoundException, IOException {try (RandomAccessFile input = new RandomAccessFile("input.dat", "rw");){

input.setLength(0);for(int i=0; i<200; i++) {

input.writeInt(i);

}

System.out.println("Current file number is " +input.length());

input.seek(0);

System.out.println(input.readInt());

input.seek(1*4);

System.out.println(input.readInt());

input.seek(4*9);

System.out.println(input.readInt());

input.writeInt(555);

input.seek(10*4);

System.out.println(input.readInt());

input.seek(input.length());

input.writeInt(999);

System.out.println("the new length is " +input.length());

input.seek(10*4);

System.out.println("the eleventh number is " +input.readInt());

}

}

}

调用read()和write()方法都会使指针移动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值