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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение текстового файла 
:(
    Опции темы
Ockonal
Дата 11.1.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

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



Здравствуйте, искал по форуму, нашел темы... Но все-равно есть пару вопросов. Вот, пока пытаюсь сработаться с эмулятором. У меня есть текстовый файл. Он должен идти вместе с программой и в телефоне, чтобы, если что, его можно было отредактировать на компьютере.
Первое, что пытался сделать:
Код

    private String GetDataFromFile(String Path)
    {
        DataInputStream dis  = new DataInputStream(getClass().getResourceAsStream(Path));
        StringBuffer strBuff = new StringBuffer("");
        int ch = 0;

        try
        {    
            while ((ch = dis.read()) != -1) 
            {
             strBuff.append((char )ch);
            }
            dis.close();
            
            return strBuff.toString();
        } 
        catch (Exception e)
        {
            return "GetData Exception: " + e.toString();
        }
    }

Вылетает исключение: NullPointerException. Пытался проверить dis == null, но результатов не было.

Следующая попытка:
Код

    private String NewGetDataFromFile(String Path)
    {
        try 
        {
            FileConnection filecon = (FileConnection)Connector.open("file:////data.txt", Connector.READ);
            if(!filecon.exists()) 
            {
                return "!exists";
            }
            filecon.close();
        } 
        catch(Exception e) 
        {
            return "NewReader: " + e.toString();
        }
        return "";
    }

Здесь пишет, что файл не найден... Никак не пойму, куда его тулить. Сразу пробовал в папку /res...
Но потом уже и во все папки проекта покопировал smile

Последнее, что я попытался сделать:
Код

     private String getText(String path) {
            DataInputStream dis = new DataInputStream(getClass().getResourceAsStream(path));
            StringBuffer strBuff = new StringBuffer();
            int ch = 0;
            try {
                try {
                    while ((ch = dis.read()) != -1) {
                        strBuff.append((char) ((ch >= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch));
                    }
                } finally {
                    dis.close();
                }
            } catch (Exception e) {
                System.err.println("ERROR");
                e.printStackTrace();
            }
            return strBuff.toString();
    }

Вызывал getText("/data.txt");
Результат тот же, что и в первом случае.

Подскажите, что использовать? И не нужно ли здесь каких-то прав рута?
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
math64
Дата 11.1.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если ты читаешь файл через DataInputStream, его нужно записывать через DataOutputStream.
Обычный текстовый файл читается в массив байт, нужной кодировки телефон может и не знать, тогда байты нужно конвертировать в строку вручную.
Если ты открываешь файл getClass().getResourceAsStream("/data.txt") в корневом каталоге .jar должен быть файл data.txt (и его название должно быть в том же регистре!)
PM   Вверх
Ockonal
Дата 11.1.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

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



math64, 
Спасибо за ответ!
Цитата

Если ты открываешь файл getClass().getResourceAsStream("/data.txt") в корневом каталоге .jar должен быть файл data.txt (и его название должно быть в том же регистре!) 

Вот это мне надо, но как проверить на эмуляторе? Работаю в Eclipse. Билдю проект, но в кореневой папке проекта только .jad-файла, но текстовый и там есть, а все-равно не находит :(
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
Ockonal
Дата 11.1.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

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



Проблема решилась в NetBeans, когда вкинул текстовый файл в ресурсы (до файла главного класса).
Но теперь вопрос, после сборки файл "вписывается" в ресурсы запускного. Мне надо, чтобы этот файл можно было отредактировать. Как такое сделать?
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
duk
Дата 11.1.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


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

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



Ockonal, программно  никак. Midlet ы должны быть постоянного размера, который указан в jad, на сколько я помню
PM MAIL   Вверх
Ockonal
Дата 11.1.2009, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

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



duk, 
Я понимаю, но вы меня не поняли. Я не хочу пользоваться предыдущим методом, потому что текстовый файл идет в ресурсы. Я не спрашиваю, как его редактировать из ресурсов, а как работать иначе с файлом?

Это сообщение отредактировал(а) Ockonal - 11.1.2009, 19:29
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
duk
Дата 11.1.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


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

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



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


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

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



В файле будет храниться информация, которую, если что, нужно будет редактировать через компьютер. Не предлагать редактирование через интерфейс.
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
duk
Дата 11.1.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


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

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



Код

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.file.*;
import javax.microedition.io.*;
import java.io.*;
 
public class WriteMIDlet extends MIDlet implements CommandListener {
    private TextBox textbox;
    private String photos = "fileconn.dir.photos";
    private Command saveCommand;
    private Command exitCommand;
    private String path;
 
    public void startApp() {
        textbox = new TextBox("WriteMIDlet", "", 1000, TextField.ANY);
        saveCommand = new Command("Save", Command.SCREEN, 1);
        exitCommand = new Command("Exit", Command.EXIT, 1);
        textbox.addCommand(saveCommand);
        textbox.addCommand(exitCommand);
        textbox.setCommandListener(this);
        Display.getDisplay(this).setCurrent(textbox);
        path = System.getProperty(photos);
    }
 
    public void pauseApp() {
    }
 
    public void destroyApp(boolean unconditional) {
    }
 
    private void saveFile(String path, String name) {
        try {
            String url = path + name;
            String string = textbox.getString();
            byte data[] = string.getBytes();
            FileConnection fconn = (FileConnection)Connector.open(url, Connector.READ_WRITE);
            if (!fconn.exists()) {
                fconn.create();
            }
            OutputStream ops = fconn.openOutputStream();
            ops.write(data);
            ops.close();
            fconn.close();
        }
        catch (IOException ioe) {
            System.out.println("IOException: "+ioe.getMessage());
        }
        catch (SecurityException se) {
            System.out.println("Security exception:" + se.getMessage());
        }
    } 
 
    public void commandAction(Command c, Displayable d) {
        if (c == saveCommand) saveFile(path, "readme.txt");
        if (c == exitCommand) this.notifyDestroyed();
    }    
}

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 9.10.2008
Где: Ташкент

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



а что то типа формата ini по такому же принципу можно организовать...???
опять же надо редактировать данные из компа, а читать в мидлете
PM MAIL ICQ   Вверх
MoZy
  Дата 24.1.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно, можно.
А в Эклипсе он твой файл не находил, потомучто ты не нажал F5 на папке ресурсов в самом Эклипсе.. Когда жмешь - он копирует в папку bin (из нее потом все копируется в jar). И так со всеми ресурсами.
Не видел НетБинс, но Эклипс прикольный  smile 
А еще можно вместо сохранения на компе файлов автоматом, выводить все данные в консоль и копировать в Блокнот  smile 

Это сообщение отредактировал(а) MoZy - 24.1.2009, 17:34
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
Выхухоль
Дата 26.1.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 9.10.2008
Где: Ташкент

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



Вообщем чтоб закрыть эту тему окончательно, решил выложить исходники классов данного мероприятия

Класс PropertyReader: Считывает данные из файла в виде ini 
Код



package Payment.Objects;


import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Hashtable;

/**
 *
 * @author palexandr
 */
public class PropertyReader {

    /**
     * Имя файла
     */
    private String fileName;
    /**
     * Хранилище свойсв
     */
    private Hashtable properties;

   

    /**
     *
     * @param Название файла
     */
    public PropertyReader(String fileName) {
        this.fileName = "/" + fileName;
        properties = new Hashtable();
        //this.midletClass = midletClass;

    }

    /**
     *
     * @return Считанные свойства
     */
    public final Hashtable readProperties() {
        this.readUnicodeFile();
        return properties;
    }

    /**
     *
     */
    private final void readUnicodeFile() {
        InputStream is = null;
        InputStreamReader isr = null;
        try {
            
            is = getClass().getResourceAsStream(fileName);

            if (is == null) {
                throw new Exception("File '" + fileName + "' does not exist");
            }
            isr = new InputStreamReader(is, "UTF8");
            LineReader lineReader = new LineReader(isr);
            String line = lineReader.readLine();
            while (line != null) {
                this.parseProperty(line);
                line = lineReader.readLine();
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }

    /**
     *
     * @param Линия текста
     */
    private final void parseProperty(final String line) {
        int lineLength = line.length();

        StringBuffer bfs = new StringBuffer();
        String token = "";
        final int SEPARATOR = 2;
        final int NORMAL = 3;
        int lastChar = NORMAL;

        String key = "";
        String value = "";

        for (int i = 0; i < lineLength; i++) {
            lastChar = NORMAL;
            char c = line.charAt(i);

            if (c == '#') {
                return;
            }
            
            if (c == '@') {
                lastChar = SEPARATOR;
            }

            if (c == '=') {
                token = bfs.toString();
                key = token;
                lastChar = SEPARATOR;
            }

            if (c == '$') {
                token = bfs.toString();
                value = token;
                key = key.toLowerCase();
                getProperties().put(key, value);
                lastChar = SEPARATOR;
            }

            if (lastChar != SEPARATOR) {
                bfs.append(c);
            } else {
                bfs = new StringBuffer();
            }
        }
    }

    /**
     *
     * @return 
     */
    public Hashtable getProperties() {
        return properties;
    }
}






Класс LineReader: обрабатывает строки считанные ридером
Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Payment.Objects;




import java.io.Reader;

/**
 *
 * @author palexandr
 */
public class LineReader {

    /**
     *
     */
    private Reader r;

    /**
     *
     * @param reader
     */
    public LineReader(Reader reader) {
        this.r = reader;

    }

    /**
     *
     * @return
     */
    public final String readLine() {
        String s = "";
        try {
            int c = r.read();
            if (c == -1) {
                return null;
            }
            while (c != -1 && c != '\n' && c != '\r') {
                s += (char) c;
                c = r.read();
            }
        } catch (Exception e) {
        }
        return s;
    }
}


Пример самого фойла считываемого ридером
Код

#---------Правила заполнения конфигурационного файла----------
#1. Каждая строка файла является свойством
#2. Название свойства и его значение разделяются символом '='
#3. Каждое свойсво заканчивается символом '$'
#4. Знаечение свойства URL обязательно должно выглядеть следующим образом <http>://<ip-адрес или хост>:<порт>, порт необязательно
#5. Здесь символ '#' - комент строки
#-------------------------------------------------------------
CompanyText=Текст о компании$
UssuerText=Текст о владельце копии системы$
ProgrammText=Текст о программе$
ProgrammVersion=Версия программы$
UssueDate=Дата выпуска программы$
URL=http://89.236.233.122$


И наконец пример кода как все это реализовать:
Код

 PropertyReader rederProp = new PropertyReader("property.txt");
Hashtable prop = rederProp.readProperties();

И все после этого  в хэше хранятся данные в виде ключ значение считанные из нашего файла...
PM MAIL ICQ   Вверх
Ockonal
Дата 26.1.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

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



Спасибо за старания. + в репутацию ;)
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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