2010-01-09 1 views
0

Okay Je vais essayer d'être direct. Je travaille sur une application de partage de fichiers basée sur une architecture Client/Serer commune. J'ai aussi la classe HandleClient mais ce n'est pas particulièrement important ici.problèmes avec la classe RequestForFile() qui utilise la classe User en Java

Ce que je veux faire est de permettre aux utilisateurs de rechercher un fichier particulier qui peut être stocké dans des dossiers partagés d'autres utilisateurs. Par exemple, 3 utilisateurs sont connectés au serveur et ils ont tous leurs dossiers partagés respectifs. L'un d'eux veut faire une recherche pour un fichier nommé "Madonna" et l'application devrait lister tous les fichiers contenant ce nom et à côté de ce nom il devrait y avoir une information sur les utilisateurs qui ont/ont un fichier voulu. Ces informations peuvent être soit un nom d'utilisateur, soit une adresse IP. Voici la classe utilisateur, la façon dont il doit être écrit (c'est la façon dont mes supérieurs voulaient):

import java.io.File; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class User { 

    public static String username; 
    public static String ipAddress; 

    public User(String username, String ipAddress) { 

     username = username.toLowerCase(); 
     System.out.println(username + " " + ipAddress); 
    } 

    public static void fileList() { 

     Scanner userTyping = new Scanner(System.in); 
     String fileLocation = userTyping.nextLine(); 
     File folder = new File(fileLocation); 
     File[] files = folder.listFiles(); 

     ArrayList<String> list = new ArrayList<String>(); 

     for (int i = 0; i < files.length; i++) { 

      list.add(i, files[i].toString().substring(fileLocation.length())); 
      System.out.println(list.get(i)); 

     } 

    } 

    public static void main(String args[]) { 
     System.out.println("Insert the URL of your shared folder"); 
     User.fileList(); 

    } 


} 

Cette classe stocke les attributs d'un utilisateur particulier (nom d'utilisateur, IPAddress) et crée également la liste des fichiers à partir de le dossier partagé de cet utilisateur particulier. le type de liste est ArrayList, c'est comme ça que ça doit être, encore une fois, mes supérieurs me l'ont dit. D'autre part, j'ai besoin d'une autre classe appelée RequestForFile (String fileName) qui a pour but de rechercher un certain fichier dans ArrayLists de fichiers de tous les utilisateurs qui sont connectés au moment de la recherche.

Voici comment cela devrait ressembler, et c'est là que j'ai particulièrement besoin de votre aide parce que je reçois une erreur et je ne peux pas terminer la classe.

import java.util.ArrayList; 


public class RequestForFile { 

    public RequestForFile(String fileName) { 

     User user = new User("Slavisha", "84.82.0.1"); 
     ArrayList<User> listOfUsers = new ArrayList(); 
     listOfUsers.add(user); 

     for (User someUser : listOfUsers) { 

      for (String request : User.fileList()) { 
       if (request.equals(fileName)) 
        System.out.println(someUser + "has that file"); 
      } 

     } 

    } 

} 

L'idée est pour l'utilisateur de regarder parmi les listes d'autres utilisateurs et retourner à l'utilisateur (s) avec un emplacement d'un fichier désiré. Interface graphique de côté pour l'instant, je vais y arriver quand je répare ce problème. Toute aide appréciée. Merci Je suis ici pour répondre à n'importe quoi à ce sujet.

+2

L'erreur est-elle un secret? Si non, aimeriez-vous le partager? –

+0

dans la "ligne 14: pour (Chaîne request: User.fileList()) {" Je reçois cette erreur: "type void non autorisé ici" et aussi "foreach non applicable au type d'expression" – AmateurProgrammer

+0

Aux programmeurs amateurs: les erreurs disent quelque chose à propos de la cause profonde du problème. Vous ne devriez certainement pas les ignorer, mais les interpréter. Si vous ne le pouvez pas, partagez-les avec nous afin que nous puissions vous aider à les interpréter. Vous savez, une fois qu'une cause racine est * comprise *, la solution est * évidente *. – BalusC

Répondre

0

Il y a beaucoup de problèmes ici, tels que:

Je ne pense pas que ce code peut compiler:

  for (String request : User.fileList()) 

Parce que fileList() ne retourne rien. Ensuite, il y a la question de savoir pourquoi fileList() est statique. Cela signifie que tous les objets Utilisateur partagent la même liste. Je suppose que vous avez cette raison que vous essayez de tester votre objet utilisateur à partir de main().

Je pense plutôt que vous devriez avoir un code:

myUser = new User(...); 
myUser.fileList() 

et ainsi fileList ne pouvait pas être statique.

Vous avez maintenant expliqué votre problème global plus clairement, mais cela révèle des problèmes plus profonds.

Commençons tout en haut. Votre objet de requête: Je pense qu'il représente une requête pour un utilisateur avec une définition de fichier. Mais il faut aller chercher dans les dossiers de nombreux utilisateurs. Vous ajoutez l'utilisateur demandeur à une liste, mais qu'en est-il des autres? Je pense que cela signifie que vous avez besoin d'une autre classe responsable de la tenue de tous les utilisateurs.

De toute façon, nous avons une classe appelée UserManager.

UserMananger{ 

     ArrayList<User> allTheUsers; 

     public UserManager() { 

     } 

     // methods here for adding and removing users from the list 

     // plus a method for doing the search 

     public ArrayList<FileDefinitions> findFile(request) [ 
       // build the result 
     } 

} 
+0

Merci, cela m'a rendu la vie beaucoup plus facile. Je ne peux toujours pas contourner la fonction de surch pour fonctionner correctement. Je vais essayer de trouver une meilleure solution ou de poser une question différemment – AmateurProgrammer

0

in the "line 14: for (String request : User.fileList()) {" I get this error: "void type not allowed here" and also "foreach not applicable to expression type"

Vous devez laisser un retour User.fileList()List<String> et non void.

Ainsi, remplacer

public static void fileList() { 
    // ... 
} 

par

public static List<String> fileList() { 
    // ... 
    return list; 
} 

Pour en savoir plus sur la programmation Java de base, je vous recommande fortement les tutoriels disponibles dans Sun Trials Covering the Basics chapter here.

+0

merci. Je connais les bases mais j'ai certains trous dans mes connaissances. J'espère aller mieux au fil du temps. – AmateurProgrammer

0

On dirait que vous obtenez cette erreur parce que la méthode fileList() a besoin de retours quelque chose qui peut être itérés - qui ne comprend pas vide, ce qui est ce que le rendement de la méthode. Comme écrit, fileList retourne des informations à la console, ce qui est excellent pour vos propres besoins de débogage, mais cela signifie que les autres méthodes ne peuvent pas obtenir les informations que fileList envoie à la console. Sur une note plus générale, pourquoi RequestForFile est une classe distincte? Si elle ne contient qu'une seule méthode, vous pouvez simplement l'écrire en tant que méthode statique ou en tant que méthode dans la classe qui va l'appeler. Aussi, comment va-t-il obtenir des listes d'autres utilisateurs? Il semble qu'il n'y ait aucun moyen de le faire tel quel, car vous avez codé en dur un utilisateur.

Et en regardant les réponses, je voudrais fortement appuyer la suggestion de djna d'avoir une classe qui agit comme le contrôleur/observateur de tous les utilisateurs.

+0

Je mets RequestForFile en tant que classe séparée pour l'instant, donc je pourrais travailler plus facilement. Je vais le mettre dans la classe UserManager plus tard, comme une méthode. Je suis d'accord, la suggestion de Djina fonctionne très bien. Merci également pour votre contribution. – AmateurProgrammer

Questions connexes