【问题标题】:Printing string arrays to a text file using java使用java将字符串数组打印到文本文件
【发布时间】:2013-12-08 09:35:22
【问题描述】:

我正在尝试将用户输入的结果打印到一个简单的文本文件中,但我尝试过的所有操作都失败了。我尝试在 switch 案例中使用 PrintWriter,但结果仍然只是打印出 null。我对Java很陌生,所以也许我缺少明显的东西? 代码如下:

package parkingsystem;

import java.io.*;
import java.util.Scanner;

public class Registration {

   static String [][] userData;
   static String [][] fileData;

    public static void Registration(){

        Scanner input = new Scanner(System.in);
        String lotNo;
        String First;
        String Last;
        String studentID;
        String phoneNo;
        String email;
        String carNo;
        String dateReg;
        String strcontent;
        String proceed;
        boolean proceed2 = true;
        userData = new String [50][6];
        fileData = new String [50][6];
        int counter = 0;
        int col;
        int row;
        boolean carry_on = true;
        MainMenu choices = new MainMenu();

       while(proceed2=true){
        System.out.println("Press Y/y to add a new user");
        System.out.println("Press N/n to return to menu");
        proceed = input.nextLine();
            switch (proceed) {
                case "Y":
                case "y":
                    System.out.println("Enter your student ID");
                    studentID = input.nextLine();
                    System.out.println("Enter your first name");
                    First = input.nextLine();
                    System.out.println("Enter your last name");
                    Last = input.nextLine();
                    System.out.println("Enter your car number");
                    carNo = input.nextLine();
                    System.out.println("Enter your contact number");
                    phoneNo = input.nextLine();
                    System.out.println("Enter your email address");
                    email = input.nextLine();
                    row = counter ;
                    userData [row][0] = studentID;
                    userData [row][1] = First;
                    userData [row][2] = Last;
                    userData [row][3] = carNo;
                    userData [row][4] = phoneNo;
                    userData [row][5] = email;
                    if (counter == 6){
                        carry_on=false;
                    }  

                    proceed2 = false;
                    break;
                case "N":
                case "n":
                    choices.Menus();
                    break;
            }

       }



}

}

【问题讨论】:

  • 每当你写if(boolean = true) 时,Java 程序员就会死去……这是一个赋值操作,总是返回true。你需要if(boolean == true),或者实际上是if(boolean)
  • 这是鲍里斯指出的违规行:while(proceed2=true)。您应该在(proceed2)时重写它。如果您在写入文件时需要帮助,请查看Java Tutorial
  • 除了鲍里斯所说的,你得到什么样的错误?
  • 这段代码存在多层问题。这段代码需要重构。 en.wikipedia.org/wiki/Code_refactoring。我将尝试做一些简单的重构,这将有助于解释您目前正在学习的一些 Java 语言问题,然后我会提出进一步的建议。
  • 无意冒犯任何人,但感谢您的提示。我意识到代码非常混乱。至于将其打印到文件中,有什么想法吗?

标签: java arrays string text printwriter


【解决方案1】:

这是重构代码的第二遍

所以现在在这个重构中,我们捕获并存储新创建的 CarOwner 对象并将它们存储在一个列表中。

然后我们看看如何遍历该 CarOwner 的列表,然后将这些对象写入一个名为 carOwners.dat 的文件

通常,在工业中,代码重构是在一组单元测试的上下文中完成的,您可以根据这些单元测试确保重构没有破坏代码的所需行为,但我们只是在这里学习所以这个工作用于解释您缺少的一些概念,并且下面的第一次迭代有其自身的一些问题,因此不要将其作为最终产品。

重构

  1. 我创建了一个 CarOwner 类。
  2. 我已将布尔变量 canProceed 重命名,以使其读起来更自然。
  3. 更新:我已将 CarOwner 类设为可序列化;这将允许我们将对象写入文件。
  4. 更新:我已经添加了新 CarOwner 的代码并将其添加到列表中,然后我遍历列表以将这些 CarOwner 对象写入 FileStream。

    打包停车系统;

    导入 java.io.FileNotFoundException; 导入 java.io.ObjectOutputStream; 导入 java.io.IOException; 导入 java.util.ArrayList; 导入 java.util.Date; 导入 java.util.List; 导入 java.io.FileOutputStream; 导入 java.util.Scanner;

    公开课注册{ 公共静态无效主要(字符串[]参数){ 列出 carOwners = new ArrayList();

        Scanner input = new Scanner(System.in);
        boolean canProceed = true;
    
        while (canProceed) {
            System.out.println("Press Y/y to add a new user");
            System.out.println("Press N/n to return to menu");
            String optionRequested = input.nextLine();
    
            if (optionRequested.equalsIgnoreCase("Y")) {
                CarOwner owner = new CarOwner();
                System.out.println("Enter your student ID");
                owner.setStudentID(input.nextLine());
                System.out.println("Enter your first name");
                owner.setFirst(input.nextLine());
                System.out.println("Enter your last name");
                owner.setLast(input.nextLine());
                System.out.println("Enter your car number");
                owner.setCarNo(input.nextLine());
                System.out.println("Enter your contact number");
                owner.setContactNumber(input.nextLine());
                System.out.println("Enter your email address");
                owner.setEmail(input.nextLine());
                owner.setDateReg(new Date().toString());
                carOwners.add(owner);
            } else if (optionRequested.equals("N") || optionRequested.equals("n")) {
                canProceed = false;
            }
    
        }
    
        ObjectOutputStream objectWriter = null;
    
        for (CarOwner carOwner : carOwners) {
            try {
                objectWriter = new ObjectOutputStream(new FileOutputStream("carOwners.dat"));
                objectWriter.writeObject(carOwner);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    }

这就是 CarOwner 类现在的样子...

package parkingsystem;

import java.io.Serializable;

public class CarOwner implements Serializable{
    private String First;
    private String Last;
    private String studentID;
    private String email;
    private String carNo;
    private String dateReg;
    private String contactNumber;

    public CarOwner() {
    }

    public String  getFirst() {
        return First;
    }

    public void setFirst(String first) {
        First = first;
    }

    public String getLast() {
        return Last;
    }

    public void setLast(String last) {
        Last = last;
    }

    public String getStudentID() {
        return studentID;
    }

    public void setStudentID(String studentID) {
        this.studentID = studentID;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getCarNo() {
        return carNo;
    }

    public void setCarNo(String carNo) {
        this.carNo = carNo;
    }

    public String getDateReg() {
        return dateReg;
    }

    public void setDateReg(String dateReg) {
        this.dateReg = dateReg;
    }

    public void setContactNumber(String contactNumber) {
        this.contactNumber = contactNumber;
    }

    public String getContactNumber() {
        return contactNumber;
    }

    @Override
    public String toString() {
        return "CarOwner{" +
                "First='" + First + '\'' +
                ", Last='" + Last + '\'' +
                ", studentID='" + studentID + '\'' +
                ", email='" + email + '\'' +
                ", carNo='" + carNo + '\'' +
                ", dateReg='" + dateReg + '\'' +
                ", contactNumber='" + contactNumber + '\'' +
                '}';
    }
}

好的,创建 CarOwner 类是为了让这段代码更加面向对象。

其次,重构的代码演示了在 Java 中正确使用布尔变量。

正如其他评论员已经指出的那样,赋值运算符 = 很容易与布尔相等性测试混淆。见Java Operators

我也将Boolean proceed; 重命名为Boolean canProceed; 这是一个常见的策略。将布尔变量命名为“答案”为的问题,yesno,或 TrueFalse。

这意味着我们可以编写像while(canProceed) 这样非常容易阅读的代码。另见if statement on the Java tutorial

我希望这会有所帮助。

【讨论】:

  • 这绝对有助于让我更好地理解。但是,如果我想通过车主类或在自己的输入过程中打印文件,我现在很困惑。
  • OK 重新阅读您的问题。我了解您要达到的目标。我会更新我的答案。
  • String 有一个 equalsIgnoreCase 方法。它还具有toLowerCasetoUpperCase 方法。比较这两种可能的情况是七大罪之一*。 (*不止七个。)
  • 公平评论鲍里斯,谢谢!它是 IntelliJ 提供的 switch 语句的自动代码重构。
猜你喜欢
  • 2011-07-10
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
相关资源
最近更新 更多