【问题标题】:Writer not writing anything to file作家没有向文件写入任何内容
【发布时间】:2018-02-19 02:16:56
【问题描述】:
public class AddDetails extends Application {
    private final String FileName = "C:\\Users\\marsh\\OneDrive\\Documents\\CustomPrograms\\CalcProb\\Players.txt";
    private String Name;
    private char Hand1, Hand1;
    private double Skill1, Skill2;
    File file = new File(FileName);
    FileOutputStream fos = null;
    Writer writer = null;
    static Stage classStage = new Stage();
    String x = null;

    public AddDetails() {
        Name = "";
        Hand = '\0';
        Skill = 0.0;
        BHand = '\0';
        BSkill = 0.0;
    }

    @SuppressWarnings("restriction")
    @Override
    public void start(Stage myStage) throws IOException {
        classStage = myStage;
        myStage.setTitle("Details");

        GridPane rootNode = new GridPane();
        rootNode.setPadding(new Insets(15));
        rootNode.setHgap(5);
        rootNode.setVgap(5);
        rootNode.setAlignment(Pos.CENTER);

        Scene myScene = new Scene(rootNode, 300, 200);

        rootNode.add(new Label("Name:"), 0, 0);
        TextField name = new TextField();
        rootNode.add(name, 1, 0);
        rootNode.add(new Label("Hand:"), 0, 1);
        TextField hand = new TextField();
        rootNode.add(hand, 1, 1);
        rootNode.add(new Label("Skill:"), 0, 2);
        TextField skill = new TextField();
        rootNode.add(skill, 1, 2);
        rootNode.add(new Label("Skill:"), 0, 3);
        TextField Bskill = new TextField();
        rootNode.add(Bskill, 1, 3);
        rootNode.add(new Label("Hand:"), 0, 4);
        TextField Bhand = new TextField();
        rootNode.add(Bhand, 1, 4);
        Button SButton = new Button("Store");
        rootNode.add(SButton, 1, 5);
        GridPane.setHalignment(SButton, HPos.LEFT);
        Button EButton = new Button("Finish");
        rootNode.add(EButton, 1, 5);
        GridPane.setHalignment(EButton, HPos.RIGHT);
        name.setPromptText("Enter Name");
        hand.setPromptText("Enter Hand );
            skill.setPromptText("Enter Skill");
        Bhand.setPromptText("Enter Hand");
        Bskill.setPromptText("Enter Skill");

        myStage.setScene(myScene);
        myStage.show();

        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
            fos = new FileOutputStream(file, true);
            writer = new OutputStreamWriter(fos, "UTF-8");

            EButton.setOnAction(e -> {
                myStage.close();
                try {
                    writer.close();
                } catch (IOException writerclose) {
                    Alert alert = new Alert(AlertType.ERROR);
                    alert.setTitle("Error");
                    alert.setHeaderText("Error Encountered");
                    alert.setContentText("Error: " + writerclose.getMessage());
                }
            });

            SButton.setOnAction(e -> {
                Name = name.getText();
                Hand = hand.getText().charAt(0);
                Skill = Double.valueOf(skill.getText());
                BSkill = Double.valueOf(Bskill.getText());
                BHand = Bhand.getText().charAt(0);
                Hand = Character.toUpperCase(Hand);
                BHand = Character.toUpperCase(BHand);

                System.out.println(Name + "\t" + Hand + "\t" + Skill + "\t" + BHand + "\t" + BSkill);

                try {

                    writer.write(Name + "\t" + Hand + "\t" + Skill + "\t" + BHand + "\t" + BSkill);

                    name.clear();
                    hand.clear();
                    skill.clear();
                    Bskill.clear();
                    Bhand.clear();

                } catch (IOException br) {

                    Alert alert = new Alert(AlertType.ERROR);
                    alert.setTitle("Error");
                    alert.setHeaderText("Error Encountered");
                    alert.setContentText("Error: " + br.getMessage());

                }
            });
        } catch (IOException e) {
            Alert alert = new Alert(AlertType.ERROR);
            alert.setTitle("Error");
            alert.setHeaderText("Error Encountered");
            alert.setContentText("Error: " + e.getMessage());
        } finally {
            try {
                if (writer != null)
                    writer.close();
                if (fos != null)
                    fos.close();
            } catch (IOException finalclose) {
                Alert alert = new Alert(AlertType.ERROR);
                alert.setTitle("Error");
                alert.setHeaderText("Error Encountered");
                alert.setContentText("Error: " + finalclose.getMessage());
            }
        }
    }

    public static void main(String[] Args) {
        launch(Args);
    }
}

【问题讨论】:

标签: java javafx fileoutputstream filewriter bufferedwriter


【解决方案1】:

您将在打开输出文件后立即关闭它,而无需写入任何内容。

调用start 时在主线程中运行打开和关闭,而单击SButton 时尝试写入发生在事件线程中。

一个简单的解决方法是在执行写入的SButton 操作侦听器中打开和关闭fos

【讨论】:

    【解决方案2】:

    这是代码的一种选择。

    我认为您不需要将 Writer 类作为全局变量。 每当您想修改文件时,您只需打开并写入内容。

    我刚刚修复了一些错误并让它运行。

    SButton.setOnAction(e -> {
        //.... skip
    
        try {
            fos = new FileOutputStream(file, true);
            writer = new OutputStreamWriter(fos, "UTF-8");
    
            writer.write(Name + "\t" + Hand + "\t" + Skill + "\t" + BHand + "\t" + BSkill);
    
            name.clear();
            hand.clear();
            skill.clear();
            Bskill.clear();
            Bhand.clear();
    
            writer.flush();
    
        } catch (IOException br) {
    
            Alert alert = new Alert(AlertType.ERROR);
            alert.setTitle("Error");
            alert.setHeaderText("Error Encountered");
            alert.setContentText("Error: " + br.getMessage());
    
        }
        finally {
            try {
                if (writer != null)
                    writer.close();
                if (fos != null)
                    fos.close();
            } catch (IOException finalclose) {
                Alert alert = new Alert(AlertType.ERROR);
                alert.setTitle("Error");
                alert.setHeaderText("Error Encountered");
                alert.setContentText("Error: " + finalclose.getMessage());
            }
        }
    });
    

    所以,完整的源代码在这里

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    
    import javafx.application.Application;
    import javafx.geometry.HPos;
    import javafx.geometry.Insets;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Alert;
    import javafx.scene.control.Alert.AlertType;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.GridPane;
    import javafx.stage.Stage;
    
    public class AddDetails extends Application {
        private final String FileName = "C:\\Users\\marsh\\OneDrive\\Documents\\CustomPrograms\\CalcProb\\Players.txt";
        private String Name;
        private char Hand, BHand;
        private double Skill, BSkill;
        private final File file = new File(FileName);
    
        static Stage classStage = new Stage();
        String x = null;
    
        public AddDetails() {
            Name = "";
            Hand = '\0';
            Skill = 0.0;
            BHand = '\0';
            BSkill = 0.0;
        }
    
        @SuppressWarnings("restriction")
        @Override
        public void start(Stage myStage) throws IOException {
            classStage = myStage;
            myStage.setTitle("Details");
    
            GridPane rootNode = new GridPane();
            rootNode.setPadding(new Insets(15));
            rootNode.setHgap(5);
            rootNode.setVgap(5);
            rootNode.setAlignment(Pos.CENTER);
    
            Scene myScene = new Scene(rootNode, 300, 200);
    
            rootNode.add(new Label("Name:"), 0, 0);
            TextField name = new TextField();
            rootNode.add(name, 1, 0);
            rootNode.add(new Label("Hand:"), 0, 1);
            TextField hand = new TextField();
            rootNode.add(hand, 1, 1);
            rootNode.add(new Label("Skill:"), 0, 2);
            TextField skill = new TextField();
            rootNode.add(skill, 1, 2);
            rootNode.add(new Label("Skill:"), 0, 3);
            TextField Bskill = new TextField();
            rootNode.add(Bskill, 1, 3);
            rootNode.add(new Label("Hand:"), 0, 4);
            TextField Bhand = new TextField();
            rootNode.add(Bhand, 1, 4);
            Button SButton = new Button("Store");
            rootNode.add(SButton, 1, 5);
            GridPane.setHalignment(SButton, HPos.LEFT);
            Button EButton = new Button("Finish");
            rootNode.add(EButton, 1, 5);
            GridPane.setHalignment(EButton, HPos.RIGHT);
            name.setPromptText("Enter Name");
            hand.setPromptText("Enter Hand ");
                skill.setPromptText("Enter Skill");
            Bhand.setPromptText("Enter Hand");
            Bskill.setPromptText("Enter Skill");
    
            myStage.setScene(myScene);
            myStage.show();
    
    
            EButton.setOnAction(e -> {
                myStage.close();
    
            });
    
            SButton.setOnAction(e -> {
                Name = name.getText();
                Hand = hand.getText().charAt(0);
                Skill = Double.valueOf(skill.getText());
                BSkill = Double.valueOf(Bskill.getText());
                BHand = Bhand.getText().charAt(0);
                Hand = Character.toUpperCase(Hand);
                BHand = Character.toUpperCase(BHand);
                FileOutputStream fos = null;
                Writer writer = null;
    
                System.out.println(Name + "\t" + Hand + "\t" + Skill + "\t" + BHand + "\t" + BSkill);
    
                try {
                    fos = new FileOutputStream(file, true);
                    writer = new OutputStreamWriter(fos, "UTF-8");
    
                    writer.write(Name + "\t" + Hand + "\t" + Skill + "\t" + BHand + "\t" + BSkill);
    
                    name.clear();
                    hand.clear();
                    skill.clear();
                    Bskill.clear();
                    Bhand.clear();
    
                    writer.flush();
    
                } catch (IOException br) {
    
                    Alert alert = new Alert(AlertType.ERROR);
                    alert.setTitle("Error");
                    alert.setHeaderText("Error Encountered");
                    alert.setContentText("Error: " + br.getMessage());
    
                }
                finally {
                    try {
                        if (writer != null)
                            writer.close();
                        if (fos != null)
                            fos.close();
                    } catch (IOException finalclose) {
                        Alert alert = new Alert(AlertType.ERROR);
                        alert.setTitle("Error");
                        alert.setHeaderText("Error Encountered");
                        alert.setContentText("Error: " + finalclose.getMessage());
                    }
                }
            });
    
        }
    
        public static void main(String[] Args) {
            launch(Args);
        }
    }
    

    输入变量如下图,

    保存的文件如下所示,

    问候,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      相关资源
      最近更新 更多