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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование части файла, BufferedWriter проблема 
V
    Опции темы
newinjava
Дата 28.4.2011, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ATokS
*


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

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



Здрасти. У меня проблема с BufferedWriter, он не хочет сохранять то что ему дают. Искажает инфу.

Вот код:
Код
    public boolean saveImageNr(int nr, File out) throws IOException{
        if(starts.size() >= nr && ends.size() >= nr){
            int start = starts.get(nr);
            int ende  = ends.get(nr);
            
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
            //InputStreamReader isr = new InputStreamReader(new FileInputStream(file));
            //FileInputStream fis = new FileInputStream(file);
            
            //FileOutputStream fos = new FileOutputStream(out);
            //BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(out));
            BufferedWriter bw = new BufferedWriter(new FileWriter(out));
            
            for(int i=0; i<ende; i++){
                int r = br.read();
                if(i>=start){
                    bw.write(r);
                }
            }
            
            bw.flush();
            bw.close();
            br.close();
        }
        return false;
    }


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

Как уже по закоментированным объектам видно испробывал всё что мог. Ни чего не помогло. Единствинная радость это настоящие состояние функции, она хоть и не работает так как мне надо но часть картинки открывается. Во всех остольных попытках и того небыло.

Посмотрел содержание файла, разница в одном символе. Кокойто квадратный символ всегда заменяется на ?. Я понял именно это и ведёт к искожению файла.

Как мне решить эту проблемму, что я делаю не так?
PM WWW   Вверх
Stolzen
Дата 28.4.2011, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

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



Попробуйте что-нибудь типа такого

Код

        FileInputStream is = new FileInputStream("input.dat");
        
        int start = 10, end = 100;
        is.skip(start);
        
        FileOutputStream os = new FileOutputStream("output.dat");
        
        
        while (end > 0) {
            os.write(is.read());
            end--;
        }
        
        os.flush();
        
        is.close();
        os.close();


Тоже искажает? 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
newinjava
Дата 28.4.2011, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ATokS
*


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

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



 smile  
Проканало. Спасибо.
А вчём причина то?


-------- Добавел
P.S. Блин, постов маловато. Хотел плюс ткнуть.

Это сообщение отредактировал(а) newinjava - 28.4.2011, 22:15
PM WWW   Вверх
Stolzen
Дата 29.4.2011, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

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



Цитата(newinjava @  28.4.2011,  23:14 Найти цитируемый пост)
Проканало. Спасибо.
А вчём причина то?

А не знаю. Попробуйте теперь это обернуть BufferedInputStream:
Код

        InputStream is = new BufferedInputStream(new FileInputStream("input.dat"));



Цитата(newinjava @  28.4.2011,  23:14 Найти цитируемый пост)
-------- Добавел
P.S. Блин, постов маловато. Хотел плюс ткнуть.

Ну можно попросить кого-нибудь  smile 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
newinjava
Дата 29.4.2011, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ATokS
*


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

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



Цитата(Stolzen @  29.4.2011,  05:57 Найти цитируемый пост)
Ну можно попросить кого-нибудь


Кто-нибудь!!!!!!!!!!!!!!!! Пожалуйста поставти плюсик, доброму человеку от моего имени. За рание спасибо.

P.S. Надеюсь модератор отреагирует и с играет роль "кого-нибудь".  smile 
PM WWW   Вверх
LSD
Дата 29.4.2011, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(newinjava @  29.4.2011,  09:49 Найти цитируемый пост)
Кто-нибудь!!!!!!!!!!!!!!!! Пожалуйста поставти плюсик, доброму человеку от моего имени. За рание спасибо.

Done.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
newinjava
Дата 29.4.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ATokS
*


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

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



Цитата(LSD @  29.4.2011,  12:18 Найти цитируемый пост)
Done. 


Ну вот и чудненько. Спасибки.
PM WWW   Вверх
newinjava
Дата 29.4.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ATokS
*


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

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



Интересная проблема.
При выводе первой части файла, получается правельный размер. В этом случае 1024 Byte
Но вот при выводе второй части размер получается 3072 Byte. Хотя я выполнил skip(2048).
Может я чего не так понял в работе потоков?

Моя задача токова. Разбить файл на части которые указанны в Векторах starts и ends. Для примера я прописал статически оффсеты трёх частей файла. Логически все три части должны быть по 1024 Byte но вот первая часть 1024 , вторая 3072 и третья 4096.

Токое ощущение что каждая часть выводится от нуля до значения в Векторе ends.get(nr) а не так как должна от starts.get(nr) до ends.get(nr).

Код

public synchronized void saveImageNr(int nr, File out) throws IOException{
        // Position Nr.: 0
        starts.add(0);        ends.add(1024); // Out = 1024 Byte
        // Position Nr.: 1
        starts.add(2048);    ends.add(3072); // Out = 1024 Byte
        // Position Nr.: 3
        starts.add(3072);    ends.add(4096); // Out = 1024 Byte
        
        if(starts.size() > nr && ends.size() > nr){
            int start = starts.get(nr);
            int ende  = ends.get(nr);

            FileInputStream fis = new FileInputStream(this.file);
            System.out.println("Skiped: "+fis.skip(start));
            System.out.println("Export SOI: "+start+" EOI: "+ende);
            
            FileOutputStream fos = new FileOutputStream(out);
            
            byte[] buff;
            int buffSize = 1024;
            while (ende > 0) {
             if(ende>buffSize){
                 buff = new byte[buffSize];
             }else{
                 buff = new byte[ende];
             }
             fis.read(buff);
                fos.write(buff);
                ende-=buffSize;
            }
            
            fos.flush();
            fos.close();
            fis.close();
        }
    }


Что тут не так?

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


ATokS
*


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

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



Заглянул в те файлы котоые имеют корявые размеры. Почемуто после нужных байтов в файл дописываются NULL именно эти байты и косячат размер файла. Я эти NULL просто тупо в Notepad++ удалил, файл открылся без проблем и рамер стал правельным. 

Почему моя функция дописывает этот мусор в файл?

Добавлено через 8 минут и 55 секунд
Убрал галочку. Вопрос решен.

Это сообщение отредактировал(а) newinjava - 29.4.2011, 18:22
PM WWW   Вверх
newinjava
Дата 29.4.2011, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ATokS
*


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

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



Нашел свою ошибку.

ende У меня является OFFSET до куда должно писаться, по этому и пмсалось лишнее.

Надо было сделать так:

Код

    public synchronized void saveImageNr(int nr, File out) throws IOException{

        if(starts.size() > nr && ends.size() > nr){
            int start = starts.get(nr);
            int length  = ends.get(nr)-start;

            FileInputStream fis = new FileInputStream(this.file);
            fis.skip(start);
            FileOutputStream fos = new FileOutputStream(out);
            
            byte[] buff;
            int buffSize = 1024;
            while (length > 0) {
             if(length>buffSize){
                 buff = new byte[buffSize];
             }else{
                 buff = new byte[length];
             }
             fis.read(buff);
                fos.write(buff);
                length-=buff.length;
            }
            
            fos.flush();
            fos.close();
            fis.close();
        }
    }


Всем спасибо

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

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

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


 




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


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

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