import java.io.*; import java.util.*; import java.lang.reflect.*; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class test { private static File file1 = new File("test.txt"); private static File file2 = new File("test1.txt"); private static File file3 = new File("test2.txt"); public static void main(String[] args) { try { DataInputStream dataInputStream1 = new DataInputStream(new BufferedInputStream(new FileInputStream(file1))); DataOutputStream dataOutputStream1 = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file2))); compress(dataInputStream1, dataOutputStream1); dataOutputStream1.flush(); dataOutputStream1.close(); DataInputStream dataInputStream2 = new DataInputStream(new BufferedInputStream(new FileInputStream(file2))); DataOutputStream dataOutputStream2 = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file3))); uncompress(dataInputStream2, dataOutputStream2); dataOutputStream2.flush(); dataOutputStream2.close(); } catch (Exception e) { System.out.println(e.toString()); } } public static void compress(DataInputStream dataInputStream, DataOutputStream dataOutputStream) { boolean eof = false; byte readedByte = 0; byte lastReadedByte = 0; try { readedByte = dataInputStream.readByte(); } catch (EOFException e) { return; } catch (IOException e) { return; } int nbChar = 1; while (eof == false) { try { lastReadedByte = readedByte; readedByte = dataInputStream.readByte(); if (lastReadedByte == readedByte) { nbChar++; if (nbChar < 127) continue; dataOutputStream.writeByte(127); dataOutputStream.writeByte(nbChar); dataOutputStream.writeByte(lastReadedByte); nbChar = 0; continue; } else if (lastReadedByte == 127 && nbChar <= 3) { dataOutputStream.writeByte(127); dataOutputStream.writeByte(nbChar); } else if (nbChar == 1) { dataOutputStream.writeByte(lastReadedByte); } else if (nbChar == 2) { dataOutputStream.writeByte(lastReadedByte); dataOutputStream.writeByte(lastReadedByte); } else if (nbChar == 3) { dataOutputStream.writeByte(lastReadedByte); dataOutputStream.writeByte(lastReadedByte); dataOutputStream.writeByte(lastReadedByte); } else { dataOutputStream.writeByte(127); dataOutputStream.writeByte(nbChar); dataOutputStream.writeByte(lastReadedByte); } nbChar = 1; } catch (EOFException eof1) { eof = true; } catch (Exception e) { System.out.println(e.toString()); return; } } try { if (readedByte == 127 && nbChar <= 3) { dataOutputStream.writeByte(readedByte); dataOutputStream.writeByte(nbChar); } else if (nbChar == 1) { dataOutputStream.writeByte(readedByte); } else if (nbChar == 2) { dataOutputStream.writeByte(readedByte); dataOutputStream.writeByte(readedByte); } else if (nbChar == 3) { dataOutputStream.writeByte(readedByte); dataOutputStream.writeByte(readedByte); dataOutputStream.writeByte(readedByte); } else { dataOutputStream.writeByte(127); dataOutputStream.writeByte(nbChar); dataOutputStream.writeByte(readedByte); } } catch (Exception e) { System.out.println(e.toString()); } } public static void uncompress(DataInputStream dataInputStream, DataOutputStream dataOutputStream) { boolean eof = false; byte readedByte = 0; byte byte1; int nbChar; int i; while (eof == false) { try { readedByte = dataInputStream.readByte(); if (readedByte != 127) { dataOutputStream.writeByte(readedByte); } else { nbChar = dataInputStream.readByte(); if (nbChar == 1) { dataOutputStream.writeByte(127); } else if (nbChar == 2) { dataOutputStream.writeByte(127); dataOutputStream.writeByte(127); } else if (nbChar == 3) { dataOutputStream.writeByte(127); dataOutputStream.writeByte(127); dataOutputStream.writeByte(127); } else { byte1 = dataInputStream.readByte(); for (i = 0 ; i < nbChar ; i++) { dataOutputStream.writeByte(byte1); } } } } catch (EOFException eof1) { eof = true; } catch (Exception e) { System.out.println(e.toString()); return; } } } }