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;
}
}
}
}

