file.txt的Java位处理

时间:2015-09-26 17:12:51

标签: java arrays bit

我希望在二进制级别处理file.txt,如果它等于1,则删除每个第5位。保存新处理的二进制文件并重复该过程,直到它再也找不到5位为止到1,然后保存最终文件。

3 个答案:

答案 0 :(得分:1)

通常你操作字节而不是位。如果要访问各个位,可以使用BitSet(假设文件适合内存)。例如,要将第17位设置为1:

final Path path = Paths.get("file.bin");
final BitSet bitSet = BitSet.valueOf(Files.readAllBytes(path));
bitSet.set(17, true);
Files.write(path, bitSet.toByteArray());

答案 1 :(得分:0)

所有文件都已存储为二进制文件。您可以使用Files api从Java中的任何文件中获取二进制字节。举个例子:

    InputStream is = null;
    try{
        is = Files.newInputStream(Paths.get("myFile.pdf"),StandardOpenOption.READ, StandardOpenOption.WRITE);
        boolean hadMoreBytes = true;
        byte[] buffer = new byte[1024]; 
        int bytesRead = 0;
        while(hadMoreBytes){
            bytesRead = is.read(buffer);
            doSomethingWithBytes(buffer,bytesRead);
            hadMoreBytes = bytesRead > 0;
        }
    } finally {
        if(is!=null){
            is.close();
        }
    }

*加上关于添加错误处理的常规免责声明其他适合您情况的检查

请注意,您将以不超过缓冲区的“块”字节读取文件。如果您知道您的文件足够小以适应内存并且您的情况需要它,您可以自己构建一个包含文件中所有字节的数组。

如果您想在阅读后对文件的字节做某事,可以使用Files.newOutputStream(Path path, OpenOption... options)执行类似操作。

答案 2 :(得分:0)

要操作文件字节 - 读取和写入,您可以使用RandomAccessFileByteBuffer。使用RandomAccess文件的示例:

public void writeAndRead(byte[] bytes) throws IOException {

    RandomAccessFile file = new RandomAccessFile("myFile.bin", "rw");

    // Write some bytes to file.
    file.write(bytes);

    // Seek to the begining of the file.
    file.seek(0);

    // Read back the bytes from the file.
    byte[] buffer = new byte[bytes.length];
    file.read(buffer);

    file.close();
}

我对此的看法是这样的:

从文件中读取一个字节后,您可以使用按位操作检查其第5位值。

byte myByte;
int bit;

...

boolean bitValue = (myByte & (1 << bit)) != 0;

读取一个字节后,检查其第5位。如果该位等于1,则将该字节的前3位向左移位(移除该位)。现在,您的字节的第一位未定义(可以是0或1)。因此,读取下一个字节并取其最后一位,然后插入前一个字节的第一位。

对下一个字节执行相同的移位,直到没有剩余字节为止。然后重复这个过程。检查位。

您可以通过执行以下操作设置字节的特定位:

myByte |= 1 << bit;

查看堆栈溢出中的其他问题,也许您可​​以使用bit-io