Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зипованный файл битым прилетает.. как кодировка в паре символов ломается.. 
V
    Опции темы
Proger10
Дата 22.3.2009, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



С сервера кидаю бинарный файл на клиент. Всё через сокеты. Файл предварительно гзипую.
Серверный код:
Код
try {

    String line;
    GZIPOutputStream zip = new GZIPOutputStream( socket.getOutputStream() );
    BufferedReader bis = new BufferedReader( new FileReader( "etalon-file.png" ) );
    int i = 0;
    while ( true ) {

        try {
            line = bis.readLine();
            if ( line == null )
                break;
            if ( i > 0 ) {
                line = "\n" + line;
            }
            zip.write( line.getBytes(), 0, line.length() );
            i++;
        } catch ( Exception e ) {
            break;
        }

    }

}


приём у клиента:
Код
try {

    int length;
    int sChunk = 8192;
    GZIPInputStream zip = new GZIPInputStream( socket.getInputStream() );
    FileOutputStream out = new FileOutputStream( "test.png" );

    byte[] buffer = new byte[ sChunk ];

    while ( ( length = zip.read( buffer, 0, sChunk ) ) != -1 ) {
        out.write( buffer, 0, length );
    }

    out.close();
    zip.close();

} catch ( IOException e ) {
}


Код
ls -la
-rw-r--r-- 1 user user 26846 Мар 22 01:27 etalon-file.png
-rw-r--r-- 1 user user 26845 Мар 22 01:33 test.png


вот чёрт побери.. один байт решает. 26845 - это размер файла в байтах.
Не пойму, в чём может быть дело??
Визуально смотрю - всё почти тоже самое. Только в одном файле два символа - вопросы, а в битом файле test.png почему-то эти символы в виде вопроса в ромбике smile визуально больше отличий нет, кол-во строк одинаковое...

Не подскажите ли в чём моя ошибка??

Это сообщение отредактировал(а) Proger10 - 22.3.2009, 02:22
PM MAIL   Вверх
Proger10
Дата 22.3.2009, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Может потоки (/сокеты) как-то подготовить особо надо, чтобы передавать?

Всё же 1 байт разницы это в чём-то таком дело.. либо типы неправильные использую, либо ещё какая-то несовместимость.. Либо действительно у меня в программе ошибка. Но вряд ли, всё-таки файл приходит почти такой же.. тока битый smile

Причём меньше именно полученный файл. Вот больше объёмы:
Код
-rw-r--r-- 1 user user 97733 Мар 22 02:21 received-file.png
-rw-r--r-- 1 user user 97736 Мар 22 02:21 etalon-file.png

Видите, терь 3 байта сэкономили.. smile Добавлено: точнее, 3 байта экономим когда sChunk = 50000, а вот когда он равен 8192, тогда снова 1 байт пропадает:
Код
ls -la
-rw-r--r-- 1 user user 130662 Мар 22 02:34 received-file.png
-rw-r--r-- 1 user user 130663 Мар 22 02:34 screen-1.png

Господа гуры, предположите хоть что-нибудь! smile

Это сообщение отредактировал(а) Proger10 - 22.3.2009, 02:42
PM MAIL   Вверх
Proger10
Дата 22.3.2009, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Заменил у клиента вот на такое:
Код
while ( ( length = zip.read( buffer, 0, 1 ) ) > -1 ) {

вместо sChunk поставил еденицу - работает абсолютно аналогично. Опять 1 байт теряется. То, что он аналогично работает, это нормально? smile
PM MAIL   Вверх
qwertovsky
  Дата 22.3.2009, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.3.2009

Репутация: нет
Всего: нет



Насколько я сталкивался, в архивы получалось писать только блоками по 8Киб.
Как ты так странно с файлом двоичным - построчно, да еще и перенос строки сам добавляешь?
PM MAIL   Вверх
Proger10
Дата 22.3.2009, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Цитата
Как ты так странно с файлом двоичным - построчно, да еще и перенос строки сам добавляешь?

Я чё-то и сам не подумал!! smile Спать уже наверное пора.
Дал я маху.. Да и Ридеры/Райтеры не работают с бинарными данными.

Проблема решена!

На всякий случай, привожу работающий код сервера - пользуйтесь кому надо! smile
Код
try{

    String line;
    GZIPOutputStream zip = new GZIPOutputStream( s.getOutputStream() );
    FileInputStream fis = new FileInputStream( "etalon-file.png" );

    int c;
    while( ( c = fis.read() ) != -1 ) {
        zip.write( c );
    }

    zip.finish();
    zip.close();

} catch ( IOException e ) {
}



Это сообщение отредактировал(а) Proger10 - 22.3.2009, 03:00
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0967 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.