BITŲ PAKAVIMO KODAS

BitInputStream.java failas:import java.io.*;

public class BitInputStream extends ByteArrayInputStream { private int bitsRead; private int bitPosition; private int currentByte; private int myMark; private final static int NUM_BITS_IN_BYTE = 8; private final static int END_POSITION = -1; private boolean readingStarted;

/** * Create a BitInputStream for a File on disk. */

public BitInputStream( byte[] buf ) throws IOException { super( buf );

myMark = 0; bitsRead = 0; bitPosition = NUM_BITS_IN_BYTE-1; currentByte = 0; readingStarted = false; }

/** * Read a binary “1” or “0” from the File. */

public int readBit() throws IOException { int theBit = -1;

if( bitPosition == END_POSITION || !readingStarted ) { currentByte = super.read(); bitPosition = NUM_BITS_IN_BYTE-1; readingStarted = true; }

theBit = (0x01 << bitPosition) & currentByte; bitPosition–;

if( theBit > 0 ) { theBit = 1; }

return( theBit ); }

/** * Return the next byte in the File as lowest 8 bits of int. */

public int read() { currentByte = super.read(); bitPosition = END_POSITION; readingStarted = true;

return( currentByte ); }

/** * */

public void mark( int readAheadLimit ) { super.mark(readAheadLimit); myMark = bitPosition; }

/** * Add needed functionality to super’s reset() method. Reset to * the last valid position marked in the input stream. */

public void reset() { super.pos = super.mark-1; currentByte = super.read(); bitPosition = myMark; }

/** * Returns the number of bits still available to be read. */

public int availableBits() throws IOException { return( ((super.available() * 8) + (bitPosition + 1)) ); }}

BitOutputStream.java failas:import java.io.*;import java.lang.Exception;

public class BitOutputStream extends ByteArrayOutputStream { private FileOutputStream myFileOS; private int bitsWritten; private int bitPosition; private byte[] myByte; private final static int NUM_BITS_IN_BYTE = 8; private final static int END_POSITION = -1;

/** * Default constructor. */

public BitOutputStream() { this(null); }

/** * Constuct based upon a FileOutputSteam to write to */

public BitOutputStream( FileOutputStream fos ) { super();

myFileOS = fos; bitsWritten = 0; myByte = new byte[1];

resetByte(); }

/** * Reset the byte and position marker. */

private void resetByte() { bitPosition = NUM_BITS_IN_BYTE-1; myByte[0] = (byte)0x00; }

/** * Write to my super’s buffer. */

private void flushByte() { write( myByte, 0, 1 ); bitsWritten = bitsWritten + 8; resetByte(); }

/** * Write a bit to the stream.

* If bit == “0”, writes a ‘0’ bit. * If bit == “1”, writes a ‘1’ bit. */

public void writeBit( int bit ) { if( bit != 0 && bit != 1 ) { System.err.println( “: only 1’s and 0’s can be written” ); }

if( bitPosition == END_POSITION ) { flushByte(); }

if( bit == 0 ) { bitPosition–; } else if( bit == 1 ) { myByte[0] = (byte)(myByte[0] | (0x01 << bitPosition)); bitPosition–; } }

/** * Writes to the file if a FileOutputStream is set. */

public void flushToFile() { if( myFileOS == null ) { System.err.println( “No FileOutputStream set” ); } else { try { // Flush any excess to my super’s buffer if( bitPosition >= END_POSITION && bitPosition != NUM_BITS_IN_BYTE-1 ) { flushByte(); }

// Have my super write to the File writeTo( (OutputStream)myFileOS ); } catch( Exception e ) { System.err.println(“: error flushing to file”); e.printStackTrace(); } } }

/** * Close the stream. */

public void closeStream() throws Exception { try { super.close(); } catch( Exception e ) { System.err.println(“: error while closing”); e.printStackTrace(); throw( new Exception( “: error closing stream” )); } }}

Bitpack.java failas. Sitas failas yra pagrindinis:

import java.io.*;import java.util.*;import java.lang.*;

public class Bitpack {//———————- Stream’ai ———————————————-public static FileInputStream inFile;public static FileOutputStream outFile;public static BitOutputStream outBit;public static BitInputStream inBit;//———————– Masyvai ————————————————public static int[][] CodeTable; public static char[] charr = new char[128]; public static int[] CoutSmb = new int[256];//——————— Kintamieji ————————————————public static int kiek=0;public static int buf=0;public static int count=0;public static int failoIlgis=0;

//8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888//8888888888888888888888888888888888888 FUNKCIJOS 888888888888888888888888888888888888//8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888

//——————————————————————————-public static void clear(){ for (int i = 0; i < 50; i++) System.out.println(); }//——————————————————————————-public static int minBit(int differentCase) { if(differentCase == 1) return 1; else return (int)Math.ceil(Math.log(differentCase)/Math.log(2));}//——————————————————————————-public static int Till(int failoilgis, int usefullBit) { if(usefullBit == 0) { return failoIlgis*8; } else { return (failoIlgis – 1)*8 + usefullBit; }}//——————————————————————————–public static int usefullBit(int kiek, int bitu) throws IOException { return (bitu*kiek) % 8;}//——————————————————————————–public static void CodeTable(int co,int rei){ CodeTable = new int[co][rei]; int divisor = 2;

for (int j = rei – 1; j >= 0; j–) { for (int i = 0; i < co; i++)

{ if ((i % divisor) < (divisor / 2)) CodeTable[i][j] = 0; else CodeTable[i][j] = 1; } divisor *= 2; }}//——————————————————————————–public static int skirtinguSimb() throws IOException { int count1=0; int ind=0; Arrays.fill(CoutSmb, 0); int b=inFile.read();

while(b>0) { CoutSmb[b]++; b=inFile.read(); } inFile.close();

for(int i=0; i<256; i++) { if(CoutSmb[i]!=0) ++count1; }

if(count1>127) throw new IOException(“Nenaudinga spausti sito failo, nes jame rasta “+count1+” skirtingu simboliu”); if(count1==0) throw new IOException(“Sito failo nereikia spausti, jis tuscias!!!”); return count1;}//———————————————————————————public static float entrop(String argument)throws IOException{ inFile = new FileInputStream(argument); float[] P = new float[count]; Arrays.fill(P, 0); int t = inFile.read(); while(t>0) { for(int i=0; i0) { for(int i=0; i 0) { for (int i = 0; i < reikia; i++) { s = s + inBit.readBit(); } for (int i = 0; i < count; i++) { if (s.equals(Compare[i])) { outFile.write(charr[i]); } } s = “”; end = end – reikia; } clear(); System.out.println(” INFORMACIJA ISPAKUOJANT………………nn”); System.out.println(“—————————————————————————-“); System.out.println(“|Faile yra skirtingu simboliu: | ” +count); System.out.println(“—————————————————————————-“); System.out.println(“|Failo dydis (baitais): | ” +failoIlgisFirst); System.out.println(“—————————————————————————–“); System.out.println(“|Vienam simboliui kuoduoti reikejo (bitai): | ” +minBit(count)); System.out.println(“—————————————————————————–“); }//———————————- MaiN’as————————————————-//———————————- MaiN’as————————————————-//———————————- MaiN’as————————————————- public static void main(String[] args) throws IOException { try{ boolean tikrinti=true; BufferedReader userIn =new BufferedReader(new InputStreamReader( System.in ) ); while (tikrinti==true) { clear(); System.out.println(“KA NORITE DARYTI(zip/unzip):”); String line = userIn.readLine();

if (line.compareToIgnoreCase(“zip”)==0) { clear(); System.out.println(“IVESKITE IVEDIMO FAILA (in) :”); line = userIn.readLine(); inFile = new FileInputStream(line); clear(); System.out.println(“IVESKITE ISVEDIMO FAILA (out):”); String line2 = userIn.readLine(); outFile = new FileOutputStream(line2); Suspausti(minBit(RBKBABC()),line); inFile.close(); outFile.close(); System.out.println(” nn FAILAS: ‘”+line+”‘ SEKMINGAI SUPAKUOTAS…”); tikrinti=false;

} else if (line.compareToIgnoreCase(“unzip”)==0) { clear(); System.out.println(“IVESKITE IVEDIMO FAILA (in) :”);

line = userIn.readLine(); inFile = new FileInputStream(line); clear(); System.out.println(“IVESKITE ISVEDIMO FAILA (out):”); String line2 = userIn.readLine(); outFile = new FileOutputStream(line2); Isspausti(line,line2); System.out.println(” nn FAILAS: ‘”+line+”‘ SEKMINGAI ISPAKUOTAS…”); inFile.close(); outFile.close(); tikrinti=false; } else if(line.compareToIgnoreCase(“exit”)==0) { clear(); tikrinti=false; System.out.println(” IKI!!!”); line = userIn.readLine(); } else { clear(); System.out.println(” Veskite ka norite daryti, pvz.: ‘zip’ arba ‘unzip’n … tada sekite nurodymus…nnn”); System.out.println(” ————————————–“); System.out.println(” | JEI NORITE BAIGTI VESKITE ‘exit’ |”); System.out.println(” ————————————–“); line = userIn.readLine(); } } } catch(IOException ioe) {System.out.println(“Klaida: “+ioe.getMessage());} }}