-1
votes

Comment écrirais-je ce code pour le faire lire un fichier qui a une quantité inconnue de lignes?

import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Process_TCPProbe_dm{

   public static void main(String[] args) throws IOException {
      
       //Extracting the port numbers from the file names passed in the arguments
       String portNumber1 = args[1].substring(9, 14);
       String portNumber2 = args[2].substring(9, 14);
       String portNumber3 = args[3].substring(9, 14);
              
       int i = 0;
       Scanner s = new Scanner(new FileReader(args[0]));
       //Initialising array of contents with length equals to number of lines in the input file
       String[] contents = new String[18];      
       while(true)
       {
           if (i == 18)
               break;//Skipping the last line of the file
           //Replaces the whitespace with comma and stores in the string array
           contents[i] = s.nextLine().replace(" ", ",");
          
           i++;  
       }
      
       BufferedWriter bw1 = new BufferedWriter(new FileWriter(args[1]));
       BufferedWriter bw2 = new BufferedWriter(new FileWriter(args[2]));
       BufferedWriter bw3 = new BufferedWriter(new FileWriter(args[3]));
       //Iterating the array of contents using a for each loop
       for(String each:contents)
       {
           //Writing the string to the corresponding file which matches with the portNumber
           //along with a new line
           if (each.contains(portNumber1))
           {
               bw1.write(each);
               bw1.newLine();
              
           }
           else if(each.contains(portNumber2))
           {
               bw2.write(each);
               bw2.newLine();
              
           }
           else if(each.contains(portNumber3))
           {
               bw3.write(each);
               bw3.newLine();
              
           }
       }
       //This is necessary to finally output the text from the buffer to the corresponding file
       bw1.flush();
       bw2.flush();
       bw3.flush();
      
       //Closing all the file reading and writing handles
       bw1.close();
       bw2.close();
       bw3.close();
       s.close();
   }

}
Here is my code, however, it only reads a file the size of 19 lines. I know i could use an ArrayList, but I'm not exactly sure how to go about it. I hope my question makes sense. If it'll help you understand better ill put the purpose of the code below.This image is of the instructions for what the code is written for. It might just be extra information, but I put it here in case it'll better help to explain my question.

1 commentaires

Les questions que vous devriez vraiment vous demander sont (a) pourquoi lisez-vous en ligne par ligne et (b) pourquoi stockez-vous les lignes dans un tableau? Si vous voulez simplement lire l'ensemble du contenu d'un fichier texte à afficher tel qu'il est, il vaut mieux lire le tout à la fois (voir l'API Fichiers pour cela). Si vous souhaitez traiter la ligne par ligne, vous pouvez le faire sans stocker dans un tableau / arraylist. Si vous lisez des paramètres pour un jeu, vous devez initialiser vos variables au lieu de créer une chaîne [] / ArrayList.


3 Réponses :


0
votes

remplacer xxx

avec xxx

et xxx

avec xxx

enfin, supprimer i et toutes les autres conditions et instructions en fonction de la valeur du i .


0 commentaires

2
votes

Il suffit de remplacer votre tableau avec des lins de tableau comme ceci arraylist list = nouvelle liste <> (); puis remplacez [I] = S.Nextline (). Remplacez ("", ","); avec list.add (S.Nextline (). Remplacer ("", "", ")); Après cela, vous n'avez plus besoin de compter "i" et de vous casser en boucle en cas de condition. Il suffit d'ajouter scanner.hasnext () dans une condition de temps.


0 commentaires

2
votes

Votre condition de boucle doit être basée sur scanner.hasnextline code> et vous n'avez pas besoin de la variable i code>. Utilisez un ArrayList CODE> pour marquer une quantité inconnue d'éléments.

final List<String> contents = Files.lines(Paths.get(args[0]))
    .map(s->s.replace(" ", ",")).collect(Collectors.toList());


0 commentaires