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


Автор: ivanovpv 28.7.2010, 12:34
Есть функция на вход которой подается объект с таким типом (CharSequence). Есть большой текстовый файл (несколько мегов), который целиком в оперативку ясен пень не лезет. Надо бы написать реализацию интерфейса CharSequence так чтобы он мог брать файл произвольной длины при необходимости подкачивая из диска. Может кто-то где-то видел такие исходники? Буду премного благодарен - сидеть писать самому как-то муторно.

Автор: jk1 28.7.2010, 13:45
С произвольной длинной файла довольно сложно, в самом деле, как для произвольной длины реализовывать вот такой метод из charSequence:
Код

 public int length();

?

Автор: Skipy 28.7.2010, 13:45
Цитата(ivanovpv @ 28.7.2010,  12:34)
Есть большой текстовый файл (несколько мегов), который целиком в оперативку ясен пень не лезет.

Если бы Вы сказали несколько гигов - это бы было понятно. А несколько мегов в оперативку поместится целиком раз сто, и еще место останется.

Автор: ivanovpv 28.7.2010, 14:46
Цитата(jk1 @  28.7.2010,  14:45 Найти цитируемый пост)
С произвольной длинной файла довольно сложно, в самом деле, как для произвольной длины реализовывать вот такой метод из charSequence public int length() ? 

Элементарно... Читаем в пустоту пока не встретим конец файла
Код

    public int length()
    {
        if(this.length==-1)
        {
            try
            {
                for(this.length=0; ;this.length++)
                {
                    if(br.read()==-1);
                        break;
                }
            }
            catch(Exception e)
            {
                Log.e(TAG, "Error getting size of file", e);
                this.length=0;
            }
        }
        return this.length;
    }


Цитата(Skipy @  28.7.2010,  14:45 Найти цитируемый пост)
Если бы Вы сказали несколько гигов - это бы было понятно. А несколько мегов в оперативку поместится целиком раз сто, и еще место останется. 

Это смотря в какую оперативку и смотря где JVM крутится. В моем случае JVM крутится в оч. жестких условиях. Ну ладно хорошо пусть будет несколько гигов, легче cтало?

Автор: LSD 28.7.2010, 17:57
Уже http://forum.vingrad.ru/forum/topic-61598.html.

Добавлено через 3 минуты и 55 секунд
И по моему Stampede, даже где-то выкладывал получившийся код.

Автор: jk1 28.7.2010, 18:55
Цитата

Элементарно... Читаем в пустоту пока не встретим конец файла

И правда элементарно. Работало бы, вообще б цены не не было smile 
Допустим цикл из одной итерации -  это опечатка
Код

for(this.length=0; ;this.length++)
                {
                    if(br.read()==-1);
                    break;
                }

Что мы имеем, если её поправим: в случае начального length=0; длина всегда нулевая, в случае задания начального length=-1; код выдает нечто, не соответствующее длине файла если размер файла превышает диапазон инта. Ну и наконец на сколько-нибудь приличных по размеру файлах это работает огромное количество времени.

Автор: ivanovpv 29.7.2010, 07:57
Цитата(jk1 @  28.7.2010,  19:55 Найти цитируемый пост)
Допустим цикл из одной итерации -  это опечатка

Это не цикл из одной итерации, а бесконечный цикл  smile 

Цитата(jk1 @  28.7.2010,  19:55 Найти цитируемый пост)
Ну и наконец на сколько-нибудь приличных по размеру файлах это работает огромное количество времени. 

Предлагайте альтернативу!

Автор: jk1 29.7.2010, 08:59
Цитата

Предлагайте альтернативу! 

Будем посмотреть smile . Есть ли какие-нибудь предположения о кодировке входных файлов? 

Автор: pathfinder 29.7.2010, 12:01
Если файл содержит символы в однобайтовой кодировке(или в многобайтовой но на каждый символ выделяется одно и то же количество, например UTF16) то размер потока можно узнать через File.length()(File.length()/КолБайтНаСимвол)

Иначе только размер потока можно узнать только пробежавшись по всему файлу.

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