J2ME Daten aus txt Datei in Liste einlesen


MC_Basstard

Grünschnabel
Hallo Leute,

bin neu hier also bitte nicht so hart auf mir rumtrampeln wenn ich was falsch mach
Und ich weiß leider jetzt schon nicht ob ich hier richtig bin, aber ich habe leider kein Unterforum für J2ME gefunden.

Ich habe folgendes Problem:


Ich v ersuche aus einer txt Datei den Inhalt in eine Liste einlesen.

Im Java fürn PC hab ich es irgendwie so geschafft
Code:
public Telefonbuch() 
       { 
          try { 
             dateilesen(); 
             } 
          catch (Exception e){}; 
       } 
           
          public void dateilesen() throws IOException 
          {    
           
             DefaultTableModel model = new DefaultTableModel( 
             new Object[0][2],  //  2 == Spaltenzahl 
             new String[]{null}); 
              
              String[][] rowData = new String[2000][2]; 
           
              FileReader fr = new FileReader("H:/Temp/Maya/workspace/EIGENES PROJEKT/Telefonbuch.txt");    
             BufferedReader br = new BufferedReader(fr); 
             String zeile; 
              
             int i =0; 
             while ( (zeile = br.readLine()) != null ) 
             { 
                 String[] zeilenDaten = zeile.split(";"); 
                 rowData[i] = zeilenDaten; 
                 i=i+1; 
             } 
              
               
              
       String[] columnNames = { 
          "Name","Nummer"}; 
        
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE ); 
       JTable table = new JTable( rowData, columnNames ); 
       }


fürs handy hab ich es so versucht
Code:
public void loadlist(){ 
           System.out.println("bla"); 
        InputStream is = this.getClass().getResourceAsStream("/bin/handytest/buch.txt"); 
        //System.out.println(is.toString()); 
        StringBuffer sb = new StringBuffer(); 
        System.out.println("buffer"); 
          byte[] b = new byte[5000]; 
          System.out.println("buffer 0"); 
          zeichenkette=""; 
          System.out.println("buffer 1"); 
          try { 
              int chars, i = 0; 
              System.out.println("buffer 2"); 
              chars = is.read(); 
              System.out.println("buffer 3"); 
              while ((chars) != -1){ 
                 System.out.println("loop"); 
                 sb.append((char) chars); 
                 i=i+1; 
              } 
              is.close(); 
             zeichenkette=zeichenkette+b.toString(); 
              //return sb.toString(); 
           } 
        catch (IOException  ex) { 
           ex.printStackTrace(); 
           } 
        System.out.println("bla"); 
        list.append(zeichenkette,null); 
        //return null; 
      }
die System.out.println("..."); hab ich gemacht, da egal ob in Eclipse oder Netbeans der Debugger nicht funktionierte und ich so sehen konnte, wo das Programm nicht reingeht.

Dieser Fehler kommt immer:

bla
buffer
buffer 0
buffer 1
buffer 2
java.lang.NullPointerException
at handytest.handy.loadlist(+74)
at handytest.handy.commandAction(+4)
at javax.microedition.lcdui.List.callKeyPressed(+80)
at javax.microedition.lcdui.Display$DisplayAccessor.keyEvent(+198)
at javax.microedition.lcdui.Display$DisplayManagerImpl.keyEvent(+11)
at com.sun.midp.lcdui.DefaultEventHandler.keyEvent(+127)
at com.sun.midp.lcdui.AutomatedEventHandler.keyEvent(+210)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.handleVmEvent(+114)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run(+57)




das heißt ab

chars = is.read();

machta nimma weiter aber was kann ich da jetzt genau machen find da leider keine Lösung dazu .
Und ich weiß schonmal garnich ob des eigentlich funktionieren kann was ich da vorhab xD
Leider kenn ich mich da nich so gut aus und hoffe das ihr mir helfen könnt.

MfG
Stefan
 
Zuletzt bearbeitet:

matdacat

Erfahrenes Mitglied
Dein Inputstream ist null, da das gewünschte File nicht gefunden wird: externe Files müssen unter J2ME im Unterverzeichnis 'res' liegen und entsprechend aufgerufen werden. Wenn das File nicht im JAR liegen soll, sondern irgendwo im Dateisystem des Handys, musst Du die Klasse Connector verwenden, um es zu öffnen.

Beispiele gibt's z.B. hier.
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Moin,

so wie die Fehlermeldung es schon sagt, greift Du hier auf einen Null-Pointer zu ! ;)

Leider kenne ich dieses "getResourceAsStream" nicht, aber versuch es mal so:

Java:
String strTestFile = "c:\IRGENDWAS\Test.txt";  // als Beispiel !
FileInputStream in = null;
in = new FileInputStream( strTestFile );
.....
in.close(); // nicht vergessen !
Gruß
Klaus
 

vfl_freak

Premium-User
Moin,

ja, leider hatte sich mein Post mit Deinem ersten überschnitten :-(

Da was Du da schriebst, war mir auch nicht wirklich klar :p

Danke und Gruß
Klaus
 

MC_Basstard

Grünschnabel
@matdacat

Die Datei soll schon im jar liegen ich hab die Datei überall in jedem Ordner da ich nicht genau wusste wo es liegen soll.

Des mit dem Connector versteh ich grad garnich, das hab ich alles noch nie gesehn da weiß ich garnich wie ich das dann in ne Liste einlesen kann.

Leider weiß ich es so auch nicht.
Mit meinem Arbeitskollegen (der sich in J2ME leider auch nicht auskennt) hab ich jetzt mal den Code hier geschrieben:

Code:
package handytest;

import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class handy extends MIDlet implements CommandListener{
    List lList = new List ("Liste",List.IMPLICIT);
    Command cExit = new Command ("Exit",Command.EXIT,0);
    
    Display d = Display.getDisplay(this);         
    String zeichenkette;
    
    public void commandAction (Command cmd, Displayable dsp)
    {    
      if (cmd == cExit)
      {
         destroyApp (false);
         notifyDestroyed();
      }
    }   
    
    public void loadlist(){
   
    	DataInputStream dis = new DataInputStream(getClass().getResourceAsStream("/buch.txt"));
    	StringBuffer sb = new StringBuffer();
    	int i = 0;
    	byte[] b = new byte[5000];
        zeichenkette="";
    	try {
    	   while((i = dis.read()) > -1) {
    	      sb.append((char)i);
    	      i=i+1;
    	   }
    	   dis.close();
    	   zeichenkette=zeichenkette+b.toString();
    	} catch (IOException e) {
    	   e.printStackTrace();
    	}
    }
    
    public void startApp() {   
    	 lList.append(zeichenkette,null);
         lList.addCommand(cExit);        
                          
         lList.setCommandListener(this);
         d.setCurrent(lList);
    }    
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
}

Ich versteh nicht, warum das immer 0 ist.
Die Datei existiert ja.
 

matdacat

Erfahrenes Mitglied
Habs grad selbst ausprobiert. Mit text.txt im res-Verzeichnis funktionierts wie folgt:

Java:
        try {
            DataInputStream in = new DataInputStream(getClass().getResourceAsStream("/text.txt"));
            int c;
            StringBuffer buffer = new StringBuffer();
            while ((c=in.read()) != -1) {
                buffer.append((char)c);
            }
            System.out.println(buffer.toString());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 

MC_Basstard

Grünschnabel
Cool großen Dank!!
Jetzt bin ich endlich n Schritt weiter nachdem ich schon wochen dran gescheitert bin.
Muss jetzt nur noch schaun wie ich jede Zeile aus der txt Datei in ne extra Zeile der liste einlesen kann.
Funktioniert leider nicht wie ichs am PC gemacht hab.
 

matdacat

Erfahrenes Mitglied
Siehst ja oben, dass ich jedes Zeichen einzeln einlese. Musst also einfach bei einem Zeilenumbruch ('\n') den Inhalt des Buffers in die Liste eintragen und ihn dann wieder leeren.
 

MC_Basstard

Grünschnabel
Wenn ich das so deklariert habe:

Java:
 Display d = Display.getDisplay(this);         
    String zeichenkette;


Und diesen Code habe:

Java:
public void loadlist(){
        DataInputStream dis = new DataInputStream(getClass().getResourceAsStream("/buch.txt"));
          StringBuffer sb = new StringBuffer(); 
          int i = 0;
          zeichenkette="";
          try { 
             while ((i = dis.read()) > -1) {
                 char c = (char)i;
                 if (c == '\n') break;
               //if (c == '\r');
                 else sb.append(c);
                 i=i+1;
               }
             
            dis.close(); 
            zeichenkette=zeichenkette+sb.toString();
            
          } catch (IOException e) { 
            e.printStackTrace(); 
          } 
       }

Wird der Inhalt des Buffers doch bei

Java:
zeichenkette=zeichenkette+sb.toString();
eingetragen oder?

Denn in die Liste eingetragen hab ich die zeichenkette so:

Java:
 public void startApp() {   
         loadlist();
         lList.append(zeichenkette,null);
         lList.addCommand(cExit);   
         lList.setCommandListener(this);
         d.setCurrent(lList);
    }

Das heißt ich muss die zeichenkette dann wieder leeren oder?
 
Zuletzt bearbeitet:

matdacat

Erfahrenes Mitglied
Nein, das stimmt so nicht. Du willst doch vermutlich jede Zeile aus Deinem Textfile der Liste hinzufügen. Somit musst Du auch für jedes '\n' deineListe.append aufrufen. Am besten Du änderst loadList so ab, dass Dir die Methode einen Vector an Strings (nämlich die Zeilen Deines Textfiles) zurückliefert. Und diese String trägst Du dann über eine for-Schleife mit append in Deine Liste ein.
 

MC_Basstard

Grünschnabel
Jetzt bin ich n Stück weiter also zumindest liests jetzt schon mehr Zeilen in die Liste ein aber leider immer nur die Erste.
Jetzt hab ich 10 mal die erste Zeile in der Liste stehen und zwar innerhalb von [ ], also des steht dann z.B. so da:

[Hans Micha; AG-1]
[Hans Micha; AG-1]
[Hans Micha; AG-1]
[Hans Micha; AG-1]
[Hans Micha; AG-1]
[Hans Micha; AG-1]
[Hans Micha; AG-1]
...


Java:
public void loadlist(){
   	 DataInputStream dis = new DataInputStream(getClass().getResourceAsStream("/buch.txt"));
   	 StringBuffer sb = new StringBuffer();
   	 Vector lines = new Vector();
   	 int i=0 ;
   	 zeichenkette="";
   	 try{
   	 while ((i = dis.read()) > -1)
   	 		{ 
   		 	char ch = (char)i;
   		 	if (ch == '\n')
   		 		{ lines.addElement(sb.toString());
   		 		sb.delete(0,sb.length());
   		 		break;
   		 		}	 	
   		 	else 
   		 		sb.append(ch);
   		 	    i++;
   	 		}

   	    dis.close(); 
   	    zeichenkette=zeichenkette+lines;
   	    }
   	    catch (IOException e) { 
              e.printStackTrace(); 
              } 
    }

Java:
public void startApp() {   
    	 loadlist();
    	
    	 
    	 for ( int faktor = 1; faktor <= 2000; faktor ++ ) 
    	     {
    		 lList.append(zeichenkette,null);;
    	     }
         lList.addCommand(cExit);   
         lList.setCommandListener(this);
         d.setCurrent(lList);
    }

Wenn ich des break; hinmach, hab ich das wie oben dastehtn.
Wenn ich es weg mach, hab ich den ganzen inhalt der Datei in jeder Listenzeile stehen.
 

matdacat

Erfahrenes Mitglied
Was machst Du denn mit 'zeichenkette' oder 'faktor'? Hab hier mal ausm Kopf Deinen Code überarbeitet. Ohne Gewähr.

Java:
public Vector loadlist(){
   	 DataInputStream dis = new DataInputStream(getClass().getResourceAsStream("/buch.txt"));
   	 StringBuffer sb = new StringBuffer();
   	 Vector lines = new Vector();
   	 int i=0 ;
   	 try{
   	 while ((i = dis.read()) > -1)
   	 		{ 
   		 	char ch = (char)i;
   		 	if (ch == '\n')
   		 		{ lines.addElement(sb.toString());
   		 		sb.delete(0,sb.length());
   		 		break;
   		 		}	 	
   		 	else 
   		 		sb.append(ch);
   	 		}

   	    dis.close(); 
   	    }
   	    catch (IOException e) { 
              e.printStackTrace(); 
              } 
           return lines;
    }

Java:
public void startApp() {   
    	 Vector lines = loadlist();
    	    	 
    	 for ( int i = 0; i < lines.size(); i++) 
    	     {
    		 lList.append((String)lines.elementAt(i),null);
    	     }
         lList.addCommand(cExit);   
         lList.setCommandListener(this);
         d.setCurrent(lList);
    }
 
Zuletzt bearbeitet:

MC_Basstard

Grünschnabel
Ach so meintest du das, ich habe mich jetzt immer auf das zeichenketten String bezogen.

Aber großen Dank
Es geht endlich

Aber eine kurze Frage hätt ich noch und zwar:
Wie hast du J2ME so gut gelernt?
Und wüsstest du vlt eine Seite mit ein paar guten Tutorials für J2ME und vlt auch für solche Schleifen?

Gruß
Stefan
 

matdacat

Erfahrenes Mitglied
Gern geschehen. Spezielle Tutorials kann ich Dir nicht empfehlen, ich hab einfach viel gelesen und ausprobiert. Die wichtigste Grundvoraussetzung ist aber, bereits gut in Java programmieren zu können. Und daran scheiterts bei Dir noch ein bisschen. Konzentrier Dich also zuerst mal auf die Grundlagen wie Methoden, Schleifen, etc., die Du in jedem guten Java-Buch findest.
 

Flopro

Grünschnabel
Ich weiß, die Diskussion ist schon recht alt.
Da im Netzt aber immer noch keine gute Methode verfügbar ist, txt-Dateien zeilenweise als List-Elemente einzulesen, möchte ich euch hier meine geben. Sie ist sehr einfach und auch ohne viel Wissen zu verstehen.

Java:
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class ReadFile extends MIDlet implements CommandListener{
    private Display display;
    private List list;


    public ReadFile(){
        display = Display.getDisplay(this);
    }

    public void startApp(){
        loadlist(/* Hier den Namen der Textdatei (txt) hinschreiben!! Wichtig: In Anführungszeichen!! */);
    }

    public void pauseApp(){}

    public void destroyApp(boolean unconditional){
        notifyDestroyed();
    }

    public void commandAction(Command c, Displayable s){
        
    }

    public void loadlist(String name){
        list = new List(name, List.IMPLICIT);

        DataInputStream dis = new DataInputStream(getClass().getResourceAsStream("/"+name+".txt"));
        StringBuffer sb = new StringBuffer();

        int i=0 ;
        try{
            while ((i = dis.read()) > -1)
            { 
                char ch = (char)i;
                if (ch == '\n')
                { list.append(sb.toString(),null);
                    sb.delete(0,sb.length());

                }       
                else 
                    sb.append(ch);
            }

            dis.close(); 
            
        }
        catch (IOException e) { 
            
        }
        display.setCurrent(list);
       
    }
}