Nada

Rutiner för in- och utmatning i Java

För att underlätta avlusning av den genererade koden kan du använda dig av Javas biblioteksrutiner. Jag tar här endast upp rutiner för in- och utmatning men naturligtvis kan du använda dig av andra biblioteksrutiner. Ett enkelt sätt att bekanta sig med dessa rutiner är att skriva ett kort program i Java, kompilera det och därefter disassemblera den resulterande .class-filen.

Klassen java.lang.System tillhandahåller tre statiska varibler (err, out och in) av typ java.io.PrintStream och java.io.InputStream som svarar mot stderr, stdout och stdin i C. Klassen java.io.PrintStream definierar en överlagrad metod kallad print för bland annat integer och double.

Några av de metoder som är definierade för java.io.PrintStream:

     public void print(int);
     public void print(double);
     public synchronized void print(String);
     public synchronized void print(char);
     public void println(); // endast radframmatning
     public void flush();   // svarar mot fflush(FILE *) i C
Endast print(String) och print(char) är synkroniserade (thread-safe) och alla de andra print-metoderna är implementerade med hjälp av dessa. För varje print-metod finns en motsvarande println-metod som avslutar med radframmatning.

Ett bra sätt komma underfund med utmatningsrutinerna är att kompilera nedanstående enkla klass och titta på den genererade koden.

public final class foo
{
  public static void main(String args)
  {
    int i = 1;
    double d = 2;
 
    System.out.print(i); System.out.println();
    System.out.print(d); System.out.println();
    System.out.flush();
  }
}
Koden finns på kurskatalogen som /info/primp96/labb7/foo.java så för att kompilera och disassemblera programmet ger du följande kommandon:
cp /info/primp96/labb7/foo.java .
javac foo.java
/info/primp96/labb7/guava/bin/guavad foo.class
När du disassemblerar foo.class kan det vara bra att ha följande uppställning framför sig:

klassfältnamntypsignatur
java.lang.System out Ljava/io/PrintStream;
java/io/PrintStream print (för int) (I)V
java/io/PrintStream print (för double) (D)V
java/io/PrintStream println (för radframmatning) ()V
java/io/PrintStream flush ()V

För inmatning används lämpligen java.io.DataInputStream. Jag listar bara de viktigaste metoderna här nedan. Den som är intresserad av detaljer kan använda sig av den dokumentation som finns tillgänglig för java.io.DataInputStream och java.io.PrintStream.

java.io.DataInputStream:

public DataInputStream(InputStream in);

// metoder för att läsa int, double och byte samt en hel rad
public final int readInt() throws IOException;
public final double readDouble() throws IOException;
public final byte readByte() throws IOException;
public final String readLine() throws IOException;

// mer avancerade metoder, läs on-line dokumentationen
public final int read(byte b, int off, int len) throws IOException;
public final int skipBytes(int n) throws IOException;
Sist följer ett enkelt testprogram /info/primp96/labb7/bar.java
import java.io.DataInputStream;

public final class bar
{
  public static void main(String args) 
     throws java.io.IOException, NumberFormatException
  {
    System.out.print("Ge ett heltal: ");
    System.out.flush();
    int i = Integer.parseInt((new DataInputStream(System.in)).readLine());
    System.out.println(i);
    System.out.flush();
  }
}

^ Upp till aktuella kurssidan.


Sidansvarig: <joachim@nada.kth.se>
Senast ändrad 4 december 1996
Tekniskt stöd: <webmaster@nada.kth.se>