Java_io体系之RandomAccessFile简介、走进源码及示例――20(二)

2014-11-24 07:53:39 · 作者: · 浏览: 4
int read() 从此文件中读取一个数据字节。 int read(byte[] b) 将最多 b.length 个数据字节从此文件读入 byte 数组。 int read(byte[] b, int off, int len) 将最多 len 个数据字节从此文件读入 byte 数组。 boolean readBoolean() 从此文件读取一个 boolean。 byte readByte() 从此文件读取一个有符号的八位值。 char readChar() 从此文件读取一个字符。 double readDouble() 从此文件读取一个 double。 float readFloat() 从此文件读取一个 float。 void readFully(byte[] b) 将 b.length 个字节从此文件读入 byte 数组,并从当前文件指针开始。 void readFully(byte[] b, int off, int len) 将正好 len 个字节从此文件读入 byte 数组,并从当前文件指针开始。 int readInt() 从此文件读取一个有符号的 32 位整数。 String readLine() 从此文件读取文本的下一行。 long readLong() 从此文件读取一个有符号的 64 位整数。 short readShort() 从此文件读取一个有符号的 16 位数。 int readUnsignedByte() 从此文件读取一个无符号的八位数。 int readUnsignedShort() 从此文件读取一个无符号的 16 位数。 String readUTF() 从此文件读取一个字符串。 void seek(long pos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。 void setLength(long newLength) 设置此文件的长度。 int skipBytes(int n) 尝试跳过输入的 n 个字节以丢弃跳过的字节。 void write(byte[] b) 将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。 void write(byte[] b, int off, int len) 将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。 void write(int b) 向此文件写入指定的字节。 void writeBoolean(boolean v) 按单字节值将 boolean 写入该文件。 void writeByte(int v) 按单字节值将 byte 写入该文件。 void writeBytes(String s) 按字节序列将该字符串写入该文件。 void writeChar(int v) 按双字节值将 char 写入该文件,先写高字节。 void writeChars(String s) 按字符序列将一个字符串写入该文件。 void writeDouble(double v) 使用 Double 类中的 doubleToLongBits 方法将双精度参数转换为一个 long,然后按八字节数量将该 long 值写入该文件,先定高字节。 void writeFloat(float v) 使用 Float 类中的 floatToIntBits 方法将浮点参数转换为一个 int,然后按四字节数量将该 int 值写入该文件,先写高字节。 void writeInt(int v) 按四个字节将 int 写入该文件,先写高字节。 void writeLong(long v) 按八个字节将 long 写入该文件,先写高字节。 void writeShort(int v) 按两个字节将 short 写入该文件,先写高字节。 void writeUTF(String str) 使用 modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。

4、 源码分析


package com.chy.io.original.code;

import java.io.Closeable;
import java.io.EOFException;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UTFDataFormatException;
import java.nio.channels.FileChannel;

import sun.nio.ch.FileChannelImpl;


/**
 * 随机访问文件流、既可以对文件进行读取、也可以对文件进行写入、还可以写入java基础类型、不再是InputStream或者OutputStream的子类、
 * 而是实现了DataOutput、DataInput、通过这两个接口也可以看出、此类具有将java基础类型写入文件或者读取到程序中的功能、关于写入/读取文件基础类型
 * 的操作大多数都是剽窃DataInputStream/DataOutputStream的。
 */

public class RandomAccessFile implements DataOutput, DataInput, Closeable {
	java.io.RandomAccessFile
    private FileDescriptor fd;
    private FileChannel channel = null;
    private boolean rw;//标识此文件是否既可以读又可以写

    //标识不同mode对应的值
    private static final int O_RDONLY = 1;
    private static final int O_RDWR =   2;
    private static final int O_SYNC =   4;
    private static final int O_DSYNC =  8;

    /**
     * 使用指定的文件、模式构造RandomAccessFile、初始化参数、打开到文件的连接
     */
    public RandomAccessFile(String name, String mode)
	throws FileNotFoundException
    {
        this(name != null   new File(name) : null, mode);
    }

    /**
     * 使用指定的文件、模式构造RandomAccessFile、初始化参数、打开到文件的连接
     */
    public RandomAccessFile(File file, String mode)
	throws FileNotFoundException
    {
		String name = (file != null   file.getPath() : null);
		int imode = -1;
		if (mode.equals("r"))
		    imode = O_RDONLY;
		else if (mode.startsWith("rw")) {
		    imode = O_RDWR;
		    rw = true;
		    if (mode.length() > 2) {
			if (mode.equals("rws"