2017-10-19 18 views
-1

Mon code Java reçoit des données de flux comme Twitter. J'ai besoin de stocker les données par ex. 10000 enregistrements pour chaque fichier. Donc, j'ai besoin de recréer le file writer et buffered writer pour créer un nouveau fichier, puis écrire des données sur celui-ci.java.io.IOException: flux fermé. Quel est le meilleur moyen d'écrire des données de flux dans plusieurs fichiers?

// global variables 
    String stat; 
    long counter = 0; 
    boolean first = true; 
    Date date; 
    SimpleDateFormat format; 
    String currentTime; 
    String fileName; 
    BufferedWriter bw = null; 
    FileWriter fw = null; 

    public static void main(String[] args) { 
     String dirToSave = args[0]; 
     String fileIdentifier = args[1]; 

     createFile(dirToSave, fileIdentifier); 

     StatusListener listener = new StatusListener() { 
      @Override 
      public void onStatus(Status status) { 
       stat = TwitterObjectFactory.getRawJSON(status); 

       try { 
        if(bw!=null){ 
         bw.write(stat + "\n"); 
        } 
       } catch (IOException ex) { 
        System.out.println(ex.getMessage()); 
       } 
       counter++; 

       if (counter == 10000) { 
        createFile(dirToSave, fileIdentifier); 
        try { 
         TimeUnit.SECONDS.sleep(5); 
        } catch (InterruptedException ex) { 
         System.out.println(ex.getMessage()); 
        } 
        counter = 0; 
       } 
      } 
     }; 

TwitterStream twitterStream = new TwitterStreamFactory(confBuild.build()).getInstance(); 

    twitterStream.addListener(listener); 

    // twitterStream.filter(filQuery); 
    } 

public static void createFile(String path, String fileIdentifier) { 
     date = new Date(); 
     format = new SimpleDateFormat("yyyyMMddHHmm"); 
     currentTime = format.format(date); 
     fileName = path + "/" + fileIdentifier + currentTime + ".json"; 

// if there was buffer before, flush & close it first before creating new file 
     if (!first) { 
      try { 
       bw.flush(); 
       bw.close(); 
       fw.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(LocalFile_All_en.class 
         .getName()).log(Level.SEVERE, null, ex); 
      } 
     } else { 
      first = false; 
     } 

     // create a new file 
     try { 
      fw = new FileWriter(fileName); 
      bw = new BufferedWriter(fw); 
     } catch (IOException ex) { 
      Logger.getLogger(Stack.class 
        .getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

Cependant, je reçois toujours des erreurs après quelques heures.

SEVERE: null 
java.io.IOException: Stream closed 

EDIT: Le message d'erreur indique que, ces codes jettent l'erreur

if (counter == 10000) { 
        createFile(dirToSave, fileIdentifier); 
... 

et

bw.flush(); 

Quel est le problème de mon code? ou existe-t-il un meilleur moyen d'écrire des données de flux comme celle-ci?

+0

Est-ce un programme multithread? – Alex

+0

@Alex non, ce n'est qu'un seul thread. Recevoir des données de flux et stocker dans des fichiers. –

+0

Comment la méthode 'onStatus' est-elle appelée? et quelle ligne jette l'exception? – Alex

Répondre

1

Si cette erreur vient de temps en temps et que l'écriture après cette erreur est de nouveau ok, je pense qu'il peut arriver que bw est fermé et pas encore rouvert tandis que onStatus() essaie d'écrire de l'effacer. Par conséquent, bw peut être non nul mais fermé. Vous devez synchroniser la fermeture/ouverture en quelque sorte.

Par exemple, faites ces choses dans onStatus() comme si vous n'écriviez pas directement à bw mais avec des rappels qui gèrent le nouveau fichier de fermeture/réouverture.

Mise à jour: en supposant ici que ce twitterStream peut appeler onStatus() sans attendre l'appel précédent terminé. Le premier appel vient de fermer le flux et le second est juste après avoir écrit. Rare, mais arrivera dans une longue période de temps.

Update2: cela s'applique également à la pièce flush(). J'ai ajouté cela aussi comme un petit commentaire déjà mais les gens disent souvent de se débarrasser de la statique et surtout de la statique globale en Java en argumentant que cela va causer de gros problèmes plus tard qui sont difficiles à résoudre/déboguer. Cela pourrait être un bon exemple.

Lire aussi:

Why are static variables considered evil?

Volatile Vs Static in java

Ce dernier a un exemple comment sychronize demandes simultanées.