# Telefonbuch in J2ME programmieren HILFE!



## MC_Basstard (26. Okt 2009)

Hallo, 

ich hoffe ihr könnt mir helfen. 
Ich bin Azubi und hab die Aufgabe bekommen in Java n Telefonbuch fürs Handy zu erstellen wo sich alle Mitarbeiter mit ihren Nummern drin befinden.
Leider kenn ich mich mit J2ME garnich aus, da ich J2SE auch nich besonders kann hab ich quasi 0 Ahnung. 
In meiner Arbeit kennt sich mit J2ME leider auch keiner aus Google war auch nicht mein Freund und bei Lycosiq und nem anderen J2ME Forum konnte mir bis jetzt irgendwie auch keiner helfen... 

Ich hab bis jetzt ne Liste mit zwei Einträgen die man anklicken kann, wo sich dann ein neues Display öffnet (hoff des stimmt alles was ich da jetzt red xD).
Ich hab ne Textdatei, in der alle Mitarbeiter mit ihren Nummern dahinter drin stehen, und ich würde jetzt gern versuchen diese Textdatei in das Midlet einzubinden, das wenn ich auf Einträge ansehen klicke, dort dann alle Mitarbeiter + ihre Nummer dahinter angezeigt werden.

Hab mal irgendwas gehört das des mit Arrays geht oder mit Strings das es da iwie jede Zeile dan einliest oder so aber n Beispiel wie des aussehen muss oder wie des zusammenhängen muss hab ich bis jetzt leider auch nich gefunden.

Schonmal großen Dank im voraus!!

mfg Stefan


----------



## The_S (26. Okt 2009)

In J2ME nimmste dafür ne <code>List</code> zum Anzeigen. Zwischenspeichern kannste das gern in nem Array. Les dir am Besten mal ein Einsteigerbuch durch. Oder bestell dir "Java goes Handy" für 0 Euro (siehe Werbung oben rechts im Forum).


----------



## MC_Basstard (26. Okt 2009)

jo ne List hab ich da scho ^^
Und es hieß irgendwie das man dan über Arrays jede Zeile der Textdatei in die List einlesen kann.

Wüsstest du da vlt ein kleines Beispiel dazu wie sowas funktioniert?


----------



## The_S (26. Okt 2009)

MC_Basstard hat gesagt.:


> Und es hieß irgendwie das man dan über Arrays jede Zeile der Textdatei in die List einlesen kann.



Nein. Ein Array speichert die Daten. Einlesen tun die nicht. Und schon gar nicht zeilenweise.



MC_Basstard hat gesagt.:


> Wüsstest du da vlt ein kleines Beispiel dazu wie sowas funktioniert?



Da es so etwas nicht gibt: Nein.


----------



## MC_Basstard (26. Okt 2009)

und wie kann man sowas dann machen?


----------



## The_S (26. Okt 2009)

MC_Basstard hat gesagt.:


> und wie kann man sowas dann machen?



Was denn konkret?


----------



## MC_Basstard (26. Okt 2009)

Ich hab die Textdatei mit den Namen der Mitarbeiter und ihren Telefonnummern dahinter.
Nun möchte ich den Inhalt in das Midlet einlesen das die Mitarbeiter mit ihren Nummern dahinter dan in der Liste stehtn.


----------



## The_S (26. Okt 2009)

Textdatei kannst du über einen beliebigen Stream einlesen (muss mit im JAR liegen). Das eingelesene musst du dann irgendwie nach Mitarbeiter/Telefonnummer trennen (vermutlich dann beim Zeilenumbruch) und dann die einzelnen Elemente via 
	
	
	
	





```
list.append
```
 zur Liste hinzufügen.


----------



## MC_Basstard (26. Okt 2009)

aber wie kann man auf den inhalt der textdatei zugreifen?
da muss ich doch irgendwie angeben welche zeile in der Textdatei jetzt wo in der `Liste stehen soll oder?


----------



## The_S (26. Okt 2009)

Eine Textdatei hat keine Zeilen. folglich kannst du auch nicht auf spezielle Zeilen zugreifen. Du musst die Textdatei soweit sequentiell auslesen, bis du an der gewünschten Stelle bist.


----------



## MC_Basstard (26. Okt 2009)

ah ok
und wie genau geht das?

sowas hier hab ich bis jetzt



```
public void testList() 
    {
        list = new List("Auswahl", Choice.IMPLICIT);
        list.setTicker(new Ticker("das Telefonbuch"));
        list.addCommand(backCommand);
        list.setCommandListener(this);
        display.setCurrent(list);
        currentMenu = "list";
        
  
        
  // Datei einlesen 
        InputStream is = this.getClass().getResourceAsStream("/unbekannt-Telefonbuch.doc");
        DataInputStream dis = new DataInputStream(is); 
	      byte[] b = new byte[150]; 
	      zeichenkette="";
	      try {
	            if(is!=null){
	            	is.read(b);
	            	zeichenkette=zeichenkette+b.toString();
	            }
        	} 
        catch (IOException  ex) {
        	ex.printStackTrace();
        	} 
        list.append(zeichenkette, null);

    }
```


----------



## The_S (26. Okt 2009)

Du willst ein .doc einlesen? Du weißt schon, dass da außer Text noch andere Sachen drin sind?

Ansonsten kannst du mal hier gucken: Java Blog Buch : 09.05 Beliebige Daten lesen und schreiben

Ist zwar normales Java und kein Java ME. Aber nachdem du dir den InputStream geholt hast, gehts bei beiden identisch weiter.


----------



## MC_Basstard (26. Okt 2009)

naja nich so ganz oder?
Weil beim normalen Java würd des pber FileReader gehen beim J2ME leider nicht. Deswegen hat mir da Java ist auch eine insel 8 leider auch nicht geholfen.


----------



## The_S (26. Okt 2009)

Du hast nen InputStream. Der entspricht in diesem Fall deinem FileReader/FileInputStream.


----------



## MC_Basstard (26. Okt 2009)

aso
ok danke dann werd ich mal schaun was ich da so zambring


----------



## MC_Basstard (26. Okt 2009)

Irgendwie gibts des FileInputStream und FileOutputStream nich .


----------



## The_S (26. Okt 2009)

MC_Basstard hat gesagt.:


> Irgendwie gibts des FileInputStream und FileOutputStream nich .



Brauchst du ja nicht. Du hast ja schon den InputStream. Verwende einfach den (hab ich doch geschrieben).


----------



## MC_Basstard (26. Okt 2009)

Aso...
omg
Dann muss ich quasi des Zeug was bei dem Java Blog Buch drinstehn hab alles um schreiben.
Ok des kann dauern ich meld mich wieder wenn ich irgendwas zamgebracht hab.


----------



## The_S (26. Okt 2009)

Naja ... so viel ist das jetzt auch wieder nicht zum Umschreiben ...


----------



## MC_Basstard (26. Okt 2009)

wenn man sich damit gscheid auskennt nich ^^
aba mal schaun was ich so zambring wenn ich nich weiterkomm meld ich mich wieder


----------



## MC_Basstard (4. Nov 2009)

so habs hinbekommen

nur wenn ich die Tabelle nun runterscroll zeigts nen Fehler an

arrayindexoutofboundsexception 3

Des laggt dann iwie beim scrolln und es verschwindet alles nur manches erscheint aba oft öfters als es sollte ka wie man des beschreiben soll aber wenn ich weiterscroll gehts aufeinmal irgendwo wieder normal weiter.
Kannste mir da weiterhelfen?

Das hab ich jetzt:


```
public Telefonbuch()
	{
		try {
			dateilesen();
			} 
		catch (Exception e){};
	}
		
		public void dateilesen() throws IOException
		{	
		
		DefaultTableModel model = new DefaultTableModel(
			new Object[0][4],  //  4 == Spaltenzahl 
			new String[]{null});
		    String[][] rowData = new String[5000][4];
		
		 	FileReader fr = new FileReader("C:/Temp/1-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","Handynummer","Nummer","Abteilung"};
	
	frame.setDefaultCloseOperation(EXIT_ON_CLOSE );
	JTable table = new JTable( rowData, columnNames );
	frame.add( new JScrollPane(table) );
	frame.pack();
 	frame.setVisible( true );
 	frame.setSize(800,300);	
 	frame.setTitle("Telefonbuchtest");
 	frame.setResizable(true);
 	
 	
	}
```


----------



## The_S (5. Nov 2009)

Äh ... das ist jetzt aber kein J2ME mehr ...


----------



## MC_Basstard (5. Nov 2009)

stimmt...
is mir auch grad aufgefallen das ich hier ja im j2me Forum bin xD
sry
Hab mir jetzt mal gedacht ich versuchs erstmal aufn Pc bevor ich da am ´Handy was rummach.

Kann man mein Thema iwie verschieben und den Titel umbenennen?


----------



## The_S (5. Nov 2009)

Mach am Besten einfach noch ein neues Thema auf  .


----------



## MC_Basstard (9. Dez 2009)

Hallo Leute,
bin imma noch dabei n Telefonbuch zu machen xD
Versuche aber gerade, Daten aus ner txt Datei einzulesen. Hab hier was zamgeschrieben, was leider nich geht und vlt kann mir da nun jemand dabei helfen, dass es geht.


Das hier wär mal der Code wie ich im Java fürn PC aus einer .txt Datei den Text in eine Tabelle einlesen kann.
Diesen hab ich irgendwie versucht umzuschreiben, dass es für J2ME funktioniert, was mir leider nicht gelungen ist n Arbeitskollege hats versucht mir zu helfen ist aber auch gescheitert.


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





Und hier is der Code fürs J2ME

```
// Datei einlesen 
    	public void loadlist(){
    		 System.out.println("bla");
        InputStream is = this.getClass().getResourceAsStream("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

MFG Stefan


----------



## MiDniGG (9. Dez 2009)

```
InputStream is = this.getClass().getResourceAsStream("buch.txt");
```
 ist null. Deshalb auch die NullpointerException...

Liegt die Datei "buch.txt" auch direkt im bin-Ordner?

Also ich lese Textdateien in Java ME so ein:


```
DataInputStream dis = new DataInputStream(getClass().getResourceAsStream("/pfad/zur/datei/test.txt"));
StringBuffer sb = new StringBuffer();
int i = 0;
try {
   while((i = dis.read()) > -1) {
      sb.append((char)i);
   }
} catch (IOException e) {
   e.printStackTrace();
}
```

Dadurch steht der ganze Text der Datei dann schön im StringBuffer und ich kann damit Arbeiten...

Vllt. hilft das ja 

*Edit:* Wichtig auch der / vor dem Pfad!


----------



## MC_Basstard (10. Dez 2009)

Ab der Zeile   while((i = dis.read()) > -1)   gehts iwie nich weiter also da geht er irgendwie nich rein.
is echt komisch habsj etzt so angegeben


```
public void loadlist(){
    	DataInputStream dis = new DataInputStream(getClass().getResourceAsStream("D:Temp/buch.txt"));
    	StringBuffer sb = new StringBuffer();
    	int i = 0;
    	try {
    	   while((i = dis.read()) > -1) {
    	      sb.append((char)i);
    	   }
    	} catch (IOException e) {
    	   e.printStackTrace();
    	}
    }
```

hatte dafür zum überprüfen überall dazwischen System.out.println"..."; stehn damit ich wieder weiß wo er reingeht aba die Syste.out nach der zeile    while((i = dis.read()) > -1)    zeigts nimma an =(


----------



## MiDniGG (10. Dez 2009)

Also dass die Datei unter D:Temp/ ligt glaub nicht...

Wenn mich nicht alles täuscht kannst Du beim Handy sowieso nur relative Pfad gehen...
Leg die .txt einfach ins gleiche verzeichnis wie deine klasse(n) und ruf sie mit /buch.txt auf. (Wenn Du packages verwendest eben noch mit dem Pfad (ab /bin)).

Dass da nicht in die while-schleife gegangen wird liegt daran, dass es keine Daten zum Verarbeiten gibt. (Da i < 0)


----------



## MC_Basstard (11. Dez 2009)

ich brings einfach nich hin...

kann ich des so eigentlich in die liste einlesen?
was so n zeug angeht bin ich nich wirklich gut :-/



```
public void loadlist(){
    	DataInputStream dis = new DataInputStream(getClass().getResourceAsStream("/bin/handytest/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();
    	}
    	list.append(zeichenkette,null);
    }
```


----------



## MiDniGG (11. Dez 2009)

Prinzipiell müsste das mit der List gehen.
Jedoch bringt 
	
	
	
	





```
list.append(zeichenkette, null);
```
 nicht viel, da zeichenkette ja ein kompletter String ist. Somit würde in einer Zeile die komplette Textdatei stehen.
Zum Einlesen nochmal siehe j2meforum.org


----------



## MiDniGG (11. Dez 2009)

Also mit folgendem Code:


```
public class Handy extends MIDlet {
	Display	disp = null;
	List lList = null;
	public Handy() {
		disp = Display.getDisplay(this);
		lList = new List("Liste", List.IMPLICIT);
		loadlist();
	}
	public void loadlist() {
		DataInputStream dis = new DataInputStream(getClass().getResourceAsStream("/buch.txt"));
		StringBuffer sb = new StringBuffer();
		int i = 0;
		try {
			while((i = dis.read())>-1) {
				sb.append((char)i);
				i = i+1;
			}
			dis.close();
		} catch(IOException e) {
			e.printStackTrace();
		}
		lList.append(sb.toString(), null);
	}
	public void startApp() {
		disp.setCurrent(lList);
	}
	public void pauseApp() {}
	public void destroyApp(boolean unconditional) {}
}
```

...und der angehängten Ordnerstruktur geht alles ohne Probleme bei mir...


----------



## MC_Basstard (11. Dez 2009)

Großen Dank!

Jetzt muss ich nur noch herrausfinden wie ich jede Zeile aus der txt Datei in ne neue Zeile der Liste einfügen kann.


----------



## MiDniGG (11. Dez 2009)

Du prüfst einfach ob ein Zeilenumbruch vorhanden ist.

Weiß nicht ob das bei ME so geht, aber:


```
System.getProperties().getProperty("line.separator");
```

Und das dann eben in ein Array reinpacken. (ArrayLists gibts ja bei ME nicht)


----------



## MC_Basstard (11. Dez 2009)

Ja leider...

System.getProperties().getProperty("line.separator");

Gibt es leider auch nicht.


----------



## MiDniGG (14. Dez 2009)

Dann musst Du entweder auf "\n" oder "\t\n" prüfen... Musst halt mal ein bisschen rumprobieren...


----------

