2016-10-29 4 views
0

Mon problème est que StringTokenizer semble en lecture seule la première ligne de ip.txtJava StringTokenizer lecture seule première ligne

Ce que je suis en train de faire est de charger une liste d'adresses IP de « ip.txt » et enregistrez-le dans un tableau pour pinger automatiquement les appareils sur mon réseau pour voir si leur en ligne. Peu importe ce que j'essaie, je ne peux pas obtenir plus que la première ligne de "ip.txt" dans le tableau. Mon délimiteur est "//" et le nom de l'adresse IP est également stocké dans le fichier txt. J'ai inclus le code et un échantillon du fichier texte.

Merci d'avance !!

public class IP { 
    public static IP[] ips = new IP[100]; 
    public static int total_ips=0; 

    String name; 
    String ip1; 
    String ip2; 
    String ip3; 
    String ip4; 
    String fullIP; 

    public static void read_ips() throws FileNotFoundException{ 

     FileInputStream fstream1 = new FileInputStream("ip.txt"); 

     String line; 
     String delimiter = "//"; 

     StringTokenizer tokenizer; 
     BufferedReader input = null;  
     try { 
      int i = 0; 
      int totalIps = 0; 

      input = new BufferedReader(new InputStreamReader(fstream1)); 
      line = input.readLine(); 

      //outer while 
      while(line != null) { 
      tokenizer = new StringTokenizer(line, delimiter); 

      while(tokenizer.hasMoreElements()) {//process tokens in line 
       ips[i] = new IP(); 
       ips[i].name = tokenizer.nextToken(); 
       ips[i].ip1 = tokenizer.nextToken(); 
       ips[i].ip2 = tokenizer.nextToken(); 
       ips[i].ip3 = tokenizer.nextToken(); 
       ips[i].ip4 = tokenizer.nextToken(); 
       ips[i].fullIP = ips[i].ip1+"."+ips[i].ip2+"."+ips[i].ip3+"."+ips[i].ip4; 
       i++; 
       totalIps = i; 

       System.out.println(line); 
      } 
      line = input.readLine(); //next line 
      }//close outer while 
      total_ips = totalIps; // count of total cars 
      System.out.println("total_ips after i++ "+total_ips); 
      }catch (FileNotFoundException e) { 
       System.out.println("Unable to open file " + fstream1); 
      } catch (IOException e) { 
       System.out.println("Unable to read from file " + fstream1); 
      }finally { 
       // Close the file 
       try { 
      if (input != null) 
       input.close(); 
       } catch (IOException e) { 
        System.out.println("Unable to close file " + fstream1); 
       } 
      } 
    } 
} 

Et voici un exemple de ip.txt

Desktop1//192//168//1//127// 
Desktop2//192//168//1//128// 
Desktop3//192//168//1//129// 
+2

Juste un rappel de ce que les Javadocs disent StringTokenizer. "... _StringTokenizer est une classe héritée qui est conservée pour des raisons de compatibilité, bien que son utilisation soit déconseillée dans le nouveau code.Toute personne qui recherche cette fonctionnalité utilise à la place la méthode split de String ou le package java.util.regex._. .. " –

+0

J'ai essayé d'exécuter votre code sur ma machine et ça fonctionne bien. Il lit tout le fichier ip.txt. –

Répondre

0

Votre code devrait fonctionner très bien. L'approche plus classique pour itérer sur la ligne BufferedReader un à la fois est en utilisant une expression comme:

while ((line = input.readLine()) != null) {. 

C'est la seule refactoring je l'ai fait à votre code et il fonctionne. Vous pouvez vouloir imprimer le fullIP afin de vérifier que vous le récupérez correctement.

Voici le code:

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.StringTokenizer; 

public class IP { 
    public static IP[] ips = new IP[100]; 
    public static int total_ips=0; 

    String name; 
    String ip1; 
    String ip2; 
    String ip3; 
    String ip4; 
    String fullIP; 

    public static void main(String[] args) throws IOException { 
     read_ips(); 
    } 
    public static void read_ips() throws FileNotFoundException{ 

     FileInputStream fstream1 = new FileInputStream("c:\\ips\\ip.txt"); 

     String line; 
     String delimiter = "//"; 

     StringTokenizer tokenizer; 
     BufferedReader input = null;  
     try { 
      int i = 0; 
      int totalIps = 0; 

      input = new BufferedReader(new InputStreamReader(fstream1)); 
      while ((line = input.readLine()) != null) { 
       tokenizer = new StringTokenizer(line, delimiter); 

       while(tokenizer.hasMoreElements()) {//process tokens in line 
        ips[i] = new IP(); 
        ips[i].name = tokenizer.nextToken(); 
        ips[i].ip1 = tokenizer.nextToken(); 
        ips[i].ip2 = tokenizer.nextToken(); 
        ips[i].ip3 = tokenizer.nextToken(); 
        ips[i].ip4 = tokenizer.nextToken(); 
        ips[i].fullIP = ips[i].ip1+"."+ips[i].ip2+"."+ips[i].ip3+"."+ips[i].ip4; 
        System.out.println(ips[i].fullIP); 
        i++; 
        totalIps = i; 

        System.out.println(line); 
       } 
      } 


      total_ips = totalIps; // count of total cars 
      System.out.println("total_ips after i++ "+total_ips); 
      }catch (FileNotFoundException e) { 
       System.out.println("Unable to open file " + fstream1); 
      } catch (IOException e) { 
       System.out.println("Unable to read from file " + fstream1); 
      }finally { 
       // Close the file 
       try { 
      if (input != null) 
       input.close(); 
       } catch (IOException e) { 
        System.out.println("Unable to close file " + fstream1); 
       } 
      } 
    } 
} 

Et une illustration:

enter image description here

+0

Je n'ai aucune idée de ce qui s'est passé avec mon code, mais je suppose que c'était un problème avec eclipse, car cela a fonctionné après le redémarrage de ma machine, c'est probablement un indice que je devrais utiliser la méthode split. J'ai également changé mon code comme vous le recommandiez. Merci! – user2731181