前几天有人问我一个问题,怎么从控制台输入一个int数组,我想使用System.in标准输入流来输入啊,可一看InputStream的方法中的所有read()方法都是输入字节流,没有直接输入基本类型的方法,这的确让我很郁闷
这让我想起以前写C的时候了,标准输入不是个问题,用一个scanf什么都解决,可为什么java中就没有这么方便的方法呢,肯定有他的道理啊,James Gosling肯定有这样设计的用意的啊,可能Java用控制台输入不太常用吧,我在学习中就没怎么用到过啊,所以一直也没去注意过,一些书上都没有提到啊,所以我还要感谢问我问题的那个朋友,让我可以去研究一下还不清楚的东西,学习就是这样,不是吗?
下面是我这两天总结的基本类型的输入问题,Google一下会发现有很多这种问题,所以我研究过别人的解决方法,再加上自己的一些理解
下面先看一下整个java中的输入流,Java中的输入流有两种,就是java.io.InputStream和java.io.Reader
他们的继承结构如下
Java.lang.Object
|_____java.io.InputStream
|_____java.io.AudioInputStream
|_____java.io.ByteArrayInputStream
|____java.io.FileInputStream
|_____ java.io.FilterInputStream
|_____ java.io.InputStream
|_____java.io.ObjectInputStream
|_____java.io.PipedInputStream
|_____java.io.SequenceInputStream
|_____java.io.StringBufferInputStream
Java.lang.Object
|_____java.io.Reader
|_____java.io.BufferedReader
|_____java.io.CharArrayReader
|____java.io.FilterReader
|_____ java.io.InputStreamReader
|_____ java.io.PipedReader
|_____java.io.StringReader
每个子类里面都挺复杂的,把他都研究清楚还挺花时间的,下面就先看看最基本的吧
1. InputStream类
public abstract class InputStream
extends Object
implements Closeable
InputStream是个抽象类,所以不能新建对象,但可以有引用,比如System.in就是
它的一个引用(我猜想,在源代码中是public final static InputStream in = nullInputStream();
谁知道给我解释下,谢谢了)此抽象类是表示字节输入流的所有类的超类。
2.Reader类
public abstract class Reader
extends Object
implements Readable, Closeable
用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
到现在还是没有解决那个问题,怎么输入基本类型,我现在知道可以先读取String
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class GetInt {
public static void main(String[] argv) {
while (true) {
System.out.print(GetInt.getInt());
}
}
public static String getString() {
String string = "";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
string = br.readLine();
} catch (IOException e) {
System.err.println(e);
}
return string;
}
public static int getInt() {
return Integer.parseInt(getString());
}
}
还要提的是DataInput接口,DataInput 接口用于从二进制流中读取字节,并重构所有 Java 基本类型数据。
java.io.InputStream
|___ java.io.FilterInputStream
|___ java.io.DataInputStream
public class DataInputStream
extends FilterInputStream
implements DataInput
DataInputStream实现了DataInput接口,数据输入流允许应用程序以与机器无关方式从基础输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。 DataInputStream提供了很多的方法读取基本类型,但我还不会用,谁会的教教我啊,比如下面的代码
import java.io.DataInputStream;
public class Test1 {
public static void main(String[] argv) {
DataInputStream dis = new DataInputStream(System.in);
try {
int a = dis.readInt();
System.out.print(a);
} catch (Exception e) {
}
}
}
输入1,输出822938125 ????????JDK API解释:此输入流的下四个字节,将它们解释为一个 int。??????
直到JDK1.5的时候有了Scanner类,一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。例如,以下代码使用户能够从 System.in 中读取一个数:
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
具体方法可以看API啊,这还比较方便,可能是James也觉得输入太麻烦,加入的吧(呵呵),但Scanner功能非常强大,待我好好研究 ~~
这让我想起以前写C的时候了,标准输入不是个问题,用一个scanf什么都解决,可为什么java中就没有这么方便的方法呢,肯定有他的道理啊,James Gosling肯定有这样设计的用意的啊,可能Java用控制台输入不太常用吧,我在学习中就没怎么用到过啊,所以一直也没去注意过,一些书上都没有提到啊,所以我还要感谢问我问题的那个朋友,让我可以去研究一下还不清楚的东西,学习就是这样,不是吗?
下面是我这两天总结的基本类型的输入问题,Google一下会发现有很多这种问题,所以我研究过别人的解决方法,再加上自己的一些理解
下面先看一下整个java中的输入流,Java中的输入流有两种,就是java.io.InputStream和java.io.Reader
他们的继承结构如下
Java.lang.Object
|_____java.io.InputStream
|_____java.io.AudioInputStream
|_____java.io.ByteArrayInputStream
|____java.io.FileInputStream
|_____ java.io.FilterInputStream
|_____ java.io.InputStream
|_____java.io.ObjectInputStream
|_____java.io.PipedInputStream
|_____java.io.SequenceInputStream
|_____java.io.StringBufferInputStream
Java.lang.Object
|_____java.io.Reader
|_____java.io.BufferedReader
|_____java.io.CharArrayReader
|____java.io.FilterReader
|_____ java.io.InputStreamReader
|_____ java.io.PipedReader
|_____java.io.StringReader
每个子类里面都挺复杂的,把他都研究清楚还挺花时间的,下面就先看看最基本的吧
1. InputStream类
public abstract class InputStream
extends Object
implements Closeable
InputStream是个抽象类,所以不能新建对象,但可以有引用,比如System.in就是
它的一个引用(我猜想,在源代码中是public final static InputStream in = nullInputStream();
谁知道给我解释下,谢谢了)此抽象类是表示字节输入流的所有类的超类。
2.Reader类
public abstract class Reader
extends Object
implements Readable, Closeable
用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
到现在还是没有解决那个问题,怎么输入基本类型,我现在知道可以先读取String
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class GetInt {
public static void main(String[] argv) {
while (true) {
System.out.print(GetInt.getInt());
}
}
public static String getString() {
String string = "";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
string = br.readLine();
} catch (IOException e) {
System.err.println(e);
}
return string;
}
public static int getInt() {
return Integer.parseInt(getString());
}
}
还要提的是DataInput接口,DataInput 接口用于从二进制流中读取字节,并重构所有 Java 基本类型数据。
java.io.InputStream
|___ java.io.FilterInputStream
|___ java.io.DataInputStream
public class DataInputStream
extends FilterInputStream
implements DataInput
DataInputStream实现了DataInput接口,数据输入流允许应用程序以与机器无关方式从基础输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。 DataInputStream提供了很多的方法读取基本类型,但我还不会用,谁会的教教我啊,比如下面的代码
import java.io.DataInputStream;
public class Test1 {
public static void main(String[] argv) {
DataInputStream dis = new DataInputStream(System.in);
try {
int a = dis.readInt();
System.out.print(a);
} catch (Exception e) {
}
}
}
输入1,输出822938125 ????????JDK API解释:此输入流的下四个字节,将它们解释为一个 int。??????
直到JDK1.5的时候有了Scanner类,一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。例如,以下代码使用户能够从 System.in 中读取一个数:
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
具体方法可以看API啊,这还比较方便,可能是James也觉得输入太麻烦,加入的吧(呵呵),但Scanner功能非常强大,待我好好研究 ~~