Приложение б руководство пользователя
Программа предназначена для кодирования и декодирования файлов методом Хаффмана. Основная задача программы – это уменьшение размера файла.
При запуске, откроется главное меню, в котором необходимо выбрать действие:
архивация;
декодирование.
В правой части экрана находится кнопка «?», для предоставления справки о построении дерева Хаффмана. Выход из программы осуществляется нажатием на крестик в правом верхнем углу.
Пользователь может выбрать архивацию файла, после чего программа откроет проводник для выбора сжимаемого файла. Заархивированный файл будет сохранен под именем исходного с расширением «.kbk». В конце на экране будут отображены данные с информацией о размерах файлов:
размер исходного файла;
размер сжатого файла;
процент сжатия.
При выборе функции декодирования, программа откроет проводник для выбора файла и в конце выведет разархивированный файл.
Приложение В
ЭКРАННЫЕ ФОРМЫ
Рисунок В.1 – Исходный файл
Рисунок В.2 – Проводник для выбора файла
Рисунок В.3 – Результаты работы программы
Приложение Г
РЕЗУЛЬТАТ АРХИВАЦИИ
0000000000100010000010100001011100000000010001000001101000101000101101000100000000000100100011010110001101010000001111000010101101001001101011110100101101010001011000011000000100110111100000100100111001101110000110000111100011010111100101000000010011000111111100001100110111011110001111111001100001010111110010011000010001101010001001000110100101100011011001110011111001100101011100010000010110101100111110100100110111000011001101010011010001101011111101110001000010100000101010010110100101101011000100001010111101011000101010010001111101111010001001111110111100000001000001000001100011010110001101010000000011010111001111011010110011001100001010101001100100010110111000001000010101000110011110001101011001011011111000110110100010000001001101111001000001100001101100100111110011110100111011001111101110100010010010001010011111000110101000000101000010010111011100110100100111110010110111100110000101010100111001110100100110101101110010100010101001111000110101111101000011011110001011111010001001011000110111000011001111101000010011001010100011010100110110011000101101000011000011011111110001100100100000000110001101010000001111011111000101010100001011100001010101001110000010010111010100110111101111101111001011110000011000001111111110000111100011010100010101010011101000010010001011001101011010111101000011101100001101100110011011110111110000011001000011000000011110001101011111010000110111100100000110011101100101101111110111100111101101011001100110001101101111110000011111111110010001101011011110111111111010010111111000110000000101101111101110101100100111111010100010110111010110000110010000110000000000110001101011001101000010111010101000011011011111100111010111100111000001001001111111100110001101001011111001011101100111001111000110101111110111110110100001001010111110000111110101000010000101100001001011101011000101110101110011011111000011110001101010100101010100111000110111100111010001101111010000111011110000101011010010011010110111111100110111110100000101110111100100011010111101010101000001001001101111010111110101100101110111001010011101011100110111110000000110001101011001101011110011101010100111110101000111010010110011010010110011110000101010100101010011111001101001011011111011100010000101011101010011010001101011111110011100001010111110011000001010111111111110111000100001011001011111001101110100001101110011011100000000001000001000001100011010110011001001100001100111110101101001010001001001001010100101111011100000100110000110100110011100110100111000011111010100011101001011000011001111001100101100110011100011010100000000000111110100001001100101010001100011011001110011111010110001010011110011101010111010000101011011100010111101110000010100111110001101011001100010100110001100101100001100111110011000101101000010011001010010111101110000000111110111101000011011110001101111001110111100000110001101010001010101001100100010110011111001001101110000011001110011111001001101110100011101010110001101010001001000110100101100110001011010110001010010100010010010010110111001111110000011010110001000111100111010101001111000110101011001011000010010111101110011000101100111000100000101101110011111100000110011010010010011011101000111010101000001100011010110001101010000001111000010101101001001101011110100101101010001011000011000000100110111100000100100111001101110000110000111100011010101101011110000110011111010000111011101000101111101100101101010011011001100010110100001110110100110010011010000000000110001101011001101010010001101001011000110110011111001111001001101111000011111001101011110100100110111000011000011110001101010110001011010000100110010101110111101111100001100110000000010001100101010011101101000011111001111100011001110110100000100110000100011010111101101111000000001000110111010001011110111110111100100000100010110101110100010111100100000100001010100111100011010101001101110100011101010111010000111011011101111100010000100101111010010101000100101111111110011001111100111001111000110101111011011110101000101100001001011111000101101011101001011011111010000101011101001110011111011101101111000000001000110111010010100011010110000111011010001111100100000111101000000100010111010110001011011110001110111101100101010010110100001010010011111001110000011000110101100011010100000010110111110111100011110101000110000011010100110110100101100001101111110100110101111010111111101001101101000101101001001111000110101101000101100001111100001111101111011001001110001001000100000011000100001111111111001100111011010100000001111001110110010000001000001000001100011010100000011110111110001010101101110011010000110000110111111100011011101001011010010110011100010111110010010001011101001011010100110100011010100010111000100000111101100101101001101111001111011000100011111011110100001101111001000001100001101100101111011100000001111100001011100010000011110110010101001111|/О2/|000000000|/л27/|01000|/ь20/|100000|/г20/|101000|/а51/|0101|/ 131/|110|/Б1/|0000000010|/е58/|0010|/р30/|00001|/о79/|1011|/ц2/|000000100|/ 40/|10001|/
40/|10101|/Я4/|00000011|/т60/|0001|/й10/|1010010|/н46/|0110|/и35/|10010|/к25/|01001|/в24/|01110|/у30/|11100|/ю13/|001100|/,28/|00111|/м22/|01111|/д31/|11101|/я16/|111100|/:3/|100110000|/б14/|001101|/ы17/|100111|/-6/|10100110|/с33/|11111|/ч8/|1111010|/.15/|000001|/З1/|0000000011|/х3/|101001110|/!3/|101001111|/П2/|000000101|/з9/|1000010|/п9/|1000011|/ш8/|1111011|/Н2/|100110100|/ж4/|10011011|/Т2/|100110101|/И1/|1001100100|/"2/|100110011|/?1/|1001100101|/Е1/|1001100010|/щ1/|1001100011|/э3/|00000001
Приложение Д
ЛИСТИНГ ПРОГРАММЫ
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class huffman extends JFrame {
private JTextField textField;
public huffman() {
super("Архивация методом Хаффмана");
createGUI();
}
public void createGUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel = new JPanel();
panel.setLayout(null);
JLabel k = new JLabel ("Выберите действие:");
k.setBounds(35,25,200,30);
panel.add(k);
JButton button1 = new JButton("Архивация файла");
button1.setBounds(30, 80, 200, 40);
panel.add(button1);
JButton button2 = new JButton("Декодирование файла");
button2.setBounds(265, 80, 200, 40);
panel.add(button2);
JButton button3 = new JButton("?");
button3.setBounds(420, 160, 45, 35);
panel.add(button3);
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileopen = new JFileChooser();
int ret = fileopen.showDialog(null, "Открыть файл");
if (ret == JFileChooser.APPROVE_OPTION) {
File file = fileopen.getSelectedFile();
String label;
label = file.getName();
float[] sum = Archiver(label);
JLabel k = new JLabel ("Вес исходного файла: " +String.valueOf(sum[0]));
k.setBounds(35,210,300,30);
panel.add(k);
k = new JLabel ("Вес сжатого файла: " +String.valueOf(sum[1]));
k.setBounds(35,230,300,30);
panel.add(k);
k = new JLabel ("Сжатие в " +String.valueOf(100-100*sum[1]/sum[0]) +"%");
k.setBounds(35,250,300,30);
panel.add(k);
}
}
});
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileopen = new JFileChooser();
int ret = fileopen.showDialog(null, "Открыть файл");
if (ret == JFileChooser.APPROVE_OPTION) {
File file = fileopen.getSelectedFile();
String label;
label = file.getName();
UnArchiver(label);
}
}
});
button3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
InFile("Huffmanручнойпросчет.doc");
}
});
getContentPane().add(panel);
setPreferredSize(new Dimension(500, 350));
}
public class TestActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
textField.setText(e.getActionCommand());
}
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
huffman frame = new huffman();
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
// Архивация файла
public static float[] Archiver(String file)
{
int i = 0, j = 0;
float []sum = {0, 0};
ArrayList<Character> chars = new ArrayList();
ArrayList<String> a = new ArrayList <String>();
ArrayList< Integer > b = new ArrayList< Integer >();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(new File(file)));
int c;
while ((c = reader.read()) != -1) {
chars.add((char) c);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
sum[0] = chars.size()*8;
for(i=0; i<chars.size(); i++)
{
a.add(String.valueOf(chars.get(i)));
}
for(i=0; i<a.size(); i++)
{
b.add(1);
for(j = i+1; j<a.size(); j++)
{
if(a.get(i).equals(a.get(j)))
{
b.set(i, b.get(i)+1);
a.remove(j);
j--;
}
}
}
String [][]mas = new String [a.size()+1][a.size()+1];
int [][]mas1 = new int [a.size()+1][a.size()+1];
int size1=a.size();
for(i=0; i<size1; i++)
{
mas[0][i] = String.valueOf(a.get(i));
mas1[0][i] = b.get(i);
mas[1][i] = String.valueOf(a.get(i));
mas1[1][i] = b.get(i);
}
int size2 = size1;
for (i=2; i<size1+1; i++)
{
Mas1(mas1[i-1], mas[i-1], size2);
for(j=0; j<size2-1; j++)
{
mas[i][j] = String.valueOf(mas[i-1][j]);
mas1[i][j] = mas1[i-1][j];
}
size2--;
}
size2 = size1;
/*for(i=0; i<size1; i++)
{
for(j=0; j<size2; j++)
{
System.out.print(" " +mas[i][j]);
}
size2--;
// System.out.println();
}*/
String []dz; //двоичный код символа
dz = new String[chars.size()];
String []fgh; //динамический массив а в статическом виде
fgh = new String[chars.size()];
for(i=0; i<size1; i++)
{
fgh[i] = String.valueOf(a.get(i));
}
for(i=0; i<size1; i++)
{
Coding(dz, fgh, mas, size1);
}
String nfile = "";
nfile = Name(file)+".kbk";
try
{
PrintWriter pw = new PrintWriter(new File(nfile));
for(i=0; i<chars.size(); i++)
{
for(j=0; j<size1; j++)
{
if(String.valueOf(chars.get(i)).equals(a.get(j)))
{
byte rg;
for(int k = 0; k<dz[j].length(); k++)
{
rg = 0;
rg = Byte.parseByte( String.valueOf(dz[j].charAt(k)) );
pw.print(rg);
}
sum[1] = sum[1] + dz[j].length();
}
}
}
sum[1] = sum[1] + a.size()*8;
for(i=0; i<size1; i++)
{
pw.print("|/" +a.get(i));
byte hj;
for(int k = 0; k<String.valueOf(b.get(i)).length(); k++)
{
hj = 0;
hj = Byte.parseByte(String.valueOf((String.valueOf(b.get(i)).charAt(k))));
pw.print((byte) hj);
sum[1] += 1;
}
pw.print("/|");
byte rg;
for(int k = 0; k<dz[i].length(); k++)
{
rg = 0;
rg = Byte.parseByte( String.valueOf(dz[i].charAt(k)) );
pw.print((byte)rg);
}
}
pw.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return sum;
}
// Декодирование файла
public static void UnArchiver(String file)
{
int i = 0, j = 0, k = 0, g = 0, n = 0;
ArrayList<Character> chars = new ArrayList();
ArrayList<String> a = new ArrayList <String>();
ArrayList<String> d = new ArrayList <String>();
ArrayList<String> r = new ArrayList <String>();
ArrayList< Integer > b = new ArrayList< Integer >();
BufferedReader reader1 = null;
try {
reader1 = new BufferedReader(new FileReader(new File(file)));
int c;
while ((c = reader1.read()) != -1) {
chars.add((char) c);
}
reader1.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader1 != null) {
try {
reader1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
i=0;
String str = new String();
str = "";
while(chars.get(i)=='0'||chars.get(i)=='1')
{
str+=String.valueOf(chars.get(i));
i++;
}
i += 2;
j = 0;
g = 0;
k = 0;
n = chars.size();
a.add(String.valueOf(chars.get(i)));
j++; i++;
while(i!=n-1)
{
if((chars.get(i)>= '0' && chars.get(i) <= '9'))
{
d.add("");
b.add(0);
while((chars.get(i)>= '0' && chars.get(i) <= '9'))
{
d.set(g, d.get(g)+String.valueOf(chars.get(i)));
b.set(g, Integer.parseInt(d.get(g)));
if (i!=n-1)
i++;
}
g++;
}
else
{
if(chars.get(i)=='/')
{i++;
if(chars.get(i)=='|')
{
if (i!=n-1)
i++;
r.add("");
while((chars.get(i)== '0' || chars.get(i) == '1'))
{
r.set(k, r.get(k)+String.valueOf(chars.get(i)));
if (i!=n-1)
i++;
else break;
}
k++;
}
}
else
{
if(chars.get(i)=='|')
{
i++;
if(chars.get(i)=='/')
{
if (i!=n-1)
i++;
a.add(String.valueOf(chars.get(i)));
if (i!=n-1)
i++;
}
}
}
}
}
/*System.out.println();
System.out.println();
System.out.print(" " +a);
System.out.print(" " +b);
System.out.println(" " +r);*/
String wer = new String();
String str1 = new String();
str1 = "";
while(str.length()>0)
{
for(i=0; i<a.size(); i++)
{
wer = "";
wer = r.get(i);
if(str.startsWith(wer)==true)
{
b.set(i, b.get(i)-1);
str1 += a.get(i);
str = new StringBuffer(str).
delete(0, wer.length()).toString();
}
else
{
for(j=0; j<i; j++)
{
if(b.get(j)!=0)
{
wer = r.get(j);
if(str.startsWith(wer)==true)
{
b.set(j, b.get(j)-1);
str1 += a.get(j);
str = new StringBuffer(str).
delete(0, wer.length()).toString();
}
}
}
}
}
}
String nfile = Name(file)+".txt";
try
{
PrintWriter pw = new PrintWriter(new File(nfile));
pw.print(str1);
pw.close();
}
catch(Exception e)
{
e.printStackTrace();
}
InFile(nfile);
}
// Построение дерева Хаффмана
public static void Mas1(int y[], String x[], int n)
{
int min = 0, min1 = 0, i, j;
String k, k1;
String []w;
int []w1;
w = new String [n];
w1 = new int [n];
min = y[0]; k = String.valueOf(x[0]);
min1 = y[1]; k1 = String.valueOf(x[1]);
for (i=1; i<n; i++)
{
if(min>y[i])
{
min1 = min; k1 = String.valueOf(k);
min = y[i]; k = String.valueOf(x[i]);
}
else
{
if(min1>y[i])
{
min1 = y[i]; k1 = String.valueOf(x[i]);
}
}
}
for(i=0; i<n; i++)
{
if(x[i]==k)
{
w[i]=k+k1;
w1[i]=min+min1;
for(j=i+1; j<n; j++)
{
if(x[j]==k1)
{
for(int g=j+1; g<n; g++)
{
w[j] = String.valueOf(x[g]);
w1[j] = y[g];
j++;
}
}
else
{
w[j] = String.valueOf(x[j]);
w1[j] = y[j];
}
}
break;
}
else
{
if(x[i]==k1)
{
w[i]=k1+k;
w1[i]=min1+min;
for(j=i+1; j<n; j++)
{
if(x[j]==k)
{
for(int g=j+1; g<n; g++)
{
w[j] = String.valueOf(x[g]);
w1[j] = y[g];
j++;
}
break;
}
else
{
w[j] = String.valueOf(x[j]);
w1[j] = y[j];
}
}
break;
}
else
{
w[i] = String.valueOf(x[i]);
w1[i] = y[i];
}
}
}
for(i=0; i<n-1; i++)
{
x[i] = String.valueOf(w[i]);
y[i] = w1[i];
}
}
// Кодирование текста
public static void Coding(String dz[], String a[], String mas[][], int n)
{
int i, j, g, z, q, f;
outer:
for(i=0; i<n; i++)
{
dz[i]="";
z = 1;
outer1:
for(j=n-2; j>-1; j--)
{
z++;
f = 0;
for(g=0; g<z-1;g++)
{
if(mas[j+1][g].indexOf(a[i]) != -1)
{
for(q=0; q<z; q++)
{
if(mas[j+1][g].indexOf(mas[j][q]) != -1)
{
if(mas[j][q].indexOf(a[i]) != -1)
{
if(mas[j][q]==mas[j+1][g])
{
if(a[i]==mas[j][q])
{
continue outer;
}
else
continue outer1;
}
else
{
if(f==1)
{
dz[i] += "1";
continue outer1;
}
else
{
dz[i] += "0";
continue outer1;
}
}
}
else
{
f = 1;
}
}
}
}
}
}
}
}
public static void InFile(String file)
{
Desktop desktop = null;
if (Desktop.isDesktopSupported())
{
desktop = Desktop.getDesktop();
}
try {
desktop.open(new File(file));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
public static String Name(String file)
{
int k = 0;
String nfile;
k = file.lastIndexOf(".");
nfile = file.substring(0, k);
return nfile;
}
}
