我希望在二进制级别处理file.txt
,如果它等于1,则删除每个第5位。保存新处理的二进制文件并重复该过程,直到它再也找不到5位为止到1,然后保存最终文件。
答案 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)
要操作文件字节 - 读取和写入,您可以使用RandomAccessFile
或ByteBuffer
。使用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。