Различие между чтением файла и пользовательским вводом в методе

Эта программа начинается в классе FleetInterface, запрашивая у пользователя файл (run()). Метод buildFleet() считывает файл, затем вызывает Vehicle в класс Fleet, вызывая метод addVehicle(), и в этом методе он устанавливает новый объект Vehicle в массив Vehicle.

После всего, что сделано, появляется меню пользователя, спрашивающее, хотят ли они 1.) Добавить транспортное средство, 2.) Удалить транспортное средство.

Допустим, они добавляют новый автомобиль. Требование состоит в том, чтобы пользователь вручную вводил данные об этом транспортном средстве (всю ту же информацию, которая была в файле в начале). Проблема в том, что эта опция также вызывает addVehicle(). Если я запрограммирую в методе addVehicle() некоторые утверждения, такие как «Пожалуйста, введите модель вашего автомобиля:», это также будет отображаться при первом запуске программы и вызове addVehicle().

Сложная часть - мне не разрешено создавать новые общедоступные методы (только частные) и я не могу добавлять новые данные уровня класса.

В моем классе Fleet есть 2 конструктора: 1 пустой (здесь нельзя ничего устанавливать). И 1 имеет значение параметра File (используется для чтения исходного файла).

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

Вот мой код:

Приложение FleetInterface:

public void run() throws FileNotFoundException
{
    File file = new File(getFile());
    fleet = new Fleet(file);
    buildFleet(file);
}

private void buildFleet(File file) throws FileNotFoundException
{
    fleet = new Fleet(file);
    fleet.addVehicle(Honda);

    userMenu(file, fleet);

}

private void userMenu(File file, Fleet fleet) throws FileNotFoundException
{
    int choice = 0;

    Scanner input = new Scanner(System.in);

    this.createMenu();
    choice = this.menu.getChoice();

    switch(choice)
    {
    case 1:
        fleet.addVehicle(Honda);
        break;
    }
}

Флот: данные об уровне класса (нельзя изменить):

Vehicle[] vehicles = new Vehicle[4];
File file;

добавитьТранспортное средство:

public void addVehicle(Vehicle Honda[]) throws FileNotFoundException
{
    Scanner reader = new Scanner(file);

    if(canAddVehicle() == true)
    {
        for(int i = 0; i < vehicles.length; i++)
        {
            if(vehicles[i] == null)
            {
                Honda[i] = new Vehicle();
                Honda[i].readRecord(reader);
                vehicles[i] = Honda[i];
                reader.close();
                break;
            }
        }
        System.out.println("Vehicle Added!");

    }
    else
    {
        System.out.println("You can not add more than 4 vehicles.");
    }

}

person MJ93    schedule 06.12.2011    source источник


Ответы (1)


Вы можете записать пользовательский ввод во временный файл, а затем установить атрибут файла в вашем объекте автопарка на временный файл, прежде чем вызывать addVehicle. Атрибут файла доступен другим классам, так как его область действия по умолчанию закрыта для пакета. Это означает, что к нему могут обращаться любые классы в одном пакете. Если FleetInterfaceApp находится в том же пакете, то он уже может это делать.

Вот пример кода, основанный на коде, указанном в вопросе. Это требует дополнительной работы, прежде чем он будет работать.

// somewhere inside userMenu(File file, Fleet fleet)
File tempFile = File.createTempFile( "tmp", ".tmp" );

FileWriter fout = new FileWriter( tempFile );
fout.append( userInput );
fout.close();

fleet.file = tempFile;

switch(choice)
{
case 1:
    fleet.addVehicle(Honda);
    break;
}
person Neil Essy    schedule 06.12.2011
comment
Да, они все в одной упаковке. Хотя у меня есть некоторые проблемы... Я не знаю, как изменить атрибут файла в объекте флота, не создавая его новый экземпляр. Любые идеи? - person MJ93; 07.12.2011
comment
Я добавил пример кода. В основном это сводится к fleet.file = tempFile;. - person Neil Essy; 07.12.2011
comment
Ничего себе, я не могу отблагодарить вас достаточно. Я пытался сделать это часами. Я не знал об атрибуте .file - person MJ93; 07.12.2011