2013-01-24 7 views
1

Je suis en train de comprendre la classe du scanner en java, quelqu'un pourquoi ce code est que l'impression de la première ligne dans la première partie et pas toutes les informations en partie 2.sauter nouvelle ligne

import java.io.ByteArrayInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.util.NoSuchElementException; 
import java.util.Scanner; 

public class BadParse { 

public static String getNextEntry(InputStream in) { 
    Scanner sin = new Scanner(in); 

    try { 
     String ssn = sin.next(); 
     String name = sin.next(); 
     int age = sin.nextInt(); 

     return name + "(" + ssn + ") is " + age + " years old."; 
    } catch (NoSuchElementException e) { 
     return null; 
    } 
} 

public static void putNextEntry(String ssn, String name, int age, OutputStream out) { 
    PrintWriter pout = new PrintWriter(new OutputStreamWriter(out)); 

    pout.print(ssn + " "); 
    pout.print(name + " "); 
    pout.print(age + " "); 
} 

public static void main(String[] args) throws IOException { 

    // Part I 
    String input = "1234567890 John 20\n0987654321 Beth 18\n2468101214 Jack 19\n"; 
    InputStream in = new ByteArrayInputStream(input.getBytes()); 

    String entry; 
    while ((entry = getNextEntry(in)) != null) { 
     System.out.println(entry); 
    } 

    // Part II 
    OutputStream out = new FileOutputStream("data"); 

    putNextEntry("1234567890", "John", 20, out); 
    putNextEntry("0987654321", "Beth", 18, out); 
    putNextEntry("2468101214", "Jack", 19, out); 

    out.close(); 
} 

}

J'ai essayé d'utiliser des délimiteurs, mais sans succès.

+1

N'ignorez jamais une exception que vous attrapez. Vous devriez au moins faire 'e.printStackTrace()' –

Répondre

2

Si vous exécutez un débogueur et parcourez la méthode getNextEntry, vous verrez que sur le deuxième appel, le Scanner lève un NoSuchElementException. La raison pour laquelle cela se produit est parce que le premier Scanner a consommé une partie du ByteArrayInputStream.

Une solution que vous pouvez faire est de créer la Scanner avant votre boucle while et passer dans le Scanner à getNextEntry au lieu de passer dans le ByteArrayInputStream.

public static String getNextEntry(Scanner sin) { 

... 

Scanner sin = new Scanner(in); 
String entry; 
while ((entry = getNextEntry(sin)) != null) { 

En ce qui concerne la partie 2, la PrintWriter n'est pas vidées. Si vous ajoutez pout.flush() au bas de putNextEntry cela devrait provoquer l'envoi de données à votre fichier. Pour les objets PrintWriter, les données sont uniquement vidées si vous appelez println, printf, format ou flush. Je recommande cependant de créer et de passer dans le PrintWriter similaire au scanner, cependant. Réduit les ressources créées et vous pouvez vider toute la fin après avoir appelé putNextEntry plusieurs fois.

+0

merci! qui a aidé – sola

2

Le problème est que vous créez l'objet Scanner à l'intérieur de getNextEntry et lorsque cet objet est détruit, il ferme le flux. Essayez de passer Scanner comme argument au lieu de stream like (et même pour PrintWriter):

import java.io.ByteArrayInputStream; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.util.NoSuchElementException; 
import java.util.Scanner; 

public class BadParse { 
public static String getNextEntry(Scanner sin) { 

    try { 
     String ssn = sin.next(); 
     String name = sin.next(); 
     int age = sin.nextInt(); 

     return name + "(" + ssn + ") is " + age + " years old."; 
    } catch (NoSuchElementException e) { 
     return null; 
    } 
} 

public static void putNextEntry(String ssn, String name, int age, PrintWriter pout) { 

    pout.print(ssn + " "); 
    pout.print(name + " "); 
    pout.print(age + " "); 
} 

public static void main(String[] args) throws IOException { 

    // Part I 
    String input = "1234567890 John 20\n0987654321 Beth 18\n2468101214 Jack 19\n"; 
    InputStream in = new ByteArrayInputStream(input.getBytes()); 
    Scanner sin = new Scanner(in); 

    String entry; 
    while ((entry = getNextEntry(sin)) != null) { 
     System.out.println(entry); 
    } 

    // Part II 
    OutputStream out = new FileOutputStream("data"); 
    PrintWriter pout = new PrintWriter(new OutputStreamWriter(out)); 

    putNextEntry("1234567890", "John", 20, pout); 
    putNextEntry("0987654321", "Beth", 18, pout); 
    putNextEntry("2468101214", "Jack", 19, pout); 

    pout.close(); 
} 
} 
+0

ok merci je commençais à paniquer, la fermeture à la fin aussi provoque le flush – sola