2012-02-22 148 views
1

我有读取整个文件并写入它的位的文件读取器。 我有这个类,帮助阅读:读取文件位并保存它们

import java.io.*; 

public class FileReader extends ByteArrayInputStream{ 

    private int bitsRead; 
    private int bitPosition; 
    private int currentByte; 
    private int myMark; 
    private final static int NUM_BITS_IN_BYTE = 8; 
    private final static int END_POSITION = -1; 
    private boolean readingStarted; 
    /** 
    * Create a BitInputStream for a File on disk. 
    */ 
    public FileReader(byte[] buf) throws IOException { 
    super(buf); 

    myMark   = 0; 
    bitsRead  = 0; 
    bitPosition = NUM_BITS_IN_BYTE-1; 
    currentByte = 0; 
    readingStarted = false; 
    } 


    /** 
    * Read a binary "1" or "0" from the File. 
    */ 
    public int readBit() throws IOException { 
    int theBit = -1; 

    if(bitPosition == END_POSITION || !readingStarted) { 
     currentByte = super.read(); 
     bitPosition = NUM_BITS_IN_BYTE-1; 
     readingStarted = true; 
    } 

    theBit = (0x01 << bitPosition) & currentByte; 
    bitPosition--; 

    if(theBit > 0) { 
     theBit = 1; 
    } 

    return(theBit); 
    } 


    /** 
    * Return the next byte in the File as lowest 8 bits of int. 
    */ 
    public int read() { 
    currentByte = super.read(); 
    bitPosition = END_POSITION; 
    readingStarted = true; 

    return(currentByte); 
    } 


    /** 
    * 
    */ 
    public void mark(int readAheadLimit) { 
    super.mark(readAheadLimit); 
    myMark = bitPosition; 
    } 


    /** 
    * Add needed functionality to super's reset() method. Reset to 
    * the last valid position marked in the input stream. 
    */ 
    public void reset() { 
    super.pos = super.mark-1; 
    currentByte = super.read(); 
    bitPosition = myMark; 
    } 


    /** 
    * Returns the number of bits still available to be read. 
    */ 
    public int availableBits() throws IOException { 
    return( ((super.available() * 8) + (bitPosition + 1)) ); 
    } 

} 

在课堂,我把这个,我做的:

FileInputStream inputStream = new FileInputStream(file); 

     byte[] fileBits = new byte[inputStream.available()]; 

     inputStream.read(fileBits, 0, inputStream.available()); 
     inputStream.close(); 

     FileReader bitIn = new FileReader(fileBits);  

这项工作正常。 但是我在100 MB以上的大文件有问题,因为byte []有结束。

所以我想读更大的文件。也许有人可以建议我如何改善这个代码?

谢谢。

+1

不要使用可用的()。不要忽略read()调用的结果。 available()不会返回文件的大小。并且read()不一定一次读取所有内容。 – 2012-02-22 19:57:44

+0

除非它实现java.io.Reader,否则不要将其称为FileReader,也不要因为它与java.io.FileReader冲突。 – 2012-02-22 20:48:29

+0

谢谢你的提示 – Streetboy 2012-02-23 06:36:47

回答

0

如果缩放到较大的文件大小很重要,那么最好不要将整个文件读入内存。缺点是在更多地方处理IOException可能有点混乱。此外,它看起来并不像你的应用程序需要实现InputStream API的东西,它只需要readBit()方法。因此,您可以安全地封装而不是扩展InputStream

class FileReader { 

    private final InputStream src; 

    private final byte[] bits = new byte[8192]; 

    private int len; 

    private int pos; 

    FileReader(InputStream src) { 
    this.src = src; 
    } 

    int readBit() throws IOException { 
    int idx = pos/8; 
    if (idx >= len) { 
     int n = src.read(bits); 
     if (n < 0) 
     return -1; 
     len = n; 
     pos = 0; 
     idx = 0; 
    } 
    return ((bits[idx] & (1 << (pos++ % 8))) == 0) ? 0 : 1; 
    } 

} 

用法看起来很相似。

FileInputStream src = new FileInputStream(file); 
try { 
    FileReader bitIn = new FileReader(src); 
    ... 
} finally { 
    src.close(); 
} 

如果你确实想在整个文件中读取,并且您正在使用一个实际的文件,则可以先查询该文件的长度。

File file = new File(path); 
if (file.length() > Integer.MAX_VALUE) 
    throw new IllegalArgumentException("File is too large: " + file.length()); 
int len = (int) file.length(); 
FileInputStream inputStream = new FileInputStream(file); 
try { 
    byte[] fileBits = new byte[len]; 
    for (int pos = 0; pos < len;) { 
    int n = inputStream.read(fileBits, pos, len - pos); 
    if (n < 0) 
     throw new EOFException(); 
    pos += n; 
    } 
    /* Use bits. */ 
    ... 
} finally { 
    inputStream.close(); 
} 
+0

在上面的代码中有int n = src.read(bits); 我得到例外 – Streetboy 2012-02-23 06:37:28

0
org.apache.commons.io.IOUtils.copy(InputStream in, OutputStream out) 
相关问题