将文本文件加载到数组

时间:2016-02-08 15:44:53

标签: java arrays file

我正在写一个酒店控制台程序,我现在遇到的问题是当用户按下从文件加载的选项时,将保存的文件加载回String[]

文本文件包含先前保存的访客名称。

这是文件数据

tom
mo
jo
john
meg
bob
jack
veronica
jessica
angelica

这是我的所有代码

是的,谢谢,我知道数组是0索引。 for循环从1开始,因为 我希望有 Room1代替Room0作为第一个

谢谢你解决了问题

public class FileLoad {
    public String[] readLines(String filename) throws IOException {  
        FileReader fileReader = new FileReader(filename);  

        BufferedReader bufferedReader = new BufferedReader(fileReader);  
        List<String> lines = new ArrayList<String>();  
        String line = null;  

        while ((line = bufferedReader.readLine()) != null) {  
            lines.add(line);  
        }  

        bufferedReader.close();  

        return lines.toArray(new String[lines.size()]);  
    }
public class Hotel_array {

      if (Menu.equalsIgnoreCase("S")) {
                save(hotel); 
            }
            if (Menu.equalsIgnoreCase("L")) {
                load(hotel); 
            }
        }
    }


    private static void save(String hotel[]) {
        try {
            PrintWriter pr = new PrintWriter("data.txt");
            for (int i = 1; i < 11; i++) {
                pr.println(hotel[i]);
            }
            pr.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("No such file exists.");
        }
    }

    public static void load(String[] args) {
        FileLoad rf = new FileLoad();
        String file = "data.txt";
        try {
            String[] hotel = rf.readLines(file);
            for (String line : hotel) {
                System.out.println(line); // IT PRINTS FILE NOT LOADS TO ARRAY
            }
        } catch (IOException e) { 
            System.out.println("Unable to create " + file + ": " + e.getMessage());
        }
    }

}

2 个答案:

答案 0 :(得分:1)

您可以更改FileLoad类并添加另一种方法将数组写入文件,只是为了将所有文件IO保留在一个类中。

public class FileLoad {

    public static String[] readHotelArray(String filename) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filename));
        List<String> lines = new ArrayList<String>();
        String line = null;

        while ((line = bufferedReader.readLine()) != null) {
            lines.add(line);
        }

        bufferedReader.close();

        return lines.toArray(new String[lines.size()]);
    }

    public static void writeHotelArray(String filename, String[] hotel) throws IOException {
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filename, false));
        //Write each string from the array to the file as a new line
        for (String s : hotel)
            bufferedWriter.write(s + "\n");
        bufferedWriter.flush();
        bufferedWriter.close();
    }
}

注意:两种方法都是静态的,因此您不必实例化新对象,因为该对象上始终只有一个方法调用

现在您必须更改Hotel_array课程中保存和加载数组的方式。你可以使用这样的东西:

//...
private static void save(String[] hotel) {
    try {
        FileLoad.writeHotelArray("data.txt", hotel);
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("No such file exists.");
    }
}

public static String[] load() {
    String file = "data.txt";
    String[] hotelArray = null;
    try {
        hotelArray = FileLoad.readHotelArray(file);
    } catch (IOException e) {
        System.out.println("Unable to create " + file + ": " + e.getMessage());
    }
    return hotelArray;
}
//...

由于java中的参数始终是按值传递(更多关于here),因此您需要在String方法中返回load()数组。因此,您还必须在main方法中更改一小段代码 从:

//...
if (Menu.equalsIgnoreCase("L")) {
    load(hotel); 
}
//...

要:

//...
if (Menu.equalsIgnoreCase("L")) {
    hotel = load();
}
//...

希望有所帮助(:

答案 1 :(得分:1)

tomaszsvd,我将在此处留下您的评论...我认为它可能有助于您的Java学习曲线。我鼓励您将下面的load()方法与原始代码进行比较。还要研究示例输出,看看有什么不同。

fwiw,我喜欢scsere的答案,这是一个干净的设计。你应该追求并将其标记为答案。

让我们专注于Hotel_array.load(String [] args)的代码。

一旦Hotel_array.load()调用rf.readLines(),你就会在内存中有2个数组。

1st array:  Hotel_array's main()'s local variable "hotel".
2nd array:  load()'s local variable "hotel", which is a temporary variable.

在Hotel_array.load()内部,请记住args参数绑定到main()&#34; hotel&#34; hotel&#34;变量

所以加载()的本地变量&#34; hotel&#34;没有没有与main()&#34; s&#34; hotel&#34;变量

为了使这一点更加清晰,我将调整你的load()方法:

样本输出

$ javac *.java
$ cat data.txt 
alpha
beta
gamma
delta
$ java Hotel_array 
WELCOME TO THE HOTEL BOOKING 

Hotel Booking Options
A: To Add customer to a room
V: To View all rooms

E: To Display empty rooms
D: To Delete customer from a room
F: Find room from customer name

O: View rooms alphabetically by name
S: Save to file
L: Load from file
L
Loaded 4 lines from filedata.txt
args[1]=empty, will assign line=alpha
args[2]=empty, will assign line=beta
args[3]=empty, will assign line=gamma
args[4]=empty, will assign line=delta

Hotel Booking Options
A: To Add customer to a room
V: To View all rooms

E: To Display empty rooms
D: To Delete customer from a room
F: Find room from customer name

O: View rooms alphabetically by name
S: Save to file
L: Load from file
V
room 1 is occupied by alpha
room 2 is occupied by beta
room 3 is occupied by gamma
room 4 is occupied by delta
room 5 is empty
room 6 is empty
room 7 is empty
room 8 is empty
room 9 is empty
room 10 is empty

Hotel Booking Options
A: To Add customer to a room
V: To View all rooms

E: To Display empty rooms
D: To Delete customer from a room
F: Find room from customer name

O: View rooms alphabetically by name
S: Save to file
L: Load from file
^C$

修改后的Hotel_array.load()方法

public static void load(String[] args) {
    FileLoad rf = new FileLoad();
    String file = "data.txt";
    try {
        // ORIGINAL String[] hotel = rf.readLines(file);
        String[] tempHotelData = rf.readLines(file); // Note the different var name.
        System.out.println("Loaded "+tempHotelData.length+" lines from file"+file);
        int i = 1; // Following your convetion of staring from index #1.
        for (String line : tempHotelData ) {
            // ORIGINAL: System.out.println(line); // IT PRINTS FILE NOT LOADS TO ARRAY
            // NEW...
            // Let's print out what is oging on...
            // So let's assign "line" to the "args" array.
            // Remember that "args" ties back to main()'s "hotel" variable.
            System.out.println("args["+i+"]="+args[i]+", will assign line="+line);
            args[i] = line;
            i = i + 1;
        }
    } catch (IOException e) {
        // probably should say "Unable to LOAD" vs "Unable to CREATE"...
        System.out.println("Unable to create " + file + ": " + e.getMessage());
    }
}

您需要考虑一些额外的事情......

1) Do you want to assign a line from a file if somebody is already in a room?
  (e.g. it isn't empty).

2) What happens if "data.txt" has more lines than you have rooms?