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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Делю файл и собираю. ШАЙТАН! 
:(
    Опции темы
xaoc2
Дата 29.12.2004, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Решил поизучать сегодня java.io.* и написать чтонибудь полезное. Взбрело в голову написать програмку которая делит файл на 2 часть а потом собирает из двух файлов один.
В листинге две программы одна для деления файла - другая для собирания. Внешне всё правильно - делит и собирает, фишка в том, что то что соберается по размеру
всегда меньше, чем Исходный файл. Проверил в Beyond Compare : нехватает байтов в середине и конце. У кого какие мысли по етому поводу.
Пробовал заменить BufferedInputStream-BufferedOutputStream на DataInputStream-DataOutputStream (и read()-write() на readByte()-writeByte()) - не помогает.
Для деления файла на две части:
Код

package mypackage;
import java.io.*;
public class Main {
 public Main() {
 }

 public static void main(String[] args) {
   File from = new File("c:\\#\\aaa.zip");
   File to1 = new File("c:\\#\\aaa_part1");
   File to2 = new File("c:\\#\\aaa_part2");

   try {
     BufferedInputStream bi = new BufferedInputStream(new FileInputStream(from));
     BufferedOutputStream bo1 = new BufferedOutputStream(new FileOutputStream(to1));
     BufferedOutputStream bo2 = new BufferedOutputStream(new FileOutputStream(to2));
     long part1 = from.length() /2;
     long part2 = from.length() - part1;

     for (long i = 0; i < part1; i++) {
       int b;                          
       if ( (b = bi.read()) != -1) {    
         bo1.write(b);                  
       }                              
     }                                

     bi.skip(part1);

     for (long i = 0; i < part1; i++) {
       int b;
       if ( (b = bi.read()) != -1) {
         bo2.write(b);
       }
     }

   } catch (FileNotFoundException ex) {
     System.out.println("Файл не найден!");
   }
   catch (IOException ex) {
     System.out.println("Ошибка IO");
   }
 }
}


Для собирания файла из двух частей:
Код

package mypackage;
import java.io.*;
public class Main2 {
 public Main2() {
 }
 public static void main(String[] args){
   BufferedInputStream bi1 = null;
   BufferedInputStream bi2 = null;
   BufferedOutputStream bout = null;
   File f1 = new File("c:\\#\\aaa_part1");
   File f2 = new File("c:\\#\\aaa_part2");
   File out = new File("c:\\#\\reconstr.zip");
   int b;

   try {
     bi1 = new BufferedInputStream(new FileInputStream(f1));
     bi2 = new BufferedInputStream(new FileInputStream(f2));
     bout = new BufferedOutputStream(new FileOutputStream(out, true));

     while ( (b = bi1.read()) != -1) {
       bout.write(b);
     }

     while ( (b = bi2.read()) != -1) {
       bout.write(b);
     }
   }
   catch (IOException ex) {
     System.out.println("Ошибка IO");
   }



 }
}


PM MAIL   Вверх
Domestic Cat
Дата 29.12.2004, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Но файл-то после этого нормальный? Вот у тебя зип - после сборки/разборки он анзипится?


--------------------

PM   Вверх
xaoc2
Дата 29.12.2004, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет ни zip ни rar ничего, я специально выбрал зип чтобы делать тест Winrar, замечанее: если я не буду делить файл а просто прочитаю его и запишу в другой
то всё в порядке на 100%.
Так выглядят колонки в Beyond Compare (Извините за абстракционизм)



Код

********                               ********  
********                               ********  
********                               ********  
то чего нет справа                пустое место (Примерно по середине)
********                               ********  
********                               ********  
********                               ********  
то чего нет справа                пустое место


Это сообщение отредактировал(а) xaoc2 - 29.12.2004, 23:53
PM MAIL   Вверх
igon
Дата 30.12.2004, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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, сразу будет видно, что добавляется, а чего не хватает


--------------------
Хотите поговорить об этом?
PM   Вверх
xaoc2
Дата 30.12.2004, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Учёл рекомендации, в первой программе за циклами "for" подабавлал
bo1.close();
bo2.close();

вообще убрал
bi.skip(part1)
так как он не нужен.
Во второй программе за первым циклом добавил
bout.flush(),
а за вторым
bout.close()
и всё заработало. Почему, незнаю ведь виртуальная машина сама должна следить за такими
мелочами.
Если я правильно понял то файл лучше протягивать через буфер типа:

Код

     byte[] b = new byte[1024];
     while ( bi1.read(b) != -1) {
       bout.write(b);
     }


А разве BufferedInputStream не делает тоже самое?

Это сообщение отредактировал(а) xaoc2 - 30.12.2004, 00:49
PM MAIL   Вверх
igon
Дата 30.12.2004, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
виртуальная машина сама должна следить за такими
мелочами

Увы, нет! Закрывать открытые потоки должен программист, иначе их столько можно наплодить...

Цитата
Код 

    byte[] b = new byte[1024];
    while ( bi1.read(b) != -1) {
      bout.write(b);
    }

А разве BufferedInputStream не делает тоже самое?

Твой bi1 разве не BufferedInputStream?


Я использую такую конструкцию (in - типа BufferedInputStream, out - типа BufferedOutputStream, buf - byte[], block - константа)

Код

while( count = in.read(buf, 0, block) != -1)
                 {
                   if (count > 0)
                     {
                       out.write(buf, 0, count);
                     }
                 }
...



--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 30.12.2004, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Кстати, эта ошибка обнаружилась бы на маленьком файле - наверняка обе части получились бы пустыми smile


--------------------

PM   Вверх
igon
Дата 30.12.2004, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


Да, пожалуй. Хотя совершенно не представляю конкретный размер возможного незафиксированного кусочка потока. Если каждый последующий read()/write() фиксирует предыдущий, то в первоначальном варианте недоставать будет 2 байта - в середине и конце.



--------------------
Хотите поговорить об этом?
PM   Вверх
xaoc2
Дата 30.12.2004, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да 200 байт, без модификации обе части пустые.
PM MAIL   Вверх
Domestic Cat
Дата 30.12.2004, 05:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата(igon @ 29.12.2004, 16:51)
Хотя совершенно не представляю конкретный размер возможного незафиксированного кусочка потока.


512 байт smile


--------------------

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

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

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


 




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


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

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