проблемы с классом RequestForFile(), который использует пользовательский класс в Java

StackOverflow https://stackoverflow.com/questions/2033757

  •  19-09-2019
  •  | 
  •  

Вопрос

Хорошо, я постараюсь быть прямым.Я работаю над приложением для обмена файлами, основанным на общей архитектуре Клиент / Сервер.У меня также есть класс HandleClient, но здесь это не особенно важно.

Что я хочу сделать, так это разрешить пользователям искать определенный файл, который может храниться в общих папках других пользователей.Например, 3 пользователя подключены к серверу, и все они имеют свои соответствующие общие папки.Один из них хочет выполнить поиск файла с именем "Madonna", и приложение должно вывести список всех файлов, содержащих это имя, а рядом с этим именем файла должна быть информация о пользователе (ах), у которого есть / hases требуемый файл.Этой информацией может быть либо имя пользователя, либо 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();

    }


}

Этот класс хранит атрибуты конкретного пользователя (имя пользователя, IP-адрес), а также создает список файлов из общей папки этого конкретного пользователя.тип списка - ArrayList, так и должно быть, опять же, как велело мне мое начальство.

С другой стороны, мне нужен другой класс, который называется RequestForFile(строковое имя файла), целью которого является поиск определенного файла в массиве списков файлов от всех пользователей, вошедших в систему в момент поиска.

Вот как это должно выглядеть, и именно здесь мне особенно нужна ваша помощь, потому что я получаю сообщение об ошибке и не могу завершить урок.

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

        }

    }

}

Идея заключается в том, чтобы пользователь просматривал списки других пользователей и возвращал пользователю (ам) местоположение нужного файла.Пока отложим графический интерфейс в сторону, я перейду к нему, когда устраню эту проблему.Любая помощь приветствуется.Спасибо Я здесь, чтобы ответить на все, что касается этого вопроса.

Это было полезно?

Решение

Здесь есть много проблем, таких как:

Я не думаю, что этот код может быть скомпилирован:

         for (String request : User.fileList()) 

Потому что FileList() ничего не возвращает.Тогда возникает вопрос о том, почему FileList() является статическим.Это означает, что все пользовательские объекты совместно используют один и тот же список.Я предполагаю, что у вас это есть, потому что вы пытаетесь протестировать свой пользовательский объект из main().

Я думаю, вместо этого вам следовало бы закодировать:

 myUser = new User(...);
 myUser.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
       }

 }

Другие советы

в "строке 14:для (Строковый запрос :User.FileList()) {" Я получаю эту ошибку:"тип void здесь не разрешен", а также "foreach неприменим к типу выражения".

Вам нужно позволить User.fileList() вернуть a List<String> и не void.

Таким образом, замените

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

Автор:

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

Чтобы узнать больше об основах программирования на Java, я могу настоятельно рекомендовать учебные пособия Sun, доступные в Испытания, Охватывающие Основы глава здесь.

Похоже, вы получаете эту ошибку, потому что метод FileList() должен возвращать что-то, что может быть повторено - что не включает void, который возвращает этот метод.Как написано, FileList возвращает информацию на консоль, что отлично подходит для ваших собственных целей отладки, но это означает, что другие методы не могут получить какую-либо информацию, которую FileList отправляет на консоль.

В более широком смысле, почему RequestForFile является отдельным классом?Если он содержит только один метод, вы можете просто записать его как статический метод или как метод в классе, который собирается его вызвать.Кроме того, как он будет получать списки других пользователей?Похоже, что нет никакого способа сделать это как есть, поскольку вы жестко запрограммировали одного пользователя.

И, глядя на ответы, я бы решительно поддержал предложение djna о создании некоторого класса, который действует как контроллер / наблюдатель за всеми пользователями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top