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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Открыть файл, загрузить в массив, нарисовать, Открыть файл, загрузить в массив, нарисо 
:(
    Опции темы
FoxWMulder
Дата 23.11.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну никак не могу разобраться. Надо: 1. открыть файл 2. загрузить его в массив 3. из массива нарисовать
Не знаю как загрузить в массив, у меня сейчас грузит просто в лист
Код

  if (readfile == 0) {
            readfile = 1; 
       
           StreamConnection connection; 
           InputStream is;
           
           try {
      connection = (StreamConnection)Connector.open("file:///c:/other/1.txt");
      
      is = connection.openInputStream();
      int ch = is.read(); 
      StringBuffer tmpStr = new StringBuffer();

      connection.close();

  
    
while(ch != -1) {
   

if(ch>128)
ch +=0x350; // Перевод из Win1251 в Unicode, это если хочется видеть русские строки
if(ch==0xD || ch==0xA){

if(tmpStr.length() == 0){
    if (ylist <798) {//310
      list.append(" ", null);
    }
    ylist = ylist + 1;
}//\lentgh

if(tmpStr.length() > 0){
    if (ylist <798) {//310
      list.append(tmpStr.toString(), null);
    }
    ylist = ylist + 1;
    tmpStr.setLength(0);
}//\lentgh
}
else{
tmpStr.append((char)ch);
}
try {
ch = is.read();
} catch (Exception E) {
ch = -1;
}
}
      

if(tmpStr.length() > 0){ // на случай, если после последней строки нет перевода строки
    if (ylist <798) {
list.append(tmpStr.toString(), null);
    }
  
    
    ylist = ylist + 1;
}//length
     
      
      
try {
is.close();
} catch (Exception E) {
}
tmpStr = null;
      

        } catch (Exception ex) {
          }
       
             

  } //readfile 


причем в этом коде, я мало чего понимаю, вроде он грузит по символьно ( зачем? ) - можно ли сделать загрузку по строчно?

Файл имеет к примеру 20 строчек, надо их вставить в массив, по принципу - пять строчек в первый столбец, следующие пять строчек во второй столбец и так далее.

У меня сейчас чикл рисует из листа ( у меня не получилось сделать массив )

Код

for (int x2 = 0; x2 <11; x2++) {//10       
for (int y2 = 1; y2<5; y2++) {//31//32 
while (y2 < 10)
{
  g.drawString(list.getString(ylist2),x2*80-150*scrx,y2*20+50-200*scry,0);
      
    ylist2 = ylist2 + 1;
}    
}


вроде все правильно, но работает он совершенно не правильно: две строчки в одном столбце, две в следующим и тд, а надо по 5 строчек.
В итоге толи загрузка не правильная, толи в отрисовке.

После решения этой проблемы, мне надо сделать еще и выбор файла.

Если кто может - подскажите, только популярно ибо я только начал в java2me разбираться, на Pascal'е программирую еще, но java и паскаль как то мало схожи
PM MAIL   Вверх
eugine_s
Дата 23.11.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



Код


           StreamConnection connection; 
           InputStream is;
           connection = (StreamConnection)Connector.open("file:///c:/other/1.txt");


Нужно использовать FileConnection API (JSR-75)

Ты бы в коде сначала разобрался в своем: а то у меня что-то есть, я не понимаю почему оно вообще как-то работает, но вы мне подскажите.

А вообще еще лучше сначала взять толковую книжку для начинающих по "обычной" джаве и разобраться там с азами.


Цитата(FoxWMulder @  23.11.2007,  16:17 Найти цитируемый пост)
причем в этом коде, я мало чего понимаю, вроде он грузит по символьно ( зачем? ) - можно ли сделать загрузку по строчно?


Например тут: он грузит побайтно, а потом "переделывает". Этот вопрос описан в байтовых и символьных потоках (один из первых разделов в любой книге по j2se)


Если же совет по твоему коду давать, то попробуй сначала нормально загрузить твой файл и его содержимое загнать в строку, а уже распарсить строчку - это проблем не составит.
То есть, сначала считай файл в строку и сделай вывод в командную строку (на эмуляторе) этой строки и посмотри правильно ли считался твой файл.


PM MAIL   Вверх
FoxWMulder
Дата 23.11.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Нужно использовать FileConnection API (JSR-75)

как? InputConnection connection; ? смысл не поменялься, а через эмулятор - у меня файл вообще не открываеться ( появляеться запрос на открытие и все ), только с мобильника

Цитата

То есть, сначала считай файл в строку и сделай вывод в командную строку (на эмуляторе) этой строки и посмотри правильно ли считался твой файл.

если бы еще знать КАК?  smile 

PM MAIL   Вверх
eugine_s
Дата 23.11.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



Цитата(FoxWMulder @  23.11.2007,  19:20 Найти цитируемый пост)
как? InputConnection connection; ? смысл не поменялься, а через эмулятор - у меня файл вообще не открываеться ( появляеться запрос на открытие и все ), только с мобильника


Что значит смысл не меняется? 
Если уже направление не ясно, то прямая ссылка поможет?
http://www.mobilab.ru/articles/79/

В статье есть как читать из файла (хотя это у тебя у самого есть в коде, но ты наверное еще не знаешь об этом?  smile  )
PM MAIL   Вверх
FoxWMulder
Дата 23.11.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дык вроде читает, только...
все таки у меня не правильно читает из файда, вот пример
Файл:
"
1
2
3

4
5

6
7
"

Она все читает, но пропускает пустые строки



Это сообщение отредактировал(а) FoxWMulder - 23.11.2007, 20:05
PM MAIL   Вверх
eugine_s
Дата 23.11.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



Цитата(FoxWMulder @  23.11.2007,  20:00 Найти цитируемый пост)
Дык вроде читает, только...
все таки у меня не правильно читает из файда, вот пример



1. Скажи, а что программа должно делать с пустой строкой? 

2. Что в этом куске кода делается?

Код

if(ch>128) ch +=0x350; // Перевод из Win1251 в Unicode, это если хочется видеть русские строки
if(ch==0xD || ch==0xA){
if(tmpStr.length() == 0){
    if (ylist <798) {//310
      list.append(" ", null);
    }
    ylist = ylist + 1;
}//\lentgh
if(tmpStr.length() > 0){
    if (ylist <798) {//310
      list.append(tmpStr.toString(), null);
    }
    ylist = ylist + 1;
    tmpStr.setLength(0);
}//\lentgh
}


3. Что значит пустая строка? В файле нет пустой строки, там есть символы. Так какой код "пустой строки"?

4. Опять же по коду приведенному выше. Что это за магическое число 798 ?
PM MAIL   Вверх
FoxWMulder
Дата 23.11.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



мда неправ. 798 - размер файла в строках, по идеи это условие не нужно, надо просто идти до конца файла, сейчас попробую убрать. - ну точно ничего и не поменялось.

а пустая строка, это я имею ввиду - пустая с точки зрения человека - без символов ( пробел ? )
вот так файл выглядит для меня:
"
1
2
3

4
5

6
7
"
а она читает:
"
1
2
3
4
5
6
7
"


Цитата

Что в этом куске кода делается?


черти его знает... ну вообщем я так понимаю, читаем строку если она не пустая ( >0 ) то заносим в список бред... smile 
но если убрать условие >0 то она вообще както хитро разбивает строки

теперь код выглядит так
Код

while(ch != -1) {
 if(ch>128)  
  ch +=0x350; // Перевод из Win1251 в Unicode, это если хочется видеть русские строки
  if(ch==0xD || ch==0xA){
      if(tmpStr.length() > 0){
          list.append(tmpStr.toString(), null);
          ylist = ylist + 1;
          tmpStr.setLength(0);
     }//\lentgh
  }
  else{
      tmpStr.append((char)ch);
  }
try {
ch = is.read();
} catch (Exception E) {
ch = -1;
}
}


опять же пусты строки для нее не существуют

я не понимаю ( счастье так близко ) просто надо узнать что строка без символов ( вообще, там даже пробела нету ) - почему она его пропускает - ну фиг с ней, но узнать это же как то можно
вот файл из HEX-вида
310D 0A0D 0A32 0D0A 330D 0A34

он же только по-человечески
"
1

2
3
4
"

следовательно "0A0D" = пустая строка

у меня в коде есть "if(ch==0xD || ch==0xA){" - что определяет конец строки
как из этого определить пустую строку?!

Это сообщение отредактировал(а) FoxWMulder - 23.11.2007, 20:44
PM MAIL   Вверх
FoxWMulder
Дата 23.11.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я убьюсь с это джавой, разные файлы читает по разному - ну не понимаю
кроме по байтного чтения не ужели нет другого способа

а там пробелы вот такую строчку она и читает нормально, а вообще без символов... пропускает

Это сообщение отредактировал(а) FoxWMulder - 23.11.2007, 20:59
PM MAIL   Вверх
eugine_s
Дата 24.11.2007, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



Цитата(FoxWMulder @  23.11.2007,  20:56 Найти цитируемый пост)
я убьюсь с это джавой, разные файлы читает по разному - ну не понимаю
кроме по байтного чтения не ужели нет другого способа 


Для кого тут я давал ответы???

Смотрим первый пост: потоки бывают байтовые и символьные.

Слушай, как ты хочешь написать программу на j2me если совсем не имеешь представления о j2se?

Как бы это твое личное дело, я тебе могу дать ответ, но прежде чем задать следующий вопрос прочитай ХОТЯ БЫ ВОТ ЭТУ СТАТЬЮ: 
http://skipy.ru/philosophy/learning.html
там как раз про тебя написано.
Заодно и остальные статьи прочитай: много полезного найдешь.


Пустая строка - это для тебя и меня текстовый редактор показывает пустую строку, а для файла это только символ. Вопрос звучал так: Так какой код "пустой строки"?
Правильный ответ: 13 10 (заметь это два символа, символ окончания строки(Enter) и символ перевода каретки)

Теперь скажи какое значение имеют эти коды (13 и 10) в 16-тиричном формате (кстати, как 16-тиричный формат в java записывается?)

Ответ: A и D
13 = 0xD 
10 = 0xA

Смотрим теперь в код:

Код

while(ch != -1) { // выполняем цикл пока ch != -1, -1 появится когда будет достигнут конец файла

 if(ch>128)  ch +=0x350; // Перевод из Win1251 в Unicode, это если хочется видеть русские строки
//коментарий кто-то подписал, а значение все равно не понятно, так ведь?

  if(ch==0xD || ch==0xA){ // ООО, вот наши коды 13 и 10 !!!, что же мы с ними тут делаем? 
      if(tmpStr.length() > 0){ //так если строка tmpStr не пустая, то вот что мы делаем (кстати, а что это за tmpStr? зачем она?)
          list.append(tmpStr.toString(), null); // в list добавляем нашу строку
          ylist = ylist + 1; // тут я так понимаю увеличили счетчик записаных строк в list?
          tmpStr.setLength(0); // тут сделали tmpStr пустым
     }//\lentgh
//на этом все больше ничего не делается с кодами 13 и 10
  }
  else{
      tmpStr.append((char)ch); // если встретился символ не равный 13 и 10, то просто записываем этот символ в tmpStr
  }
try {
ch = is.read(); // что тут делается? читаем байт из потока и заносим это значение в ch
} catch (Exception E) {
ch = -1; //собственно условие выхода из цикла.
}
}


Что должна делать программа если встретила "пустую строчку" (на самом деле символ окончания строки)?
Твой пример:
1
2
3

4

В файле это выглядит вот так:  1\n\r2\n\r3\n\r\n\r4\n\r
( \n - код 13, \r - код 10)
твой цикл обработки считал файл и начинает обрабатывать байты: 
1 - записал в tmpStr
\n - выполняется условие  if(ch==0xD || ch==0xA) : записываем из tmpStr в list
\r -  выполняется условие  if(ch==0xD || ch==0xA) : но tmpStr - пустой, никаких действий не происходит
2 - записал в tmpStr
\n - выполняется условие  if(ch==0xD || ch==0xA) : записываем из tmpStr в list
\r -  выполняется условие  if(ch==0xD || ch==0xA) : но tmpStr - пустой
3 - записал в tmpStr
\n - выполняется условие  if(ch==0xD || ch==0xA) : записываем из tmpStr в list
\r -  выполняется условие  if(ch==0xD || ch==0xA) : но tmpStr - пустой
//собственно дальше идет твоя "пустая строка"
\n - выполняется условие  if(ch==0xD || ch==0xA) : НО tmpStr - пустой, никаких действий не происходит!!!
\r -  выполняется условие  if(ch==0xD || ch==0xA) : опять же tmpStr - пустой, никаких действий не происходит

4 - записал в tmpStr
\n - выполняется условие  if(ch==0xD || ch==0xA) : записываем из tmpStr в list
\r -  выполняется условие  if(ch==0xD || ch==0xA) : но tmpStr - пустой
......

Если не понял, то лучше сядь и разберись, иначе ..... программирование - не для тебя.


Вот теперь скажи, кто по разному читает файлы? Java? или ты не понимая сути, берешь чужой код и не разобравшись (да даже не познакомившись с языком программирования) просишь совета...
PM MAIL   Вверх
shomer
Дата 24.11.2007, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



eugine_s спасибо за ссылку на skipy.ru

Это сообщение отредактировал(а) shomer - 24.11.2007, 02:12
PM MAIL   Вверх
shomer
Дата 25.11.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все таки свербит
Код

byte prev_ch;
while(ch != -1)              //  а что есть ch до is.read();                    
 {
       if(ch>128)  
           ch +=0x350;                        // ?
       if(ch==0xD || ch==0xA)
       {
            if (tmpStr.length() > 0)
            {
                 list.append(tmpStr.toString(), null);
                 ylist++;
                 tmpStr.setLength(0);
            }
            else if ( prev_ch==0xA)
            {
                 list.append( "", null);      // ?
                 ylist++;
            } 
       }
       else
           tmpStr.append((char)ch);
       prev_ch = ch;
       try { ch = is.read();
       } catch (Exception E) { ch = -1;}

Хотя тут явно надо бы - читаешь в буфер, обрабатываешь его
PM MAIL   Вверх
eugine_s
Дата 26.11.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



Цитата(shomer @  25.11.2007,  22:48 Найти цитируемый пост)
Все таки свербит


То есть?


Цитата(shomer @  25.11.2007,  22:48 Найти цитируемый пост)
а что есть ch до is.read(); 


Код

int ch = is.read();


или я вопрос не понял

Код

       if(ch>128)  ch +=0x350;                        // ?


Посмотри коды в Кирилице (Cp1251) русских буков и посмотри на этиже коды в Unicode.


Цитата(shomer @  25.11.2007,  22:48 Найти цитируемый пост)
Хотя тут явно надо бы - читаешь в буфер, обрабатываешь его


Зачем? Можно и без этого.

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


Новичок



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

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



Точно вспомнил конец строки-перевод строки. eugine_s вот теперь ты мне расписал все подробно и я понял в чем моя ошибка и чего надобно собственно сделать. shomer твой код работает правильно только "byte prev_ch;" заменил на "int prev_ch = 0;" у меня же "ch" - integer; иначе она не хочет присваивать.

Цитата

Смотрим первый пост: потоки бывают байтовые и символьные.


Как юзать символьные?

А почему надо начинать именно с java2se а не me?

Интересно "String mas[];" - компилит, а "String[] mas = new string[10];" - не компилит, почему? собственно мне двухмерный массив нужен, но тут и одномерный не хочет.


Это сообщение отредактировал(а) FoxWMulder - 26.11.2007, 16:13
PM MAIL   Вверх
eugine_s
Дата 26.11.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



Цитата(FoxWMulder @  26.11.2007,  15:52 Найти цитируемый пост)
заменил на "int prev_ch = 0;" у меня же "ch" - integer; иначе она не хочет присваивать. 


Про явное приведение типов не слышал наверное.

http://www.ssga.ru/metodich/web_diz/8/6.html

Код

int ch = 0;
byte pre_ch = 0;

prev_ch = (byte) ch;



книги, книги и еще раз книги (книги можна заменить на доки).
PM MAIL   Вверх
FoxWMulder
Дата 26.11.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



слышал... на паскале  smile  inttostr etc
только тогда она тормозиться на "else if ( prev_ch==0xA)", правильно это в integer а теперь надо в byte, ладно работает и хорошо
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




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


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

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