9.12 DataOutput流
和DataInputStream对 应,Java还 提 ?copy; 了DataOutput流。 使 用DataOutput流,我 们 可 以 向 文 件 写 入 二 进 制 数 据。
9.12.1 打开和关闭DataOutput流对象
打开和关闭DataOutput流对象与打开、关闭FileOutput流对象方法一样:
DataOutputStream myDataStream;
FileOutputStream myFileStream;
BufferedOutputStream myBufferStream;
//get a file handle mhyFileStream = new FileOutputStream("/usr/db/stock.dbf");
//chain a buffered output stream (for efficiency);
myBufferStream = new BufferedOutputStream(myFileStream);
//chain a data output file
myDataStream = new DataOutputStream(myBufferStream);
//Now we can use both input streams to access our file
//(iiIf we want to ...)
myBufferStream.write(b);
myDataStream.writeInt(i);
//close the data file explicitly
//Always colse the "topmost" file stream
myDataStream.close();
myBuffersStream.close();
myFileStream.close();
9.12.2 向DataOutput流写数据
FileOutput流里的write()函数各种方法都适用于DataOutput流。你还可以看到DataInput流的类似函数方法:
void writeBoolean (boolean v) ;
void writeByte (int v) ;
void writeShort (int v) ;
void writeChar (int v) ;
void writeInt (int v) ;
void writeFloat (float v) ;
void writeDouble (double v) ;
void writeBytes (string s) ;
void writeChars (string s)
对字符来说,有两种选择:byte和char。 记住byte是8位数据而char是16位数据。如果你想利用Unicode字符的优点,你应使用writeChars()函数。
9.12.3 输出记数
在使用二进制数据输出时常用的另外一个函数是size()。这个函数返回写入文件数据的总字 节数。你也可用size()函数将数据文件分成四字节为单位的块,例如:
int bytesLeft = myDataStream.size()%4;
for (int I = 0; I< bytesLeft; I++) {
myDataStrea.write(0);
}
9.13 随机访问文件
我们读文件常常不是从头至尾顺序读的。也许想将一文本文件当作一个数据库, 读完一个记录后,跳到另一个记录,它们在文件的不同地方。Java提出了RandomAccessFile类让操作这种类型的输入输出。
9.13.1 创建随机访问文件
打开随机访问文件有两种方法:
1. 用文件名
myRAFile = new RandomAccessFile(String name,String mode);
2. 用文件对象
myRAFile = new RandomAccessFile(File file,String mode);
mode参数决定了访问文件的权限, 如只读'r'或读写'wr'等。
例如, 我们打开一个数据库更新数据:
RandomAccessFile myRAFile;
myRAFile = new RandomAccessFile("/usr/db/stock.dbf","rw");
9.13.2 访问信息
RandomAccessFile对象的读写操作和DataInput/DataOutput对象的操作方式 一 样。 你可以使用在DataInputStream 和DataOutputStream里出现的所有read()和write()函数。
还有几个函数帮助你在文件里移动指针:
long getFilePointer(); 返回当前指针;
void seek(long pos); 将文件指针定位到一个绝对地址。地址是相对于文件头的偏移量。地址0表示文件的开头。
long length(); 返回文件的长度。 地址"length()"表示文件的结尾。
9.13.3 增加信息
你可以使用随机访问文件来设置成增加信息模式:
myRAFile = new RandomAccessFile("/tmp/java.log","rw");
myRAFile.seek(myRAFile.length()); //Any subsequent write()s will be appended to the file
9.13.4 追加信息例子
下面是一个在已存在文件后面追加字符的例子:
import java.io.IOException;
import java.io.RandomAccessFile;
public class raTest {
public static void main(String args[]) throws IOException {
RandomAccessFile myFAFile;
String s = "Information to Append/nHi mom!/n";
//open our random access file
myRAFile = new RandomAccessFile("/tmp/java.log","rw");
//move to the end of the file
myRAFile.seek(myRAFile.length());
//Start appending!
myRAFile.writeBytes(s);
myRAFile.close();
}
}
本章小结
1. Java通过系统类达到访问标准输入输出的功能。
2. 你可以创建、读、写文件。
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。