java - 在不同方法中重用 FileWriter 时在哪里关闭它?

标签 java oop for-loop if-statement filewriter

我遇到了一个问题:在添加到数组(停靠)并即时从数组中删除(取消停靠)后,我需要能够进行文件写入。但我不知道把flush()和close()放在哪里。当我将它们放在写入函数之后时,我会收到错误,因为它们已经关闭了文件写入器。你能帮忙吗?

try {
    portLog.flush();
} catch (IOException e) {
    e.printStackTrace();
}


try {
    portLog.close();
} catch (IOException e) {
    e.printStackTrace();
}

这是我的代码:

import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

public class Main {

static Scanner scan = new Scanner(System.in);

private static Ship[] dock1 = new Ship[10];
private static Ship[] waitingList = new Ship[10];
static FileWriter portLog;
static DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
//get current date time with Date()
static Date date = new Date();

static {
    try {
        portLog = new FileWriter("\\Users\\Smith\\Desktop\\PortLog.txt", true);
    } catch (IOException e) {
        e.printStackTrace();
    }
}


public static void main(String[] args) {
    menu();
}

public static void menu() {

    Scanner scan = new Scanner(System.in);

    while (true) {

        System.out.println("Choose an option: 1-3");
        System.out.println("1. Dock");
        System.out.println("2. Undock");
        System.out.println("3. Status");

        int menu = scan.nextInt();
        switch (menu) {
            case 1:
                System.out.println("1. Dock");
                dock();
                break;
            case 2:
                System.out.println("2. Undock");
                undock();
                break;
            case 3:
                System.out.println("3. Status");
                printDock();
                printWaitingList();
                break;
            case 4:
                System.out.println("4. Exit");
                System.exit(0);
            default:
                System.out.println("No such option");
                break;
        }
    }
}


public static void dock() {

    System.out.println("Enter ship's name: ");
    String name = scan.nextLine();

    System.out.println("Enter ship's size: ");
    String size = scan.nextLine();

    System.out.println("Enter the ships dock:");
    //Check if the dock number is valid
    int i = Integer.valueOf(scan.nextLine());
    if (i >= 0 && i < 10 && dock1[i] == null) {
        int c = 0;
        int co = 0;
        int sco = 0;
        for (int j = 0; j < dock1.length; j++) {
            if (dock1[j] != null && dock1[j].getShipSize().equals("Cargo")) {
                c++;
            }
            if (dock1[j] != null && dock1[j].getShipSize().equals("Container")) {
                co++;
            }
            if (dock1[j] != null && dock1[j].getShipSize().equals("Super-Container")) {
                sco++;
            }
        }

        if (c < 10 && co < 5 && sco < 2) {
            //Add ship to the dock
            dock1[i] = new Ship(name, size);
            System.out.println("Enough space you can dock");
            System.out.println("Ship has been docked");


            try {
                portLog.write("\n" + " Docked: " + dock1[i].getShipName() + " Size: " + dock1[i].getShipSize() + " at " + dateFormat.format(date));
            } catch (IOException e) {
                e.printStackTrace();
            }


        } else {
            System.out.println("You cannot dock");
            waitingList(name, size);
        }

    } else {
        System.out.println("Couldn't dock");
        waitingList(name, size);
    }

}


public static void undock() {
    System.out.println("Status of ships: ");
    printDock();
    System.out.println("Enter ship's name to undock: ");
    String name = scan.nextLine();

    for (int i = 0; i < dock1.length; i++) {
        if (dock1[i] != null && dock1[i].getShipName().equals(name)) {

            try {
                portLog.write("\n" + "Undocked: " + dock1[i].getShipName() + " Size: " + dock1[i].getShipSize() + " at " + dateFormat.format(date));
            } catch (IOException e) {
                e.printStackTrace();
            }

            dock1[i] = null;
            System.out.println("Ship removed");

            /// HERE CHECK IF SHIP IN DOCK
            for (int j = 0; j < waitingList.length; j++) {
                if (dock1[i] == null && waitingList[j] != null) {
                    // Add ship to the dock
                    dock1[i] = new Ship(waitingList[j].getShipName(), waitingList[j].getShipSize());
                    System.out.println("Move ship from waiting list to dock 1");
                    waitingList[j] = null;
                    return;
                } else {
                  return;
                }
            }
        } else {
        }
    }
    System.out.println("Ship not found");
}

public static void waitingList(String name, String size) {

    System.out.println("Dock 1 is full, ship will try to be added to Waiting List");
    for (int i = 0; i < waitingList.length; i++) {
        if (waitingList[i] == null) {
            //Add ship to the dock
            waitingList[i] = new Ship(name, size);
            System.out.println("Enough space added to waiting list");
            return;
        } else {

        }
    }
    System.out.println("No space on waiting list, ship turned away.");
}

public static void printDock() {

    System.out.println("Docks:");

    for (int i = 0; i < dock1.length; i++) {
        if (dock1[i] == null) {
            System.out.println("Dock " + i + " is empty");
        } else {
            System.out.println("Dock " + i + ": " + dock1[i].getShipName() + " " + dock1[i].getShipSize());
        }
    }
}

private static void printWaitingList() {

    System.out.println("Waiting List:");

    for (int i = 0; i < waitingList.length; i++) {
        if (waitingList[i] == null) {
            System.out.println("Dock " + i + " is empty");
        } else {
            System.out.println("Dock " + i + ": " + waitingList[i].getShipName() + " " + waitingList[i].getShipSize());
        }
    }
}

}

最佳答案

当您刚接触 Java 并首先开始在单个类中使用所有静态变量时,就会遇到这种情况。这对于第一步、打印 hello world 或一些简单的计算很有用。

但是这种方法很快就会妨碍你。您会看到,在 OOP 的“真实”世界中,此类代码更像是一种反模式。

含义:这就是您应该开始考虑创建自己的类的地方。类具有明确的目的,例如建模船舶,或者 jetty 。然后,您添加考虑属于此类的属性(当然:这些字段不是静态的)。

从这个意义上说,真正的答案是您“完全”退后一步,开始思考更好的方式来组织您打算创建的功能。如前所述,就您而言,这归结为定义正确的船舶/jetty 类。然后,这将允许您抽象较低级别的详细信息,例如“某些内容存储在文件中”。因为这样您就可以拥有一个 DockPersistenceService 类。您传递一个 Dock 对象列表,以某种方式保留它们。或者从文件中读取 Dock 对象列表。

关于java - 在不同方法中重用 FileWriter 时在哪里关闭它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49678429/

相关文章:

javascript - 如何在 JavaScript 中将 OOP 转换为 FP

c++ - 最多 2 位数字

linux - linux shell脚本中for循环的语法

java - 用java画一个简​​单的文本框?

java - 如何在PreparedStatement中添加order by?

c++ -::相对 。对于成员函数 (C++)

oop - "dependency inversion principle"在 OOP 中是什么意思?

java - 使用 Nexus Repository OSS 3 创建 Maven 项目 [离线]

java - Collectors#toList 的运行时复杂性

javascript - 如何将更复杂的 for 循环从 javascript 重写为 Coffeescript?