Onderscheid maken tussen het lezen van een bestand en gebruikersinvoer in een methode

Dit programma start in de klasse FleetInterface door de gebruiker om een ​​bestand te vragen ( run() ). De methode buildFleet() leest het bestand en roept de klasse Vehicle to the Fleet aan door de methode addVehicle() aan te roepen en in die methode wordt het nieuwe Vehicle-object in de voertuig array.

Nadat dit is gebeurd, verschijnt een gebruikersmenu met de vraag of ze het volgende willen: 1.) Een voertuig toevoegen, 2.) Een voertuig verwijderen.

Laten we zeggen dat ze een nieuw voertuig toevoegen. De vereiste is om de gebruiker handmatig gegevens over dat voertuig in te voeren (alle dezelfde informatie die in het begin in het bestand stond). Het probleem is dat deze optie ook addVehicle() aanroept. Als ik in de addVehicle() -methode een aantal verklaringen programmeer zoals "Voer alstublieft het model van uw voertuig in:", dat zal ook verschijnen wanneer het programma voor het eerst start en addVehicle() aanroept.

Het lastige deel - Ik mag geen nieuwe openbare methoden maken (alleen privé) en ik kan geen nieuwe gegevens op class niveau toevoegen.

Mijn Fleet-klasse heeft 2 constructors: 1 is leeg (hier mag niets worden ingesteld.) En 1 heeft een parameterwaarde van Bestand (gebruikt voor het lezen van het originele bestand).

So to sum it up, I need a way for the program to start by reading the values in a file, calling addVehicle(), then also allow the user to enter in a vehicle manually via Scanner.. while also calling addVehicle()

Hier is mijn code:

FleetInterfaceApp:

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

Fleet: Class Level data (cannot change):

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

addVehicle:

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

}
0

1 antwoord

U kunt de gebruikersinvoer naar een tijdelijk bestand wegschrijven en vervolgens het bestandskenmerk in uw vlootobject instellen op het tijdelijke bestand voordat u addVehicle aanroept. Het bestandskenmerk is toegankelijk voor andere klassen omdat het standaard pakket privé is . Dit betekent dat alle klassen in hetzelfde pakket er toegang toe hebben. Als FleetInterfaceApp in hetzelfde pakket zit, kan het dit al doen.

Hier is een voorbeeldcode gebaseerd op de code in de vraag. Dit heeft extra werk nodig voordat het kan worden uitgevoerd.

// 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;
}
1
toegevoegd
Ja, ze zitten allemaal in hetzelfde pakket. Hoewel ik een aantal problemen ondervind, weet ik niet zeker hoe ik het bestandskenmerk in het fleet-object moet wijzigen zonder een nieuw exemplaar ervan te maken. Om het even welke ideeën?
toegevoegd de auteur MJ93, de bron
Wauw, ik kan je niet genoeg bedanken. Ik probeer dit al uren te doen. Ik wist niet van het bestand .file
toegevoegd de auteur MJ93, de bron
Ik heb een voorbeeldcode toegevoegd. In principe komt het neer op fleet.file = tempFile; .
toegevoegd de auteur Neil Essy, de bron