2016-04-24 17 views
0

Die Idee besteht darin, ein Array von 10 Elementen & mit Zufallszahlen zu bevölkern. Erhalte dann einen Ausgabedateinamen vom Benutzer und drucke meinen Namen, gefolgt vom Inhalt des Arrays, in diese neue Datei. Wenn der Benutzer einen vorhandenen Dateinamen auswählt, muss das Programm dies wissen und diese Datei nicht überschreiben.Mit einer Methode in Java 8, wie schreibe ich ein Array in eine Datei nach der ersten Prüfung, ob es bereits existiert?

private static void arrayOfTen() throws IOException { 
    String userFilename; 
    int[] randomList = new int[10]; 
    for (int i = 0; i < randomList.length; i++) { 
     randomList[i] = (int) (Math.random() * 10); 
    } 
    System.out.println("An array of ten elements has been populated with" + 
      "random integers. Please name a new file in which to print " + 
      "this array: "); 
    userFilename = input.nextLine(); 
    java.io.File file = new java.io.File(userFilename); 

    // Check to see if filename already in use & exit if so 
    if (file.exists()) { 
     System.out.println("File already exists."); 
     System.exit(0); 
    } 
    else { 
     // Create output file 
     java.io.PrintWriter outfile = new java.io.PrintWriter(file); 

     // Write formatted output to file 
     outfile.print("Name"); 
     for (int i = 0; i < randomList.length; i++) { 
      outfile.println(randomList[i]); 
     } 
     outfile.close(); 
    } 
} 
+3

Was ist Ihr Problem jetzt? – Flown

Antwort

0

Es ist nicht klar, was Ihre eigentliche Problem ist aber, da Sie für Java 8 gefragt, lassen Sie uns die Dinge besprechen, die Sie tun können und sollten besser:

private static void arrayOfTen() throws IOException { 
    int[] randomList = ThreadLocalRandom.current().ints(10, 0, 10).toArray(); 
    System.out.println("An array of ten elements has been populated with" + 
      "random integers. Please name a new file in which to print " + 
      "this array: "); 
    String userFilename = input.nextLine(); 
    // Create output file, demand creating a new file 
    try(BufferedWriter w = Files.newBufferedWriter(
      Paths.get(userFilename), StandardOpenOption.CREATE_NEW)) { 
     // Write formatted output to file 
     w.write("Name"); 
     for(int value: randomList) { 
      w.write(String.valueOf(value)); 
      w.newLine(); 
     } 
    } 
} 

Das Wichtigste ist das try(…) Konstrukt, um sicherzustellen, richtiges Schließen der Datei, was für Java 8 nicht neu ist, sondern eine Java 7-Funktion. Dann stellen Sie sicher, dass der Ausgabekanal nur geöffnet wird, wenn die Datei neu ist, d. H. Nicht existiert, indem Sie einen Writer erstellen, der StandardOpenOption.CREATE_NEW verwendet. Versuche, eine vorhandene Datei zu öffnen, führen zu einem java.nio.file.FileAlreadyExistsException; Dies erspart Ihnen manuelle Kontrollen vor dem Öffnen. Beachten Sie außerdem, dass Sie alle Elemente eines Arrays mit der for-each-Syntax for(int value: array) (seit Java 5) verarbeiten können.

In Bezug auf bestimmte Java 8-Funktionen können Sie das gewünschte Array mit dem einen Liner ThreadLocalRandom.current() .ints(10, 0, 10).toArray() generieren, aber tatsächlich muss kein Array generiert werden, da Sie direkt vor dem Schreiben einen neuen Zufallswert anfordern könnten:

private static void arrayOfTen() throws IOException { 
    System.out.println("Please name a new file in which to print ten random integers: "); 
    String userFilename = input.nextLine(); 
    // Create output file, demand creating a new file 
    try(BufferedWriter w = Files.newBufferedWriter(
      Paths.get(userFilename), StandardOpenOption.CREATE_NEW)) { 
     // Write formatted output to file 
     w.write("Name"); 
     ThreadLocalRandom r=ThreadLocalRandom.current(); 
     for(int i=0; i<10; i++) { 
      w.write(String.valueOf(r.nextInt(10))); 
      w.newLine(); 
     } 
    } 
} 

Beachten Sie, dass beide Beispiele ursprünglichen Code Verhalten nachzubilden von "Name" am Anfang der Datei (ohne Leitungsabschluss) zu schreiben. Ich habe keine Ahnung von dem Zweck dieser, obwohl ...