2016-02-25 1 views
-1

J'ai un problème avec ce code pour les devoirs. Chaque fois que je l'exécute, la console n'affiche rien, je suis capable d'écrire tout ce que je veux, mais le script ne se termine pas tout seul, comme s'il s'agissait d'une boucle infinie. De plus, le fichier de sortie n'écrit pas non plus. J'étudie actuellement les flux d'entrée et de sortie, donc je ne sais pas vraiment ce que je pourrais faire d'autre pour résoudre ce problème. Toute aide sera très appréciée.PrintWriter ne pas écrire dans le fichier. [Java]

public class PublicationListingProcess1 extends Publication implements Serializable{ 
static Publication PublicationArray[]; 
static String a, n, line; 
static int y, c = 0, p, count = 0; 
static long z; 
static double s; 

enum PublicationTypes{PUBLICATIONCODE, PUBLICATIONNAME, PUBLICATIONYEAR, PUBLICATIONAUTHORNAME, PUBLICATIONCOST, PUBLICATIONNBPAGES} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    try{ 
     File f = new File("PublicationData_Input.txt"); 
     Scanner input = new Scanner(f); 
     while(input.hasNextLine()) 
     { 
      c++; 
     } 
     PublicationArray = new Publication[c]; 

    System.out.println("Welcome to this organizing software."); 
    System.out.print("Please enter the destiny file for output: "); 
    Scanner kb = new Scanner(System.in); 

    File outFile = new File (kb.next()+".txt"); 
    FileWriter output = new FileWriter (outFile); 
    PrintWriter writer = new PrintWriter (output); 

    while(input.hasNextLine()) 
    { 
     String [] split = input.nextLine().split(" "); 

     for(int i = 0; i < split.length; i++) 
     { 
      z = Long.parseLong(split[0]); 
      n = split[1]; 
      y = Integer.parseInt(split[2]); 
      a = split[3]; 
      s = Double.parseDouble(split[4]); 
      p = Integer.parseInt(split[5]); 
      PublicationArray[count] = new Publication(z, n, a, y, s, p); 
      writer.println(PublicationArray[count]); 
      count++; 
     } 

    } 
output.close(); 
input.close(); 
    } 

    catch(RuntimeException e) 
    { 
     e.getMessage(); 
    } 
    catch (FileNotFoundException ex) { 
     // TODO Auto-generated catch block 
     ex.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

}

+3

Vous ne fermez jamais le 'PrintWriter' – 3kings

+0

vous lisez dans un fichier texte vide .. votre programme n'a rien à analyser – tmaxxcar

+0

essayez de passer dans un fichier texte avec 1 ou 2 lignes d'échantillons pour voir ce que, le cas échéant, vous les erreurs obtenir – tmaxxcar

Répondre

0

Code Problématiques:

while(input.hasNextLine()) 
    { 
     c++; 
    } 

Scanner.hasNextLine() ne fait pas déplacer le pointeur vers l'avant. Donc, si votre fichier contient quelque chose, vous avez une boucle infinie.

Pour résoudre cette boucle infinie, enlevez simplement ce bloc. Il ne fait rien avec une signification apparente, au moins dans le code affiché. Supprimez le bloc while et remplacez le tableau PublicationArray d'un tableau par un ArrayList.

import java.util.*; 

public class PublicationListingProcess1 extends Publication implements Serializable{ 
    static ArrayList<Publication> pubs; 
    static String a, n, line; 
    static int y, p, count = 0; 
    static long z; 
    static double s; 

    enum PublicationTypes{ 
     PUBLICATIONCODE, 
     PUBLICATIONNAME, 
     PUBLICATIONYEAR, 
     PUBLICATIONAUTHORNAME, 
     PUBLICATIONCOST, 
     PUBLICATIONNBPAGES; 
    } 

    public static void main(String[] args) { 
    // TODO Auto-generated method stub 
     try{ 
       File f = new File("PublicationData_Input.txt"); 
      Scanner input = new Scanner(f); 

       pubs = new ArrayList<>(); 

      System.out.println("Welcome to this organizing software."); 
      System.out.print("Please enter the destiny file for output: "); 
      Scanner kb = new Scanner(System.in); 

      File outFile = new File(kb.next()+".txt"); 
      FileWriter output = new FileWriter(outFile); 
      PrintWriter writer = new PrintWriter(output); 

      while (input.hasNextLine()) { 
       String[] split = input.nextLine().split(" "); 

       for (int i = 0; i < split.length; i++) { 
        z = Long.parseLong(split[0]); 
        n = split[1]; 
        y = Integer.parseInt(split[2]); 
        a = split[3]; 
        s = Double.parseDouble(split[4]); 
        p = Integer.parseInt(split[5]); 
        pubs.add(new Publication(z, n, a, y, s, p)); 
        writer.println(pubs.get(count); 
        count++; 
       } 

      } 
      output.close(); 
      input.close(); 
     } catch(RuntimeException e) { 
      e.getMessage(); 
     } catch (FileNotFoundException ex) { 
      // TODO Auto-generated catch block 
      ex.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

Le code exemple ci-dessus votre flux de conservé le contrôle principal, mais il peut y avoir une meilleure façon autour.

+0

Merci pour la réponse, mais j'ai utilisé cette boucle pour compter combien de lignes il y a dans le document puisque je dois entrer chaque ligne comme information dans l'objet PublicationArray. –

+0

OK, mon erreur. Je vais mettre à jour la réponse. – glee8e

+0

J'ai effectivement découvert le problème. Ce qui est arrivé, c'est que j'ai supposé que le pointeur se réinitialisait. Maintenant, j'ai ouvert le flux deux fois depuis que je sais que la réouverture d'un flux est impossible. Maintenant, cela fonctionne, ce que j'essaie de comprendre maintenant, c'est comment écrire l'objet à classer. Merci d'avoir répondu. N'a pas pensé à la liste de tableau, merci pour les commentaires! –