Java IO系列(三):DataInputStream,DataOutputStream和RandomAccessFile详解编程语言
转载请注明出:http://blog.csdn.net/jeffleo/article/details/52266200
有必要多看几遍的
关于字符和字节,例如文本文件,XML这些都是用字符流来读取和写入。而如RAR,EXE文件,图片等非文本,则用字节流来读取和写入。
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。当我们们需要读写Java的数据类型,DataInputStream和DataOutputStream就能帮我们了,而且重要的是,这两个类能够帮我们准确地读取数据,无论读和取得平台是否相同!
public class TestDadaIs { public static void main(String[] args) throws IOException { String file = "F:" + File.separator + "io" + File.separator + "a.txt"; DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(new FileOutputStream(file))); dos.writeInt(10); dos.writeDouble(10.00000); dos.writeUTF("Hello"); dos.writeBoolean(true); dos.writeChar(c); dos.writeByte(a); dos.flush(); dos.close();
DataInputStream dis = new DataInputStream( new BufferedInputStream(new FileInputStream(file))); System.out.println(dis.readInt()); System.out.println(dis.readDouble()); System.out.println(dis.readUTF()); System.out.println(dis.readBoolean()); System.out.println(dis.readChar()); System.out.println(dis.readByte());
各API的用法和作用,名字已经写得一清二楚。注意的是writeUTF的格式是UTF-8。
RandomAccessFileRandomAccessFile这个类的作用很大,用来访问那些保存数据记录的文件的,它能够实现随机访问文件。使用seek()方法能够在文件内部的任何位置进行移动,由此达到随机访问。(BufferedInputStream有一个mark( )方法,但由于实用性不足,一般不使用)
RandomAccessFile实现了DataOutput和DataInput接口,但是它与DataInputStream,DataOutputStream毫无关系,它直接继承自Object,是一个独立的类。
它的作用:
第一,能够支持任意位置读写;
第二,拥有读取基本类型和UTF-8的具体方法。
比较重要的方法:
seek():设置文件指针位置
skipBytes():设置跳过字节数
setLength():设置文件大小
基本用法:
public class TestRAF { static String file = "E://test//hello.txt"; static void read() throws Exception{ RandomAccessFile raf = new RandomAccessFile(file, "r");//只读 for(int i = 0; i 5; i++){ System.out.println("Key " + i + " : " + raf.readDouble()); raf.close(); public static void main(String[] args) throws Exception { RandomAccessFile raf = new RandomAccessFile(file, "rw");//读写 for(int i = 0; i 5; i++){ raf.writeDouble(i * 1.1314); raf.close(); read(); System.out.println(); raf = new RandomAccessFile(file, "rw"); raf.seek(3 * 8);//double是8个字节的 //raf.skipBytes(3 * 8);//double是8个字节的 raf.writeDouble(81.000);//更改第4个的值 raf.close(); read(); }
结果为:
Key 0 : 0.0 Key 1 : 1.1314 Key 2 : 2.2628 Key 3 : 3.3941999999999997 Key 4 : 4.5256 Key 0 : 0.0 Key 1 : 1.1314 Key 2 : 2.2628 Key 3 : 81.0 Key 4 : 4.5256
由于double是8个字节的,raf.seek(3 * 8)则把文件指针设置到第四个double的开头处。调用write方法,则重写了原来的double值。
seek()和skipBytes()的区别:seek():是绝对定位,要给定离文件开头的字节数。假如seek(0)则表示在文件开头。
skipBytes():是相对定位,给定字节数,就能跳过字节数的距离。
两者相比,seek()对系统的花销更大。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/7813.html
cjavamacxml相关文章
- java helloworld源代码_Java Hello World源代码剖析
- java %08d_总结Java中String.format()的使用[通俗易懂]
- Java 8 的 java.util.function.* POJO 的反射新方法
- Java Activiti6.0 spring5 SSM 工作流引擎 审批流程 java项目框架详解编程语言
- Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解编程语言
- Java IO系列(四):文件压缩GZIP、Zip详解编程语言
- java压缩与解压(Java.util.zip)详解编程语言
- java 检测 Java 是否运行在64bit 的JVM上详解编程语言
- java JNI: C 语言调用 Java 方法示例详解编程语言
- Java使用apache commons io获得磁盘的剩余空间详解编程语言
- Java学习笔记之四java进制转化详解编程语言
- Java IO详解(七)——随机访问文件流编程语言
- Java IO详解(二)——流的分类编程语言
- Linux环境下编译Java程序的指南(linux编译java)
- 代码Linux下编写Java代码的指南(linux编写java)
- java.io.Serializable中serialVersionUID的作用详解编程语言
- 更新LINUX下的Java版本(linux更新java)
- Java连接SQL Server:实现数据库完美对接(java链接sqlserver)
- 使用Redis优化Java开发的关键技巧(redis与java开发)
- Linux磁盘IO查看方法详解,了解磁盘性能瓶颈,提高工作效率(查看linux磁盘io)
- Oracle IO引发的问题及其解决方案(oracle io成问题)