|  20.12.2014 / 13:54 |  | 
| ДубоХирург    Пользователь 
  Сейчас: Offline 
 Имя: СергейОткуда: Где-то возле Москвы
 Регистрация: 01.07.2012
 
 | Kalter,  симулятор
 Изменено ДубоХирург (20.12 / 13:55) (всего 1 раз)
 | 
|  23.12.2014 / 19:23 |  | 
| RblSb    Пользователь 
  Сейчас: Offline 
 Регистрация: 25.07.2011
 | У кого нибудь есть реализация RLE-сжатия? И насчет этой статьи , я не понял, на выходе после расшифровки/шифровки получается измененный поток? | 
|  23.12.2014 / 19:35 |  | 
| vl@volk    Пользователь 
  Сейчас: Offline 
 Имя: ВладиславОткуда: Земля
 Регистрация: 26.12.2012
 
 | RblSb,  Поищи в файлах темы, я там разные варианты делал__________________
 
   знает толк | 
|  23.12.2014 / 20:03 |  | 
| aNNiMON   Супервизор 
  Сейчас: Offline 
 Имя: ВитёкРегистрация: 11.01.2010
 
 | RblSb, да, на выходе изменённый.__________________
 
   let live | 
|  25.12.2014 / 02:31 |  | 
| RblSb    Пользователь 
  Сейчас: Offline 
 Регистрация: 25.07.2011
 | aNNiMON, rle туда видимо не прилепить, придется грузить все в массив байт
 | 
|  25.12.2014 / 09:05 |  | 
| Naik    Пользователь 
  Сейчас: Offline 
 Имя: %name%Регистрация: 14.03.2010
 
 | RblSb,  если я правильно понимаю о чем ты, то прикрутить очень просто. При записи записываешь байт, и запоминаешь его, если потом приходит такой же, то увеличиваешь счетчик, если другой, то пишешь счетчик и этот новый. В flush просто птшешь счетчик. При чтении по аналогии.
 Изменено Naik (25.12 / 09:08) (всего 1 раз)
 | 
|  25.12.2014 / 09:56 |  | 
| RblSb    Пользователь 
  Сейчас: Offline 
 Регистрация: 25.07.2011
 | Насчет алгоритма понятно, но как прочитать байт в inputstream и чтобы там благодаря собственному потоку оказалось два байта - не понял. Примеры в статье только для шифрования туда-обратно и годятся. Зачем нужен flush()?
 | 
|  25.12.2014 / 10:05 |  | 
| aNNiMON   Супервизор 
  Сейчас: Offline 
 Имя: ВитёкРегистрация: 11.01.2010
 
 | RblSb,  посмотри библиотеку net.sf.zipme, там ZipInputStream, ZipOutputStream и для Gzip тоже. Так что можно и для сжатия делать.__________________В GzipInputStream есть только метод read(byte[] buf, int offset, int length), его за глаза хватит, readByte не нужен по сути.
 
 
   let liveИзменено aNNiMON (25.12 / 10:11) (всего 1 раз)
 | 
|  25.12.2014 / 10:06 |  | 
| vl@volk    Пользователь 
  Сейчас: Offline 
 Имя: ВладиславОткуда: Земля
 Регистрация: 26.12.2012
 
 | flush() дописывает оставвшиеся байты из буфера в файл__________________
 
   знает толк | 
|  25.12.2014 / 12:03 |  | 
| Naik    Пользователь 
  Сейчас: Offline 
 Имя: %name%Регистрация: 14.03.2010
 
 | Цитата RblSb:Насчет алгоритма понятно, но как прочитать байт в inputstream и чтобы там благодаря собственному потоку оказалось два байта - не понял. Примеры в статье только для шифрования туда-обратно и годятся. З
 Как-то так (не проверял) Открыть спойлер Закрыть спойлер package ua.naiksoftware.io; import java.io.DataOutputStream;import java.io.IOException;import java.io.OutputStream; /** * http://uk.wikipedia.org/wiki/RLE * @author Naik */public class RleOutputStream extends OutputStream {     private long count;    private int current;    private final DataOutputStream out;     public RleOutputStream(OutputStream out) {        this.out = new DataOutputStream(out);        count = 0;    }     @Override    public void write(int b) throws IOException {        if (b == current) {            count++;        } else {            if (count != 0) {                out.write(current);                out.writeLong(count);            }            current = b;            count = 1;        }    }     @Override    public void flush() throws IOException {        if (count != 0) {            out.write(current);            out.writeLong(count);        }        out.flush();        super.flush();// не знаю, нужен вызов метода суперкласса или нет..    } }
Открыть спойлер Закрыть спойлер package ua.naiksoftware.io; import java.io.DataInputStream;import java.io.IOException;import java.io.InputStream; /** * http://uk.wikipedia.org/wiki/RLE * @author Naik */public class RleInputStream extends InputStream {     private long count;    private int current;    private final DataInputStream input;     public RleInputStream(InputStream input) {        this.input = new DataInputStream(input);    }     @Override    public int read() throws IOException {        if (count < 1) {            current = input.read();            count = input.readLong();        }        count--;        return current;    } }
 |