Java Streams: Dateioperationen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Java Streams: Dateioperationen

    Die Java Utilities Scanner und Formatter sind zweifellos sehr komfortabel.
    In dieser Übung lernt ihr [coderwiki]Informationen/Streams[/coderwiki] kennen und könnt euch von deren Performance überzeugen.

    Quellcode

    1. import java.io.*;
    2. import java.util.*;
    3. /**
    4. * @author Torben Brodt
    5. * @version 1.0
    6. *
    7. * <p />Performance Vergleich zwischen Streams und den Scanner/Formatter Utilities
    8. * <p />Funktioniert ab Java 1.5
    9. */
    10. public class A07_Randoms {
    11. // Globale Variablen fuer Sprachdateien und zur Konfiguration
    12. final static int max=100000;
    13. final static String writeSuccess = "Es wurden "+max+" Zufallszahlen in %s geschrieben\n\n";
    14. final static String middle = "Das arithmetische Mittel lautet: %d\n\n";
    15. /**
    16. * MAIN Funktion ruft das Abfragemenue auf
    17. * @param args -> keine Parameter
    18. * @throws IOException
    19. */
    20. public static void main(String[] args) throws IOException {
    21. menu(0);
    22. }
    23. /**
    24. * Schnelles Verfahren zum Datei einlesen
    25. * @param filename Dateiname
    26. * @throws IOException
    27. */
    28. static void readStream(String filename) throws IOException {
    29. double mitte=0;
    30. DataInputStream input = new DataInputStream(
    31. new BufferedInputStream(
    32. new FileInputStream(filename)));
    33. for(int i=0; i<max; i++)
    34. mitte += input.readDouble();
    35. input.close();
    36. System.out.printf(middle, mitte/max);
    37. }
    38. /**
    39. * Schnelles Verfahren zum Datei auslesen
    40. * @param filename Dateiname
    41. * @throws IOException
    42. */
    43. static void writeStream(String filename) throws IOException {
    44. DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(filename)));
    45. for(int i=0; i<max; i++)
    46. output.writeInt((Math.random()*100));
    47. output.close();
    48. System.out.printf(writeSuccess, filename);
    49. }
    50. /**
    51. * Einfaches Verfahren zum Datei schreiben
    52. * @param filename Dateiname
    53. * @throws FileNotFoundException
    54. */
    55. static void writeFormatter(String filename) throws FileNotFoundException {
    56. Formatter output = new Formatter(new File(filename));
    57. for(int i=0; i<max; i++)
    58. output.format((Math.random()*100) + "\n");
    59. output.close();
    60. System.out.printf(writeSuccess, filename);
    61. }
    62. /**
    63. * Einfaches Verfahren zum Datei auslesen
    64. * @param filename Dateiname
    65. * @throws FileNotFoundException
    66. */
    67. static void readScanner(String filename) throws FileNotFoundException {
    68. double mitte=0;
    69. Scanner input = new Scanner(new File(filename));
    70. while(input.hasNextLine())
    71. mitte += Integer.parseInt(input.nextLine());
    72. input.close();
    73. System.out.printf(middle, mitte/max);
    74. }
    75. /**
    76. * Menue (kann sich auch selbst aufrufen)
    77. * @param eingabe Tastatureingabe als Integer
    78. * @throws IOException
    79. */
    80. static void menu(int eingabe) throws IOException {
    81. switch(eingabe) {
    82. case 0: //Hauptmenue
    83. menu(ask("Bitte waehlen Sie:\n" +
    84. "1: Zahlen erzeugen und in Datei schreiben\n" +
    85. "2: Zahlen aus Datei einlesen und arithmetische Mittel berechnen\n" +
    86. "3: Programm beenden"));
    87. break;
    88. case 1: //1. Navigationsebene Schreibe
    89. menu(ask("Bitte waehlen Sie:\n" +
    90. "1: Mittels Formatter\n" +
    91. "2: Mittels Streams")+10);
    92. break;
    93. case 2: //1. Navigationsebene Lese
    94. menu(ask("Bitte waehlen Sie:\n" +
    95. "1: Mittels Scanner\n" +
    96. "2: Mittels Streams")+20);
    97. break;
    98. case 3: //1. Navigationsebene Beenden
    99. System.out.println("Auf Wiedersehen");
    100. System.exit(0);
    101. break;
    102. case 11: //Zahlen erzeugen und in Datei schreiben
    103. writeFormatter(askFilename());
    104. break;
    105. case 12: //Zahlen erzeugen und in Datei schreiben
    106. writeStream(askFilename());
    107. break;
    108. case 21: //Zahlen aus Datei einlesen und arithmetische Mittel berechnen
    109. readScanner(askFilename());
    110. break;
    111. case 22: //Zahlen aus Datei einlesen und arithmetische Mittel berechnen
    112. readStream(askFilename());
    113. break;
    114. default:
    115. System.out.println("Fehler in der Eingabe. Bitte erneu versuchen.");
    116. }
    117. if(eingabe > 3)
    118. menu(0);
    119. }
    120. /**
    121. * Gibt eine Frage aus und liest einen Integerwert von Tastatur ein und liefert ihn zurueck
    122. * @param question Die Frage
    123. * @return Die Eingabe
    124. */
    125. static int ask(String question) {
    126. System.out.println(question);
    127. java.util.Scanner input = new java.util.Scanner(System.in);
    128. return input.nextInt();
    129. }
    130. /**
    131. * Fragt nach dem Dateinamen und gibt diesen zurueck
    132. * @return die Eingabe
    133. */
    134. static String askFilename() {
    135. System.out.println("Bitte geben Sie einen Dateinamen ein:");
    136. java.util.Scanner input = new java.util.Scanner(System.in);
    137. return input.next();
    138. }
    139. }
    Alles anzeigen


    Programmablauf:
    Bitte waehlen Sie:
    1: Zahlen erzeugen und in Datei schreiben
    2: Zahlen aus Datei einlesen und arithmetische Mittel berechnen
    3: Programm beenden
    1
    Bitte waehlen Sie:
    1: Mittels Formatter
    2: Mittels Streams
    2
    Bitte geben Sie einen Dateinamen ein:
    zahlen.dat
    Es wurden 100000 Zufallszahlen in zahlen.dat geschrieben

    Bitte waehlen Sie:
    1: Zahlen erzeugen und in Datei schreiben
    2: Zahlen aus Datei einlesen und arithmetische Mittel berechnen
    3: Programm beenden
    2
    Bitte waehlen Sie:
    1: Mittels Scanner
    2: Mittels Streams
    2
    Bitte geben Sie einen Dateinamen ein:
    zahlen.dat
    Das arithmetische Mittel lautet: 49

    Bitte waehlen Sie:
    1: Zahlen erzeugen und in Datei schreiben
    2: Zahlen aus Datei einlesen und arithmetische Mittel berechnen
    3: Programm beenden
    3
    Auf Wiedersehen
  • wollt ihr die kompatiblität zwischen streams und den Java Utilities wahren, dann nehmt folgende Funktionen.

    Die ganzen [coderwiki]Informationen/Typecast[/coderwiki]s machen sich jedoch an der Laufzeit bemerkbar

    Quellcode

    1. static void readStream(String filename) throws IOException {
    2. double mitte=0;
    3. DataInputStream input = new DataInputStream(
    4. new BufferedInputStream(
    5. new FileInputStream(filename)));
    6. int i=0;
    7. StringBuffer line = new StringBuffer();
    8. while(i<max) {
    9. //Erstelle mir einen String bis Zeilenumbruch
    10. byte x = input.readByte();
    11. line.append((char)x);
    12. //Dann erhoehe den Zaehler und beginne mit der naechsten Zahl
    13. if(x == '\n') {
    14. i++;
    15. mitte += Double.parseDouble(line.toString());
    16. line = new StringBuffer();
    17. }
    18. }
    19. input.close();
    20. System.out.printf(middle, mitte/max);
    21. }
    Alles anzeigen


    Quellcode

    1. static void writeStream(String filename) throws IOException {
    2. DataOutputStream output = new DataOutputStream(
    3. new BufferedOutputStream(
    4. new FileOutputStream(filename)));
    5. for(int i=0; i<max; i++)
    6. output.writeBytes((Math.random()*100)+"\n");
    7. output.close();
    8. System.out.printf(writeSuccess, filename);
    9. }