Necesito leer el flujo de archivos como bits y luego debería ser capaz de escribir bits en el archivo de nuevo. ¿Hay alguna clase para este propósito?¿Cómo puedo leer/escribir bits de/en un archivo en Java?
Respuesta
Hasta donde yo sé, no existe una forma integrada de hacerlo directamente en el nivel de bit. Hay formas de leer/escribir byte por byte utilizando las transmisiones incorporadas. Podría escribir un contenedor en una secuencia que parece que lee y escribe bits.
Si desea algo que ya está escrito, busque proyectos de código abierto que hagan ciertos tipos de codificación de audio o video, ya que hay cosas como esas. Por ejemplo, el códec FLAC tenía un BitInputStream que podría satisfacer sus necesidades.
Estaba muy contento con la biblioteca colt del CERN. No puedo recordar si es compatible con File I/O, pero lo usé para leer bitstreams, analizarlos y modificarlos y volver a escribirlos en los archivos.
Preon podría ser lo que estás buscando. En cuanto a sus preguntas, podría imaginar que Preon podría ser incluso más de lo que está buscando.
Piense en Preon como una biblioteca que proporciona contenido codificado bitstream lo que Hibernate pretende ser para bases de datos relacionales, y JAXB para XML. Ahora, existe de un par de módulos. Uno de esos módulos es preun vinculante. Ese es el marco de enlace de datos real. (Impulsado por anotaciones).
Sin embargo, preon-binding está construido en la parte superior de preon-bitbuffer (en encarnaciones posteriores, se vuelve a doblar a preon-io). Esa biblioteca tiene el tipo de abstracción de BitBuffer para acceder a datos comprimidos de flujo de bits.
alt text http://preon.flotsam.nl/images/layers.png
La liberación Preon verano pasado no tiene soporte para la codificación todavía. Eso es trabajo en progreso.
Se traslada a https://github.com/jinahya/bit-io
favor, eche un vistazo a http://jinahya.googlecode.com/svn/trunk/com.googlecode.jinahya/bit-io/src/main/java/com/googlecode/jinahya/io/
<dependency>
<!-- resides in central repo -->
<groupId>com.googlecode.jinahya</groupId>
<artifactId>bit-io</artifactId>
<version>1.0-alpha-13</version>
</dependency>
Se trata de una pequeña biblioteca práctico para la lectura/escritura de longitud arbitraria de bits con Java.
final InputStream stream;
final BitInput input = new BitInput(new BitInput.StreamInput(stream));
final int b = input.readBoolean(); // reads a 1-bit boolean value
final int i = input.readUnsignedInt(3); // reads a 3-bit unsigned int
final long l = input.readLong(47); // reads a 47-bit signed long
input.align(1); // 8-bit byte align; padding
final WritableByteChannel channel;
final BitOutput output = new BitOutput(new BitOutput.ChannelOutput(channel));
output.writeBoolean(true); // writes a 1-bit boolean value
output.writeInt(17, 0x00); // writes a 17-bit signed int
output.writeUnsignedLong(54, 0x00L); // writes a 54-bit unsigned long
output.align(4); // 32-bit byte align; discarding
Y para darle una idea de cómo crear su propio contenedor de flujo, aquí está el fragmento de código.
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
public class BitInputStream extends FilterInputStream {
private int bitsBuffer = -1;
private int remainingBits = 0;
public BitInputStream(InputStream in) {
super(in);
}
@Override
public int read() throws IOException {
if (remainingBits == 0) {
bitsBuffer = in.read();
remainingBits = Byte.SIZE;
}
if (bitsBuffer == -1) {
return -1;
}
remainingBits--;
return (bitsBuffer >> remainingBits) & 1;
}
}
Como se puede ver el método read() se reemplaza para devolver 0 o 1 si un bit está disponible, o -1 si se alcanza el final de la secuencia subyacente.
import org.junit.Test;
import java.io.ByteArrayInputStream;
import static org.junit.Assert.assertEquals;
public class BitInputStreamTest {
@Test
public void read() throws Exception {
// 99 in two's complement binary form is 01100011
BitInputStream in = new BitInputStream(
new ByteArrayInputStream(new byte[]{99}));
assertEquals(0, in.read());
assertEquals(1, in.read());
assertEquals(1, in.read());
assertEquals(0, in.read());
assertEquals(0, in.read());
assertEquals(0, in.read());
assertEquals(1, in.read());
assertEquals(1, in.read());
assertEquals(-1, in.read());
}
}
- 1. ¿Cómo leer bits de un archivo?
- 2. ¿Cómo puedo obtener/configurar bits individuales en un flotador?
- 3. ¿Cómo puedo poner ejes en un archivo .png en java?
- 4. ¿Es posible leer/escribir bits de un archivo usando JAVA?
- 5. ¿Cómo puedo ejecutar un archivo .jar en java
- 6. ¿Cómo se lee un archivo en un mapa de bits de Java?
- 7. Usando Python ¿Cómo puedo leer los bits en un byte?
- 8. ¿Cómo puedo transformar un mapa de bits en un Uri?
- 9. ¿Cómo puedo convertir un archivo JAR en un archivo EXE?
- 10. En java, ¿cómo se escribe java.awt.image.BufferedImage en un archivo png de 8 bits?
- 11. Cómo importar un archivo .class en un archivo .java?
- 12. ¿Cómo declaro un entero de 32 bits en Java?
- 13. Java Trabajar con bits
- 14. ¿Cómo puedo invertir bits de un byte sin signo en Java?
- 15. ¿Cómo puedo representar un entero de 128 bits en Java o C++?
- 16. ¿Cómo puedo visualizar un archivo SVG en una aplicación .NET de 64 bits?
- 17. ¿Cómo puedo almacenar un archivo descargado con Java y Jersey?
- 18. ¿Cómo puedo crear un archivo PFX desde una Keystore Java?
- 19. ¿Cómo puedo determinar si un archivo es un archivo PDF?
- 20. ¿Cómo implementar un vector de bits (conjunto de bits) (en Java)?
- 21. ¿Puedo crear una máscara de bits de 1 a 64 bits sin condicional en Java?
- 22. ¿Cómo se almacena un vector <bool> o un conjunto de bits en un archivo, pero en bits?
- 23. Java Iterate Bits en Byte Array
- 24. ¿Cómo extraigo un archivo tar en Java?
- 25. Cómo crear un archivo exe en java
- 26. cómo descargar un archivo en java?
- 27. ¿Cómo puedo verificar si un binario compilado es de 32 bits o de 64 bits?
- 28. ¿Es un int. Java siempre 32 bits?
- 29. ¿Puedo cargar una DLL de 32 bits en un proceso de 64 bits en Windows?
- 30. ¿Cómo puedo escribir un GEOTIFF en Java?
+1 Estaba a punto de ir a buscar ese enlace cuando vi tu respuesta :) La manipulación de los bits de colt es bastante completa. Sin embargo, es posible que desee implementar un contenedor de flujo desde cero, ya que puede obtener un mejor rendimiento al cambiar repetidamente un largo y devolver el siguiente bit, en lugar de llamar repetidamente a BitVector.get (n) con colt. –