- Internetprogrammering 98/99 -

Kommandoavkodning (senast ändrat 990412)

Exempel som hjälp för laboration 6. Exempel som visar hur en sträng på given form (KOMMANDO?ARG1?ARG2) kan avkodas.

Steg 1: använd klassen StringTokenizer

För att avkoda en sträng kan klassen java.util.StringTokenizer användas.

Kort beskrivning av StringTokenizer

Klassen instansieras med en sträng som argument.
Klassen delar upp en sträng på "tokens", dvs på strängens olika delord.
Om vi inte anger något annat så kommer strängen "delas" vid tecknen " \t\n\r\f", dvs mellanslag, tab, ny rad, radframmatning och form-feed.

Exempel

Om vi tex instansierar klassen på följande sätt
new StringTokenizer("sendMessageTo?4711?subject?message hej hopp");
så blir delorden:
sendMessageTo?4711?subject?message
hej
hopp

Läsa ut information ur en sträng mha StringTokenizer

För att läsa information ur en sträng används meddelandena

Ett exempel med hasMoreTokens() och nextToken()

String line = "sendMessageTo?4711?subject?message hej hopp";

StringTokenizer s1 = new StringTokenizer(line);
for(int i = 1; s1.hasMoreTokens(); i++)
   System.out.println("Test1 " + i + ": " + s1.nextToken());

Utskriften blir:
Test1 1: sendMessageTo?4711?subject?message
Test1 2: hej
Test1 3: hopp

Steg 2: StringTokenizer med angivande av avgränsare

Det förra exemplet med användande av "defaultvärden" för ordmellanrummen passar inte riktigt bra i vårt fall (med ? som avskiljare).
Som tur är är detta enkelt att åtgärda. Vi kan helt enkelt ange detta vid instansieringen av StringTokenizer, dvs vi kan som andra argument till konstruktorn ge en sträng bestående av dom avskiljare vi vill använda.
Om vi tex vill använda frågetecken (?) som avskiljare instansierar vi på följande sätt:
new StringTokenizer(line, "?");

Exempel

Ett exempel där vi använder frågetecken som avskiljare. Vi har också i testsyfte explicit lagt in radbrytningar (\n) i strängen.
String line = "sendMessageTo?4711?subject?message hej hopp\nett\nmeddelande som är långt\n\ntomt på vissa rader\n.";

StringTokenizer s2 = new StringTokenizer(line, "?");
for(int i = 1; s2.hasMoreTokens(); i++)
   System.out.println("Test2 " + i + ": " + s2.nextToken());

Utskriften blir (observera att svenska tecken inte fungerar):
Test2 1: sendMessageTo
Test2 2: 4711
Test2 3: subject
Test2 4: message hej hopp
ett
meddelande som ?r l?ngt

tomt p? vissa rader
.

Steg 3: Uppdelning av sträng på meddelande och argument

Ett exempel där en given sträng delas upp på  kommando respektive argument.
Metod som anropas med sträng:
public static void test3(String line) {
  String method;
  String [] arguments;

  System.out.println("Input: " + line);
  StringTokenizer s3 = new StringTokenizer(line, "?");
  int tokensLen = s3.countTokens();
  if(tokensLen >= 1) {
     method = s3.nextToken();
     arguments = new String[tokensLen - 1];
     for(int i = 0; s3.hasMoreTokens(); i++)
        arguments[i] = s3.nextToken();
     System.out.println("Method =  " + method);
     System.out.println("Arguments = " );
     for(int i = 0; i < arguments.length; i++)
        System.out.println(i + ": " + arguments[i]);
  }
 }

Test:
test3("sendMessageTo?4711?subject?message hej hopp\nett\nmeddelande som är långt\n\ntomt på vissa rader\n.");
Utskriften blir (återigen, svenska tecken hanteras inte bra):
Input: sendMessageTo?4711?subject?message hej hopp
ett
meddelande som ?r l?ngt

tomt p? vissa rader
.
Method =  sendMessageTo
Arguments =
0: 4711
1: subject
2: message hej hopp
ett
meddelande som ?r l?ngt

tomt p? vissa rader
.

Steg 4: Inmatning av teststrängar från terminal

Vi kan enkelt skriva en rutin för inmatning av strängar som "styckas upp" mha föregående metod. Inmatningen avslutas med kommandot quit från terminalen.
String line;
BufferedReader in;

in = new BufferedReader(new InputStreamReader(System.in));
for(;;){
   System.out.print(">");
   line = in.readLine();
   if(line.equals("quit")) break;
   test3(line);
}

En session skulle kunna se ut som följer (nu fungerar svenska tecken!):
>test?123?hej?åäö
Input: test?123?hej?åäö
Method =  test
Arguments =
0: 123
1: hej
2: åäö
>sendMessageTo?kalle?Info?Hej vi konstruerar en socket
Input: sendMessageTo?kalle?Info?Hej vi konstruerar en socket
Method =  sendMessageTo
Arguments =
0: kalle
1: Info
2: Hej vi konstruerar en socket
>quit

Alla exempel i en fil

I filen TestParse.java hittar du en fil med alla ovan beskrivna exempel med en metod per steg.

^ Upp till kursens hemsida.


Sidansvarig: <bjorne@nada.kth.se>
Senast ändrad 12 april 1999