bufferedrandomaccessfile.java

来自「一个基于NetBeans平台开发的」· Java 代码 · 共 312 行

JAVA
312
字号
package com.sinpool.rivercrescent.io;import java.io.RandomAccessFile;import java.io.File;import java.io.IOException;import java.io.FileNotFoundException;import java.util.ResourceBundle;/** * <p>Title: BufferedRandomAccessFile</p> ** <p>Description: 这个类提供了缓冲区读取数据和写数据的目的,是继承了RandomAccessFile类。</p> * * @version 1.0, 2002/10/12 */public class BufferedRandomAccessFile extends RandomAccessFile {    static ResourceBundle res = ResourceBundle.getBundle("com.sinpool.rivercrescent.io.Res");    private static final int DEFAULT_BUFFER_BIT_LEN = 10;    private static final int DEFAULT_BUFFER_SIZE = 1 << DEFAULT_BUFFER_BIT_LEN;    protected byte buf[];    protected int bufbitlen;    protected int bufsize;    protected long bufmask;    protected boolean bufdirty;    protected int bufusedsize;    protected long curpos;    protected long bufstartpos;    protected long bufendpos;    protected long fileendpos;    protected boolean append;    protected String filename;    protected long initfilelen;    public BufferedRandomAccessFile(String name) throws  IOException {        this(name, res.getString("r"), DEFAULT_BUFFER_BIT_LEN);    }    public BufferedRandomAccessFile(File file) throws IOException, FileNotFoundException {        this(file.getPath(), res.getString("r"), DEFAULT_BUFFER_BIT_LEN);    }    public BufferedRandomAccessFile(String name, int bufbitlen) throws  IOException {        this(name, res.getString("r"), bufbitlen);    }    public BufferedRandomAccessFile(File file, int bufbitlen) throws IOException, FileNotFoundException {        this(file.getPath(), res.getString("r"), bufbitlen);    }    public BufferedRandomAccessFile(String name, String mode) throws IOException {        this(name, mode, DEFAULT_BUFFER_BIT_LEN);    }    public BufferedRandomAccessFile(File file, String mode) throws IOException, FileNotFoundException {        this(file.getPath(), mode, DEFAULT_BUFFER_BIT_LEN);    }    public BufferedRandomAccessFile(String name, String mode, int bufbitlen) throws IOException  {        super(name, mode);        this.init(name, mode, bufbitlen);    }    public BufferedRandomAccessFile(File file, String mode, int bufbitlen) throws IOException, FileNotFoundException {        this(file.getPath(), mode, bufbitlen);    }    private void init(String name, String mode, int bufbitlen) throws IOException {        if (mode.equals(res.getString("r")) == true) {            this.append = false;        } else {            this.append = true;        }        this.filename = name;        this.initfilelen = super.length();        this.fileendpos = this.initfilelen - 1;        this.curpos = super.getFilePointer();        if (bufbitlen < 0) {            throw new IllegalArgumentException(res.getString("bufbitlen_size_must_0"));        }        this.bufbitlen = bufbitlen;        this.bufsize = 1 << bufbitlen;        this.buf = new byte[this.bufsize];        this.bufmask = ~((long)this.bufsize - 1L);        this.bufdirty = false;        this.bufusedsize = 0;        this.bufstartpos = -1;        this.bufendpos = -1;    }    private void flushbuf() throws IOException {        if (this.bufdirty == true) {            if (super.getFilePointer() != this.bufstartpos) {                super.seek(this.bufstartpos);            }            super.write(this.buf, 0, this.bufusedsize);            this.bufdirty = false;        }    }    private int fillbuf() throws IOException {        super.seek(this.bufstartpos);        this.bufdirty = false;        return super.read(this.buf);    }    public byte read(long pos) throws IOException {        if (pos < this.bufstartpos || pos > this.bufendpos) {            this.flushbuf();            this.seek(pos);            if ((pos < this.bufstartpos) || (pos > this.bufendpos)) {                throw new IOException();            }        }        this.curpos = pos;        return this.buf[(int)(pos - this.bufstartpos)];    }    public boolean write(byte bw) throws IOException {        return this.write(bw, this.curpos);    }    public boolean append(byte bw) throws IOException {        return this.write(bw, this.fileendpos + 1);    }    public boolean write(byte bw, long pos) throws IOException {        if ((pos >= this.bufstartpos) && (pos <= this.bufendpos)) { // write pos in buf            this.buf[(int)(pos - this.bufstartpos)] = bw;            this.bufdirty = true;            if (pos == this.fileendpos + 1) { // write pos is append pos                this.fileendpos++;                this.bufusedsize++;            }        } else { // write pos not in buf            this.seek(pos);            if ((pos >= 0) && (pos <= this.fileendpos) && (this.fileendpos != 0)) { // write pos is modify file                this.buf[(int)(pos - this.bufstartpos)] = bw;            } else if (((pos == 0) && (this.fileendpos == 0)) || (pos == this.fileendpos + 1)) { // write pos is append pos                this.buf[0] = bw;                this.fileendpos++;                this.bufusedsize = 1;            } else {                throw new IndexOutOfBoundsException();            }            this.bufdirty = true;        }        this.curpos = pos;        return true;    }    public void write(byte b[], int off, int len) throws IOException {        long writeendpos = this.curpos + len - 1;        if (writeendpos <= this.bufendpos) { // b[] in cur buf            System.arraycopy(b, off, this.buf, (int)(this.curpos - this.bufstartpos), len);            this.bufdirty = true;            this.bufusedsize = (int)(writeendpos - this.bufstartpos + 1);//(int)(this.curpos - this.bufstartpos + len - 1);        } else { // b[] not in cur buf            super.seek(this.curpos);            super.write(b, off, len);        }        if (writeendpos > this.fileendpos)            this.fileendpos = writeendpos;        this.seek(writeendpos+1);    }    public int read(byte b[], int off, int len) throws IOException {        long readendpos = this.curpos + len - 1;        if (readendpos <= this.bufendpos && readendpos <= this.fileendpos ) { // read in buf            System.arraycopy(this.buf, (int)(this.curpos - this.bufstartpos), b, off, len);        } else { // read b[] size > buf[]            if (readendpos > this.fileendpos) { // read b[] part in file                len = (int)(this.length() - this.curpos + 1);            }            super.seek(this.curpos);            len = super.read(b, off, len);            readendpos = this.curpos + len - 1;        }        this.seek(readendpos + 1);        return len;    }    public void write(byte b[]) throws IOException {        this.write(b, 0, b.length);    }    public int read(byte b[]) throws IOException {        return this.read(b, 0, b.length);    }    public void seek(long pos) throws IOException {        if ((pos < this.bufstartpos) || (pos > this.bufendpos)) { // seek pos not in buf            this.flushbuf();            if ((pos >= 0) && (pos <= this.fileendpos) && (this.fileendpos != 0)) { // seek pos in file (file length > 0)                this.bufstartpos =  pos & this.bufmask;                this.bufusedsize = this.fillbuf();            } else if (((pos == 0) && (this.fileendpos == 0)) || (pos == this.fileendpos + 1)) { // seek pos is append pos                this.bufstartpos = pos;                this.bufusedsize = 0;            }            this.bufendpos = this.bufstartpos + this.bufsize - 1;        }        this.curpos = pos;    }    public long length() throws IOException {        return this.max(this.fileendpos + 1, this.initfilelen);    }    public void setLength(long newLength) throws IOException {        if (newLength > 0) {            this.fileendpos = newLength - 1;        } else {            this.fileendpos = 0;        }        super.setLength(newLength);    }    public long getFilePointer() throws IOException {        return this.curpos;    }    private long max(long a, long b) {        if (a > b) return a;        return b;    }    public void close() throws IOException {        this.flushbuf();        super.close();    }    public static void main(String[] args) throws IOException {        long readfilelen = 0;        BufferedRandomAccessFile brafReadFile, brafWriteFile;        brafReadFile = new BufferedRandomAccessFile("C:\\WINNT\\Fonts\\STKAITI.TTF");        readfilelen = brafReadFile.initfilelen;        brafWriteFile = new BufferedRandomAccessFile(".\\STKAITI.001", "rw", 10);        byte buf[] = new byte[1024];        int readcount;        long start = System.currentTimeMillis();        while((readcount = brafReadFile.read(buf)) != -1) {            brafWriteFile.write(buf, 0, readcount);        }        brafWriteFile.close();        brafReadFile.close();        System.out.println("BufferedRandomAccessFile Copy & Write File: "                           + brafReadFile.filename                           + "    FileSize: "                           + java.lang.Integer.toString((int)readfilelen >> 1024)                           + " (KB)    "                           + "Spend: "                           +(double)(System.currentTimeMillis()-start) / 1000                           + "(s)");        java.io.FileInputStream fdin = new java.io.FileInputStream("C:\\WINNT\\Fonts\\STKAITI.TTF");        java.io.BufferedInputStream bis = new java.io.BufferedInputStream(fdin, 1024);        java.io.DataInputStream dis = new java.io.DataInputStream(bis);        java.io.FileOutputStream fdout = new java.io.FileOutputStream(".\\STKAITI.002");        java.io.BufferedOutputStream bos = new java.io.BufferedOutputStream(fdout, 1024);        java.io.DataOutputStream dos = new java.io.DataOutputStream(bos);        start = System.currentTimeMillis();        for (int i = 0; i < readfilelen; i++) {            dos.write(dis.readByte());        }        dos.close();        dis.close();        System.out.println("DataBufferedios Copy & Write File: "                           + brafReadFile.filename                           + "    FileSize: "                           + java.lang.Integer.toString((int)readfilelen >> 1024)                           + " (KB)    "                           + "Spend: "                           + (double)(System.currentTimeMillis()-start) / 1000                           + "(s)");    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?