在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());
}
}
文本I/O需要编码、解码而二进制I/O不需要,所以二进制I/O比较快
二进制I/O类
InputStream类的方法
OutputStream类方法
FileInputStream和FileOutputStream
FileInputStream类和FileOutputStream类用于从/向文件读取/写入字节
FileInputStream
FileOutputStream
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
DataInputStream
实现DataInput接口
DataOutputStream
实现DataOutput接口
创建DataInputStream类和DataOutputStream类
例子:
例子:
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());
}
}
}
DataInputStream类和DataOutputStream类以同机器平台无关的方式读写Java基本类型值和字符串,所以,一台机器写好数据,可以在另一台读取该文件
BufferedInputStream类和BufferedOutputStream类
他们可以通过减少磁盘读写次数提高输入和输出的速度
使用BufferedInputStream时,磁盘上的整块数据一次性地读入到内存中的缓冲区中,然后从缓冲区将个别数据传到程序中
使用BufferedOutputStream时,个别数据写进缓冲区,当缓冲区满了,缓冲区的数据一次性写入到磁盘中
对象I/O
ObjectInputStream类和ObjectOutputStream类可以用于读/写可序化的对象
ObjectInputStream类和ObjectOutputStreram类除了可以实现基本类型与字符串的输入和输出之外,还可以实现对象的输入和输出。
ObjectInputStream类和ObjectOutputStream类包含DataInputStream类和DataOutputStream类的所有功能,所以完全可以由ObjectInputStream类和ObjectOutputStream类代替DataInputStream类和DataOutputStream类
ObjectInputStream类
ObjectOutputStream类
他们的构建方法:
例子:
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);
}
}
}
可以向数据流中写入多个对象或基本类型数据。从对应的ObjectIutputStream中读回这些对象时,必须与其写入的类型和顺序相同。
为了得到所需的类型,必须使用java安全的类型转换。
Serializable接口
不是每个对象都可以写到输出流。可以写入输出流中的对象称为可序列化的。因为可序列化的对象是Serializable接口的实例,所以,可序列化对象必须实现Serializable接口。
Java提供一个内在机制自动完成写对象的过程,这过程称为对象序列化,他是在ObjectOutputStream中实现的。相反的,读取对象的过程称为对象反序列化,他是在ObjectInputStream中实现的。
用transient 关键字 表示这个不用序列化
如果没有transient就会发生异常NotSerializableException
序列化数组
随机访问文件
RandomAccessFile类允许文件的任何位置进行数据的读写。
当创建RandomAccessFile时,可以指定两种模式(“r”或“rw”)之一。
例子:
例子:
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()方法都会使指针移动