无法从文本文件输出信息

时间:2019-08-16 18:46:05

标签: java

我在完成我的java类作业程序时遇到麻烦。它应该显示一个菜单,然后显示一个基于用户选择的子菜单,并从.txt文件中读取所有信息。除了第一个... “企鹅栖息地的细节” 外,它适用于所有动物和栖息地选择。如果我将.tx文件编辑为显示“ ..... habita”,则可以正常工作,因此删除T会有所不同吗?

任何人都可以看一下并帮助我看看我所缺少的吗?还是提供解决方法以打印此选择?

这是我的代码和文本文件信息:

public class ZooInfo {

    public void zooDetails(String fileName) throws IOException {
         String fileInput = null;
         ArrayList aList1 = new ArrayList();

         int i = 0;
         int choice = 0;
         boolean loopExit = false;

         FileInputStream fileByteStream = null;                                                              // File input stream
        Scanner inFS = null;                                                                                // Scanner object
        Scanner scnr = new Scanner(System.in);
        fileByteStream = new FileInputStream("C:\\Users\\jrbla\\Desktop\\IT-145\\" + fileName + ".txt");    //open file
        inFS = new Scanner(fileByteStream);

        while (inFS.hasNextLine() && loopExit == false) {
            fileInput = inFS.nextLine();

            if (fileInput.contains("Details on")) {
                i += 1;
                System.out.println(i + ". " + fileInput);

                ArrayList aList2 = new ArrayList();

                for (String retval : fileInput.split(" ")) {
                    aList2.add(retval);
                }

                String tempString = aList2.remove(2).toString();
                aList1.add(tempString);
            }
            else {
                if(choice != (i + 1)) {                                                               //while usr does not choose BACK
                    System.out.println("");
                    System.out.print("Choose details or enter " + (i + 1) + " to go back: ");
                    choice = scnr.nextInt();
                    System.out.println("");

                    if (choice <= i) {
                        String menuDetail = aList1.remove(choice - 1).toString();
                        outPut(fileName, menuDetail);
                        System.out.println("");

                    }
                    else if (choice == i + 1){
                        Main.mainMenu();
                    }
                }
                break;
            }
        }    

        fileByteStream.close(); // Done with file, so try to close it
    }

    public void outPut(String fileName, String menuDetail) throws IOException {
        String fileInput = null;
        String lowerFileInput = null;
        String keeperAlert = "*****";
        String edFileInput = "";

        int fileNameLength = fileName.length();
        String lowerFileName = fileName.toLowerCase().substring(0, fileNameLength - 1);

        int menuDetailLength = menuDetail.length();
        String lowerMenuDetail = menuDetail.toLowerCase().substring(0, menuDetailLength - 1);

        boolean loopExit = false;

        FileInputStream fileByteStream = null;                                                                  // File input stream
        Scanner inFS = null;                                                                                    // Scanner object
        fileByteStream = new FileInputStream("C:\\Users\\jrbla\\Desktop\\IT-145\\" + fileName + ".txt");        //try to open file
        inFS = new Scanner(fileByteStream);

        while (inFS.hasNextLine() && loopExit == false) {
            fileInput = inFS.nextLine();
            lowerFileInput = fileInput.toLowerCase();

            if (lowerFileInput.contains(lowerFileName) && lowerFileInput.contains(lowerMenuDetail)) {
                do {
                    System.out.println(fileInput);
                    fileInput = inFS.nextLine();

                    if (fileInput.contains(keeperAlert)) {                                           //look for ALERT trigger
                        edFileInput = fileInput.replace(keeperAlert, "!! ZOOKEEPER ALERT !! ");
                        JFrame popUP = new JFrame();
                        popUP.setAlwaysOnTop(true);
                        JOptionPane.showMessageDialog(popUP, edFileInput, "Warning", JOptionPane.WARNING_MESSAGE);

                    }

                    if (fileInput.isEmpty()) {
                       loopExit = true;
                    }
                }
                while (inFS.hasNextLine() && loopExit == false);
            }
        }

        fileByteStream.close();                                                 // Close file
    }
}

Habitats.txt

Details on penguin habitat  
Details on bird house  
Details on aquarium  

Habitat - Penguin  
Temperature: Freezing  
*****Food source: Fish in water running low  
Cleanliness: Passed  

Habitat - Bird  
Temperature: Moderate  
Food source: Natural from environment  
Cleanliness: Passed  

Habitat - Aquarium  
Temperature: Varies with output temperature  
Food source: Added daily  
*****Cleanliness: Needs cleaning from algae  



Selection 2 returns:  
Habitat - Bird  
Temperature: Moderate  
Food source: Natural from environment  
Cleanliness: Passed  

Selection 3 returns:  
Habitat - Aquarium  
Temperature: Varies with output temperature  
Food source: Added daily  
*****Cleanliness: Needs cleaning from algae  


but selection 1 returns incorrectly:  
Details on penguin habitat  
Details on bird house  
Details on aquarium

2 个答案:

答案 0 :(得分:0)

首先,这不是一个最低限度的工作示例。如果您的“ outPut”方法没有问题,则不需要包含它...或者您可以包含它的简化版本。它使代码的大小加倍,并且使人们更难以帮助您。

接下来,要查看您认为要执行的操作真的很困难,因为您根本没有注释代码,而且似乎没有计划,而您刚刚开始输入代码。考虑先编写一些伪代码,以便您至少可以说服自己,甚至可能使其他人相信自己的策略。

您需要使用更好的变量名。我们可以猜测您的意思,但这很烦人并且浪费更多时间。

例如:您使用“ retval”保存用空格分隔的字符串。如果您将变量命名为“ word”,那将更有意义。

类似地,您应该为这些名称使用更好的名称:

“ aList2”应为“ wordsOnLine”

“ tempString”应为“ habitatType”

“ aList1”应为“ habitatTypes”

我不确定您想要的“ i”是什么意思……显然,这是您在文本文件顶部声明的栖息地数量。您首先阅读了3条“ Details on”(详细信息)行,因此当您继续浏览其余数据时,我将始终为3。

这似乎对任何事情都没有用。总是3,所以当您深入研究方法时,您并没有执行您认为正在执行的操作...您只是在将用户的选择与3进行比较。

当用户输入choice = 1时,您进入第一个if(),原因是:

choice != (i + 1)
1 != (3+1)
1 != 4
true

然后进入下一个if(),因为:

choice <= i
1 <= 3
true

现在...您又在做奇怪的事情。您正在从aList1中删除元素,该元素应跟踪您的栖息地类型。执行此操作后,列表将变短,您将不知道列表中的内容或元素的含义。

您需要更好地计划策略。也许这是一次不错的尝试,但是您需要更加有条理。

答案 1 :(得分:0)

我找到了问题并解决了。问题是这一行:

如果(lowerFileInput.contains(lowerFileName)&& lowerFileInput.contains(lowerMenuDetail))

正在文本行中搜索(“动物”或“栖息地”)和“栖息地类型”(例如企鹅)。
第一行文本有“企鹅栖息地的细节”,因此它触发了打印行直到出现空白。我是这样解决的:

字符串redFlag =“ details”;

        if (lowerFileInput.contains(lowerFileName)&& lowerFileInput.contains(lowerMenuDetail) && !lowerFileInput.contains(redFlag)) {  

因此它跳过包含“详细信息”的第一行,并返回人居-企鹅的第一部分