Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Копирование части файла


Автор: newinjava 28.4.2011, 21:11
Здрасти. У меня проблема с 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. Но вот проблемма, я получаю потерю данных. Копии не полноценны, т.е. картинки не показывается. 

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

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

Как мне решить эту проблемму, что я делаю не так?

Автор: Stolzen 28.4.2011, 21:51
Попробуйте что-нибудь типа такого

Код

        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();


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

Автор: newinjava 28.4.2011, 22:14
 smile  
Проканало. Спасибо.
А вчём причина то?


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

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

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

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



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

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

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


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

P.S. Надеюсь модератор отреагирует и с играет роль "кого-нибудь".  smile 

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

Done.

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


Ну вот и чудненько. Спасибки.

Автор: newinjava 29.4.2011, 18:00
Интересная проблема.
При выводе первой части файла, получается правельный размер. В этом случае 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:21
Заглянул в те файлы котоые имеют корявые размеры. Почемуто после нужных байтов в файл дописываются NULL именно эти байты и косячат размер файла. Я эти NULL просто тупо в Notepad++ удалил, файл открылся без проблем и рамер стал правельным. 

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

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

Автор: newinjava 29.4.2011, 22:06
Нашел свою ошибку.

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();
        }
    }


Всем спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)