0

好的,我会尽量直接。我正在开发一个基于通用客户端/服务器架构的文件共享应用程序。我也有 HandleClient 类,但这在这里并不是特别重要。

我想做的是允许用户搜索可以存储在其他用户共享文件夹中的特定文件。例如,3 个用户连接到服务器,他们都有各自的共享文件夹。其中一个想要搜索一个名为“Madonna”的文件,应用程序应该列出所有包含该名称的文件,并且在该文件名旁边应该有一个关于拥有/拥有想要文件的用户的信息。该信息可以是用户名或 IP 地址。这是 User 类,它需要编写的方式(这就是我的上级想要的方式):

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();

    }


}

此类存储特定用户的属性(用户名、IPAddress),并从该特定用户的共享文件夹创建文件列表。列表类型是 ArrayList,这就是它必须的,我的上级再次告诉我。

另一方面,我需要另一个名为 RequestForFile(String fileName) 的类,其目的是在搜索时登录的所有用户的文件的 ArrayLists 中查找某个文件。

这就是它应该的样子,这是我特别需要你帮助的地方,因为我遇到了一个错误,我无法完成课程。

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");
            }

        }

    }

}

这个想法是让用户在其他用户的列表中查找并返回具有所需文件位置的用户。暂时不考虑 GUI,当我解决这个问题时,我会处理它。任何帮助表示赞赏。谢谢我在这里回答有关此问题的任何内容。

4

3 回答 3

0

在“第 14 行:for (String request : User.fileList()) {”我收到此错误:“此处不允许使用 void 类型”和“foreach 不适用于表达式类型”

你需要让User.fileList()return aList<String>而不是void

因此,更换

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

经过

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

要了解有关基本 Java 编程的更多信息,我强烈推荐此处的“涵盖基础知识的试用”一章中的 Sun 教程。

于 2010-01-09T15:28:11.637 回答
0

这里有很多问题,例如:

我不认为这段代码可以编译:

         for (String request : User.fileList()) 

因为 fileList() 不返回任何内容。然后是为什么 fileList() 是静态的问题。这意味着所有用户对象都共享同一个列表。我猜你有这个是因为你试图从 main() 测试你的用户对象。

我认为你应该编码:

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

所以 fileList 不能是静态的。

你现在已经更清楚地解释了你的整体问题,但这揭示了一些更深层次的问题。

让我们从最顶层开始。您的请求对象:我认为它代表具有一个文件定义的一位用户的一项请求。但它需要在许多用户的文件夹中查找。您将请求用户添加到列表中,但其他用户呢。我认为这意味着您需要另一个负责保存所有用户的类。

无论如何,让我们有一个名为 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
       }

 }
于 2010-01-09T15:31:16.467 回答
0

看起来您遇到了该错误,因为 fileList() 方法需要返回可以迭代的内容 - 不包括 void,这是该方法返回的内容。正如所写,fileList 正在向控制台返回信息,这对您自己的调试目的非常有用,但这意味着其他方法无法获取 fileList 发送到控制台的任何信息。

更广泛地说,为什么 RequestForFile 是一个单独的类?如果它只包含一个方法,则可以将其编写为静态方法,或者编写为将要调用它的类中的方法。另外,它将如何获取其他用户的列表?看起来没有办法按原样这样做,因为您已经硬编码了一个用户。

看着答案,我强烈支持 djna 的建议,即让一些类充当所有用户的控制器/观察者。

于 2010-01-09T15:34:18.227 回答