这里的 InputStreamReader 有什么问题吗?

Whats wrong with InputStreamReader here?

我创建了一个 Java 购物车应用程序。我为此使用了 InputStreamReader class 。但它表现出奇怪的行为。我已经尝试过 Scanner class 和 Data Input Stream class。但是他们似乎不适合这个应用程序。

任何人都可以指出这个 class 有什么问题吗?

同样如前所述,Scanner class 和 DIS class 倾向于跳过用户输入,与此处使用 ISR class 时相同(参见输出:速率)。我厌倦了尝试每个 Java 用户输入实用程序 class,并一次又一次地修改我的代码。

import java.util.ArrayList;
//import java.util.InputMismatchException;
import java.util.Iterator;
import java.util.Scanner;
import java.io.DataInputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.lang.Throwable;


public class NewShop {


protected ArrayList<NewItem> ItemList;
ArrayList<NewItem> cartList ;

   // public DataInputStream dis = new DataInputStream(System.in);
   // private Scanner sc = new Scanner(System.in);
  private InputStreamReader isr = new InputStreamReader(System.in);

 public void addItem() {

    long aCode = 0;
    String aName ="";
    double aRate = 0;
    int aQuantity = 0;
    NewItem foundItem;

    System.out.println("Enter Item code:");
   /* try{
    String adddisString = dis.readLine();}
      catch(IOException e){e.printStackTrace();} */

    try{
    aCode = isr.read();
      System.out.println("code entered is : " + aCode);
       }
         catch(IOException e){e.printStackTrace();}

    foundItem = search(aCode);
    if (foundItem == null) {
        System.out.println("Item name : ");
        try{
        aName = dis.readLine();
          }
             catch(IOException e){e.printStackTrace();}
        System.out.println("Rate : "); 
        try{ aRate = isr.read(); }
           catch(IOException e){e.printStackTrace();}

        System.out.println("Quantity : ");
        try{aQuantity = isr.read();}
        catch(IOException e){e.printStackTrace();}


                  NewItem aItem = new NewItem(aName, aRate, aCode, aQuantity);
                  ItemList.add(aItem);
                  }
                  else {
                  System.out.println("Item exists");
                  }


  } 

}

输出:

shachindratripathi@saurabh-OptiPlex-3010:~/NewJava$ java NewShoppingCart
  New Shop for Items created.
  -----ITEM------
1. Display all items
2. Search items
3. Add items to list
4. Add items to cart
5. Issue item
6. Exit
Choice:
3
Enter Item code:
1
code entered is : 49
Item name : 
apple
Rate : 
Quantity : 
30
1. Display all items
2. Search items
3. Add items to list
4. Add items to cart
5. Issue item
6. Exit
Choice:
1
       code           name           rate          quantity 

        49            apple           10.0           51

                              ************ 
1. Display all items
2. Search items
3. Add items to list
4. Add items to cart
5. Issue item
6. Exit
Choice:

你这样做:

aCode = isr.read();

其中 returns 您输入的第一个字符的 Int 值(参见 Ascii-Table)。 所以对于你输入的“1”,你会得到“1”的Ascii码,也就是49。

如果你想用 InputStreamReader 读取字符串,可以这样做:

InputStreamReader isr = new InputStreamReader(System.in)
int c;
String input = "";
while((c = isr.read()) != -1){
        input+= (char) c;
}

但是如果你对这类东西使用扫描仪,你会得到更好更容易的结果,请参阅@AxelH 的回答。

InputStreamReader 允许您使用 read 为每个字符读取一个 Stream 字符,这会给您一个 int

那个int不是你想的值,它是一个char表示的数字,所以

'0' = 48
'1' = 49
...

更多内容 ASCII table

您可能想在这里使用的是 Scanner which is more simple in your case or a BufferedReader,它使您有可能在 String.

中获得完整的行
Scanner sc = new Scanner(System.in);
int i = sc.nextInt(); //This will get the next number an parse it in an integer (or throw an exception)
//careful, the <ENTER> is still in the buffer, flush with sc.nextLine(); if needed
sc.close();

使用 Scanner 跳过某些输入的原因如上,当您读取特定类型(如 readInt)时,不会读取 "enter" 键,因此它仍然存在在缓冲区中,下一次调用 nextLine 将读取它。您需要先清除该输入,然后才能获得正确的值。

int i = sc.nextInt(); 
sc.nextLine(); //clear <enter>
String s = sc.nextLine(); //next input

如果你使用 Readers 你必须自己转换任何非字符串值。 DataInputs 使用二进制格式,不适合用户输入。

因此,最简单的解决方案是 Scanner,因此请尝试这样的操作:

public class NewShop
{
  protected ArrayList<NewItem> ItemList;
  ArrayList<NewItem> cartList ;
  private Scanner in = new Scanner(System.in);
  public void addItem()
  {
    long aCode = 0;
    String aName ="";
    double aRate = 0;
    int aQuantity = 0;
    NewItem foundItem;
    System.out.println("Enter Item code:");
    try
    {
      aCode = in.nextLong(); // this reads the to the first char that is not part of the 
      in.nextLine();         // long value, so we need to read till the end of the line...
      System.out.println("code entered is : " + aCode);
      foundItem = search(aCode);
      if (foundItem == null)
      {
        System.out.println("Item name : ");
        aName = in.nextLine();
        System.out.println("Rate : "); 
        aRate = in.nextDouble();
        in.nextLine();
        System.out.println("Quantity : ");
        aQuantity = in.nextInt();
        in.nextLine();
        NewItem aItem = new NewItem(aName, aRate, aCode, aQuantity);
        ItemList.add(aItem);
      }
      else
      {
        System.out.println("Item exists");
      }
    }
    catch(IOException e)
    {
      e.printStackTrace();
    }
  } 
}

也去掉了里面的try-catches好像有什么值是错误的,以后就不行了...