IO流???
流,看字面意思就觉得跟水有关系,流动的,无结构的,其实就是编程语言的无结构流动,而把编程语言输入输出变成我们能理解的就是IO流,我们的鼠标键盘的输入输出就是利用流的概念来实现的,而流有字节流和字符流,顾名思义,字节流就是根据一个字节一个字节来输入输出,字符流就是根据一个字符一个字符输入输出,而一个字符等于两个字节,在GBK编码中,一个字母(不区分大小写)占一个字节,一个汉字占两个字节。还有一件事,使用流会占用我们的内存资源,所以当我们不使用流时,要切记把流关掉
System.in是一个很原始,很简陋的输入流,我们一般不直接用,而要把它封装起来。
然后调用read方法读出
public static void test() {
InputStream is = System.in;
try {
int a = is.read();
System.out.println(a);
System.out.println((char) a);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
//注意最后要关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面的方法能使控制台获取到我们键盘输入的内容,但输入一次后就会关闭
我们可以可以给它加个while循环
public static void test1(){
InputStream in = System.in;
while(true){
try {
int a = in.read();
System.out.println(a);
System.out.println((char)a);
} catch (IOException e) {
e.printStackTrace();
}
}
}
控制台会处在一个一直运行的状态
所以我们给它加个if语句,当我们输入q时退出
public static void test2(){
InputStream in = System.in;
while(true){
try {
int a = in.read();
System.out.println(a);
System.out.println((char)a);
if((char)a=='q'){
System.out.println("程序正常退出");
System.exit(0);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上一个方法中我们只能输入一个int类型的,我们能不能想办法是它可以输入多种类型呢?我们可以定义一个数组,然后把定义的输入流内容放数组里面,然后用read方法读取,然后用String的方法定义一个String,把数组放String里面,然后再做一个判断,当我们输入exit时程序退出
public static void test3(){
InputStream a =System.in;
while(true){
byte[] b = new byte[4];
try {
a.read(b);
String str = new String(b);
System.out.println(str);
if(str.equals("exit")){
System.out.println("你居然让我退出,我要退出了");
System.exit(0);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
下面介绍一种方法需要在命令行运行的,用这种方式呢在eclipse下是操作不了的,运行程序,然后打开我们的命令提示符,运行我们的java文件即可
public static void test4(){
System.out.println("程序开始了");
if(System.console()!=null){
String str = null;
while((str=System.console().readLine())!=null){
System.out.println(str);
if(str.equals("exit")){
System.out.println("我要退出了");
System.exit(0);
}
}
}else{
System.out.println("快去命令行!!");
}
}
上面的方法需要我们去命令提示符才能运行,觉得挺麻烦的,于是我们引用Scanner这个类,Scanner能读出我们输入的一行内容,写一个while循环使程序一直运行,然后写一个if语句判断如果输入exit就退出程序
public static void test5(){
System.out.println("程序启动了");
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextLine()){
String str = scanner.nextLine();
System.out.println(str);
if(str.equals("exit")){
System.out.println("我要退出了");
System.exit(0);
}
}
}
以上就是我们可以使用的方法读取键盘输入的内容,接下来介绍FileInputStream输入流,我们首先查看FileInputStream的api文档,我们看到构造方法和方法摘要,说明我们要使用FileInputStream要先new一个对象
这里我们使用read方法,在根目录下建一个a.txt,在里面写上一些int类型的,看到read方法的详细信息,当到达文件末尾就返回一个-1,这也是为什么我们下面代码while循环里不等于-1的由来
public static void test6(){
FileInputStream fis = null;
try {
fis = new FileInputStream("a.txt");
int a ;//定义一个int类型a
while((a=fis.read())!=-1){
System.out.print((char)a);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上面的方法只能读取int类型的,下面我们来定义一个数组,使它以字节的形式传输,并把数组放到String里面,使其能完全读取出来
public static void test7(){
InputStream is = null;
try {
is = new FileInputStream("a.txt");
byte name[] = new byte[1024];
while(is.read(name)!=-1){
String str = new String(name);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面的方法有一个缺陷,那就是如果我们的数组byte定义的不够大,那么就会出错,例如数组里面定义为3,在a.txt里面写abcde,那么输出的结果就会为:
其实我们程序运行的过程如下,一次读两个字节,第一次读:ab;第二次读:cd;第三次读:e;其实程序是覆盖的,第二次读的cd会覆盖第一次的ab,可是第三次读的e只有覆盖c,所以输出的是ed,所以缺陷就是我们不知到读取的文件有多大,而数组写太大会浪费资源
所以下面介绍另一种方法,这里的int只是读出个数,并不读出内容,只读出b.length(b的长度)
public static void test8(){
InputStream is = null;
try {
is = new FileInputStream("a.txt");
byte[] b = new byte[5];
int len = 0;
//is.read(b)只是读出数组里面包含的个数,并不是内容
while((len = is.read(b))!=-1){
for(int i=0;i<len;i++){
System.out.print((char)b[i]);
}
}
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
下面再介绍一种String的方法,
用String的方法读出数组b从第零个到数组结束的全部内容
public static void test9(){
try {
InputStream is = new FileInputStream("a.txt");
byte[] b = new byte[5];
int len = 0;
while((len=is.read(b))!=-1){
String str = new String(b,0,len);
System.out.println(str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
以上就是IO流的输出流FileInputStream读取文件内容的基本用法