Press any key with BufferedReader

I created a java file called Product.java. I also created a text file called Items.txt. Basically when the user enter the word using sequential search to search the data what they are looking from Items.txt. My main problem is when I enter 3 to display all the records or enter x to exit the program, it keeps on looping. But I don't how to resolve this problem. Can anyone solved this for me?

Items.txt

1000|Cream of Wheat|Normal Size|Breakfast|NTUC|5|3.00
1001|Ayam Brand|Small Size|Canned|NTUC|4|4.00

Product.java

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

public class Product {


    public static void main(String[] args) {

        ArrayList<Item> prdct = new ArrayList<Item>();
        String inFile = "items.txt";
        String line = "";
        FileReader fr = null;
        BufferedReader br = null;
        StringTokenizer tokenizer;

        int quantity;
        String id, brandname, desc, category, supplier;
        float price;

        try{
            fr = new FileReader(inFile);
            br = new BufferedReader(fr);

            line = br.readLine();

            while(line!=null)
            {
                tokenizer = new StringTokenizer(line,"|");

                id = tokenizer.nextToken();
                brandname = tokenizer.nextToken();
                desc = tokenizer.nextToken();
                category = tokenizer.nextToken();
                supplier = tokenizer.nextToken();
                quantity = Integer.parseInt(tokenizer.nextToken());
                price = Float.parseFloat(tokenizer.nextToken());

                Item itm = new Item(id,brandname,desc,category,supplier,quantity,price);
                prdct.add(itm);

                line = br.readLine();
            }
            br.close();     
        }
        catch(FileNotFoundException e){
            System.out.println("The file " + inFile + " was not found.");
        }
        catch(IOException e){
            System.out.println("Reading error!");
        }
        finally
        {
            if (fr!=null){
                try
                {
                    fr.close();
                }
                catch(IOException e)
                {
                    System.out.println("Error closing file!");
                }
            }
        }
        String INPUT_PROMPT = "\nPlease enter 3 to display all records, 4 to insert record, 5 to remove old records " + "or enter 'x' to quit.";
        System.out.println(INPUT_PROMPT);

        try
        {        
            BufferedReader reader = new BufferedReader
                    (new InputStreamReader (System.in));
            line = reader.readLine();

            while(reader != null)
            {
                for(int i=0; i<prdct.size(); i++)
                {
                     if(prdct.get(i).id.contains(line) || prdct.get(i).brandname.contains(line) || prdct.get(i).desc.contains(line)
                        || prdct.get(i).category.contains(line) || prdct.get(i).supplier.contains(line))
                     {
                            System.out.println(prdct.get(i));
                     }
                     System.out.println(INPUT_PROMPT);
                     line = reader.readLine();

                }
            }


            while("3".equals(line))
            {
                 for(int i=0; i<prdct.size(); i++)
                 {
                     System.out.println(prdct.get(i));
                 }
                 System.out.println(INPUT_PROMPT);
                 line = reader.readLine();

            }

            while(!line.equals("x"))
            {
                  System.out.println(INPUT_PROMPT);
                  line=reader.readLine();
            }
        }
        catch(Exception e){
            System.out.println("Input Error!");
        }
    }

}

Upvotes: 0

Views: 254

Answers (4)

RoaaGharra
RoaaGharra

Reputation: 710

The problem is with this loop:

        while(reader != null)
        {
            for(int i=0; i<prdct.size(); i++)
            {
                 if(prdct.get(i).id.contains(line) || prdct.get(i).brandname.contains(line) || prdct.get(i).desc.contains(line)
                    || prdct.get(i).category.contains(line) || prdct.get(i).supplier.contains(line))
                 {
                        System.out.println(prdct.get(i));
                 }
                 System.out.println(INPUT_PROMPT);
                 line = reader.readLine();

            }
        }

It keeps on looping while reader is not null and it will never be. You might want to try checking something else that suits your problem better, maybe:

  • While(!line.equals("3"))
  • While(!line.equals("x"))
  • While(line != null)

Otherwise, even if there is an 'x', '3' or simply nothing, still (reader != null) and therefore the loop is infinite.

Upvotes: 1

Noi Vu Duc
Noi Vu Duc

Reputation: 15

you have to define these functions:

public void showAllRecords() {
   // show all record here
}
public void insertRecord() {
   // insert record here
}
public void removeRecord() {
   // insert record here
}
public void exit() {
   // insert record here
}

then

do{
     System.out.println(INPUT_PROMPT);
    switch(line)
    {
      case "3":
           showAllRecords();
           break;
      case "4":
          insertRecord();
          break;
      case "5":
         removeRecord();
    }
}while(!line.equals('x'));

Upvotes: 0

slipperyseal
slipperyseal

Reputation: 2778

Try changing this..

       line = reader.readLine();

       while(reader != null)
       {

to this..

       line = reader.readLine();

       while(line != null)
       {

You are looping on the reader being not null, which it always will be.

Upvotes: 0

Nir Alfasi
Nir Alfasi

Reputation: 53535

I suspect that the newline character is what causes the comparison to fail.

Instead of checking if:

"3".equals(line)

Try:

"3".equals(line.trim())

Same applies to the following comparison.

Upvotes: 0

Related Questions