Vous pouvez utiliser le DeflatorOutputStream et InflatorInputStream. Ces deux utilisent la compression LZW. Vous pouvez simplement utiliser la bibliothèque qu'ils fournissent.
EDIT: la performance en temps Réel est généralement mesurée en termes de temps de latence, cependant, vous citez des chiffres en termes de throughtput. Pourriez-vous préciser ce que vous entendez par temps réel.
Pour la latence, à l'aide de la BEST_SPEED, chaque appel a eu 220 ns + 13 ns/octet en moyenne.
Remarque: dans une faible latence situations, vous obtenez souvent plusieurs fois le temps de latence que vous pourriez vous attendre lorsque le CPU est en cours d'exécution "à chaud". Vous devez effectuer la synchronisation dans une situation réaliste.
EDIT: C'est le taux de compression que j'ai obtenu avec Java 6 update 21;
Raw OutputStream.write() - 2485 MB/sec
Deflator.NO_COMPRESSION - 99 MB/s
Deflator.BEST_SPEED - 85 MB/s.
Deflator.FILTERED - 77 MB/s
Deflator.HUFFMAN_ONLY - 79 MB/s
Deflator.DEFAULT_COMPRESSION - 30 MB/s
Deflator.BEST_COMPRESSION - 14 MB/s
Note: je ne suis pas sûr de savoir pourquoi le paramètre par défaut est plus rapide que la "vitesse" de réglage. Je ne peux que supposer que l'ancien a été optimisé.
La taille de la mémoire tampon de sortie est de 4 ko, vous pouvez trouver une taille différente est la meilleure pour vous.
EDIT: Le code suivant imprime pour un grand fichier CSV. Le temps de latence est un bloc de 5 ko.
Average latency 48532 ns. Bandwidth 91.0 MB/s.
Average latency 52560 ns. Bandwidth 83.0 MB/s.
Average latency 47602 ns. Bandwidth 93.0 MB/s.
Average latency 51099 ns. Bandwidth 86.0 MB/s.
Average latency 47695 ns. Bandwidth 93.0 MB/s.
.
public class Main {
public static void main(String... args) throws IOException {
final String filename = args[0];
final File file = new File(filename);
DataInputStream dis = new DataInputStream(new FileInputStream(file));
byte[] bytes = new byte[(int) file.length()];
dis.readFully(bytes);
test(bytes, false);
for (int i = 0; i < 5; i++)
test(bytes, true);
}
private static void test(byte[] bytes, boolean print) throws IOException {
OutputStream out = new ByteOutputStream(bytes.length);
Deflater def = new Deflater(Deflator.BEST_SPEED);
DeflaterOutputStream dos = new DeflaterOutputStream(out, def, 4 * 1024);
long start = System.nanoTime();
int count = 0;
int size = 5 * 1024;
for (int i = 0; i < bytes.length - size; i += size, count++) {
dos.write(bytes, i, size);
dos.flush();
}
dos.close();
long time = System.nanoTime() - start;
long latency = time / count;
// 1 byte per ns = 1000 MB/s.
long bandwidth = (count * size * 1000L) / time;
if (print)
System.out.println("Average latency " + latency + " ns. Bandwidth " + bandwidth + " MB/s.");
}
}