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

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

例子:

public class IO {
public static void main(String [] args) throws FileNotFoundException { // PrintWriter printWriter = new PrintWriter("123.txt"); 输出文本数据
// printWriter.print("chenzquan");
// printWriter.close();
Scanner input = new Scanner(new File("123.txt")); //输入文本数据
System.out.print(input.nextLine()); }
}

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

二进制I/O类

InputStream类的方法

OutputStream类方法

FileInputStream和FileOutputStream

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

FileInputStream

FileOutputStream

public class TestFileStream {

    public static void main(String [] args) throws FileNotFoundException, 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");){
int value;
while((value=fileInputStream.read()) != -1) {
System.out.print(value + " ");
}
}
}
}

DataInputStream和DataOutputStresam

DataInputStream

实现DataInput接口

DataOutputStream

实现DataOutput接口

创建DataInputStream类和DataOutputStream类

例子:

例子:

public class TestDataStream {
public static void main(String [] args) throws FileNotFoundException, 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());
} }
}

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

BufferedInputStream类和BufferedOutputStream类

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

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

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

对象I/O

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

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

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

ObjectInputStream类

ObjectOutputStream类

他们的构建方法:

例子:

public class TestOjbectOutputStream {

    public static void main(String [] args) throws FileNotFoundException, IOException {

        try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.dat"));){
objectOutputStream.writeUTF("John");
objectOutputStream.writeDouble(85.5);
objectOutputStream.writeObject(new Date());
}
}
}
public class TestObjectInputStream {
public static void main(String [] args) throws FileNotFoundException, 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);
} }
}

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

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

Serializable接口

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

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

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

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

序列化数组

随机访问文件

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

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

例子:

例子:

public class TestRandomAccessFile {
public static void main(String [] args) throws FileNotFoundException, 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()方法都会使指针移动

Java 二进制I/O处理的更多相关文章

  1. Java 二进制与十六进制转换

    Java 二进制与十六进制转换 二进制转换十六进制 /** * @description 将二进制转换成16进制 * * @param buf * @return */ public static S ...

  2. Java二进制兼容性原理

    一.概述 现在的软件越来越依赖于不同厂商.作者开发的共享组件,组件管理也变得越来越重要.在这方面,一个极其重要的问题是类的不同版本的二进制兼容性,即一个类改变时,新版的类是否可以直接替换原来的类,却不 ...

  3. Java二进制指令代码解析

    http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html http://blog.csdn.net/sum_rain/article/ ...

  4. java二进制表示形式与移位操作符

    java二进制表示形式 java中数字的二进制表示形式称为"有符号的二进制补码",下面先介绍原码,反码,补码. 编码 计算方法 原码 用最高位表示符号位,'1'表示负号,'0'表示 ...

  5. JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  6. 【编程之美】java二进制实现重建

    package com.cn.binarytree.utils; /** * @author 刘利娟 liulijuan132@gmail.com * @version 创建时间:2014年7月20日 ...

  7. java中Integer包装类的具体解说(java二进制操作,全部进制转换)

    程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...

  8. java二进制相关基础

    转载请注明原创出处,谢谢! 说在前面 之前在JVM菜鸟进阶高手之路十(基础知识开场白)的时候简单提到了二进制相关问题,最近在看RocketMQ的源码的时候,发现涉及二进制的内容蛮多,jdk源码里面也是 ...

  9. JAVA 二进制基础

    主要内容 1.十进制二进制互转 2.二进制的位运算 3.JDK内置的进制转换 4.JAVA中的进制 十进制二进制互转 57 111001 二进制的位运算:优点:特定情况下,计算方便,被支持面广泛. ① ...

随机推荐

  1. AC自动机-HDU3065-简单题

    http://acm.hdu.edu.cn/showproblem.php?pid=3065 需要记录匹配情况的AC自动机,没有清空一些数组导致wa了几发. /*------------------- ...

  2. jenkins和sonar的几个问题

    错误1:有个pom文件内容错了,但是在jenkins上面编译的时候,控制台将这个错误信息给打出来了,maven的编译也打印了failed with error,但是jenkins的job并没有因此而停 ...

  3. Get The Treasury HDU - 3642(扫描线求三维面积交。。体积交)

    题意: ...就是求体积交... 解析: 把每一层z抽出来,计算面积交, 然后加起来即可..! 去看一下 二维面积交的代码 再看看这个三维面积交的代码.. down函数里 你发现了什么规律!!! 参考 ...

  4. HihoCoder - 1498 Diligent Robots

    There are N jobs to be finished. It takes a robot 1 hour to finish one job. At the beginning you hav ...

  5. 洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)

    洛谷题目传送门 90分WA第二个点的看过来! 简要介绍一下中国剩余定理 中国剩余定理,就是用来求解这样的问题: 假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[ ...

  6. BZOJ 4671 异或图 | 线性基 容斥 DFS

    题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...

  7. python开启httpserver服务在自动化测试中的一个小运用

    httpserver可以在本机启动一个python实现的web服务器,在自动化测试中,可以将生成测试报告的目录开放给项目组同事. 先安装python 自动化测试框架,生成报告的目录D:\Automat ...

  8. AtCoder Grand Contest 010 D - Decrementing

    题目描述 有n个整数,其中第i个数为Ai.这些数字的gcd为1.两人轮流操作,每次操作把一个大于1的数减1,并把所有数除以所有数的最大公约数,最后无法操作者输,求是否先手必胜. 如果当前的sum为偶数 ...

  9. 【洛谷P1429】平面最近点对

    题解:直接在输入点对的基础上建立 kd-tree,再每次以每个节点的坐标查询离这个点最近的点即可,同时需要忽略这个点本身对该点答案的贡献. 另外,直接在这些点上建立 kd-tree 会比一个一个插入点 ...

  10. MySQL的1067错误解决方法

    今天在学校的时候MySQL还运行的好好的,关机来公司后MySQL一直报错,错误为1067,网上找了好多办法,但是大都没效果,因此对这个错误做个总结: 打开你的安装目录下,查看my.ini文件中MySQ ...