这里的 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
如果你使用 Reader
s 你必须自己转换任何非字符串值。
DataInput
s 使用二进制格式,不适合用户输入。
因此,最简单的解决方案是 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-catch
es好像有什么值是错误的,以后就不行了...
我创建了一个 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
如果你使用 Reader
s 你必须自己转换任何非字符串值。
DataInput
s 使用二进制格式,不适合用户输入。
因此,最简单的解决方案是 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-catch
es好像有什么值是错误的,以后就不行了...