IO流基础之FileInputStream(输入流)

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读取文件内容的基本用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值