![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| xaoc2 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Репутация: нет Всего: нет |
Решил поизучать сегодня java.io.* и написать чтонибудь полезное. Взбрело в голову написать програмку которая делит файл на 2 часть а потом собирает из двух файлов один.
В листинге две программы одна для деления файла - другая для собирания. Внешне всё правильно - делит и собирает, фишка в том, что то что соберается по размеру всегда меньше, чем Исходный файл. Проверил в Beyond Compare : нехватает байтов в середине и конце. У кого какие мысли по етому поводу. Пробовал заменить BufferedInputStream-BufferedOutputStream на DataInputStream-DataOutputStream (и read()-write() на readByte()-writeByte()) - не помогает. Для деления файла на две части:
Для собирания файла из двух частей:
|
||||
|
|||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Но файл-то после этого нормальный? Вот у тебя зип - после сборки/разборки он анзипится?
-------------------- |
|||
|
||||
| xaoc2 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Репутация: нет Всего: нет |
Нет ни zip ни rar ничего, я специально выбрал зип чтобы делать тест Winrar, замечанее: если я не буду делить файл а просто прочитаю его и запишу в другой
то всё в порядке на 100%. Так выглядят колонки в Beyond Compare (Извините за абстракционизм)
Это сообщение отредактировал(а) xaoc2 - 29.12.2004, 23:53 |
|||
|
||||
| igon |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 1 Всего: 21 |
Попробуй после цикла записи добавить
bo1.flush() и bo2.flush() Да и close() хорошо бы делать Проверь, что возвращает skip() - то количество байтов, которое ты задал, или меньшее? Вообще-то, использование skip() вызывает сомнения - он разве отсчитывает от начала файла, а не от текущей позиции (которая у тебя меняется при каждом read())? Уточни пожалуйста: длина aaa.zip <> длина aaa_part1 + длина aaa_part2 после запуска Main или разница появляется после запуска main2 (относительно reconstr.zip)? Сразу будет ясно, в каком из двух классов собака порылась Кстати, BufferedInputStream тебе не дает в данном случае никаких преимуществ, т.к. идет ПОБАЙТОВОЕ считывание и запись (хотя для обучения сгодится) Вместо "настоящего" zip файла попробуй взять текстовый, содержащий короткую строку, например 123456789, сразу будет видно, что добавляется, а чего не хватает -------------------- Хотите поговорить об этом? |
|||
|
||||
| xaoc2 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Репутация: нет Всего: нет |
Учёл рекомендации, в первой программе за циклами "for" подабавлал
bo1.close(); bo2.close(); вообще убрал bi.skip(part1) так как он не нужен. Во второй программе за первым циклом добавил bout.flush(), а за вторым bout.close() и всё заработало. Почему, незнаю ведь виртуальная машина сама должна следить за такими мелочами. Если я правильно понял то файл лучше протягивать через буфер типа:
А разве BufferedInputStream не делает тоже самое? Это сообщение отредактировал(а) xaoc2 - 30.12.2004, 00:49 |
|||
|
||||
| igon |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 1 Всего: 21 |
Увы, нет! Закрывать открытые потоки должен программист, иначе их столько можно наплодить...
Твой bi1 разве не BufferedInputStream? Я использую такую конструкцию (in - типа BufferedInputStream, out - типа BufferedOutputStream, buf - byte[], block - константа)
-------------------- Хотите поговорить об этом? |
||||||
|
|||||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Кстати, эта ошибка обнаружилась бы на маленьком файле - наверняка обе части получились бы пустыми
-------------------- |
|||
|
||||
| igon |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 1 Всего: 21 |
Да, пожалуй. Хотя совершенно не представляю конкретный размер возможного незафиксированного кусочка потока. Если каждый последующий read()/write() фиксирует предыдущий, то в первоначальном варианте недоставать будет 2 байта - в середине и конце. -------------------- Хотите поговорить об этом? |
|||
|
||||
| xaoc2 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Репутация: нет Всего: нет |
Да 200 байт, без модификации обе части пустые.
|
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
512 байт -------------------- |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |