package net.csdn.InputStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * Created by rabbit先生 on 2017/3/11 0011.
 */
public class FileInputStreamDemo {
	/**
	 * 前面已经说过了File类,其主要作用就是对文件进行操作,
	 * 例如读取文件,确定文件的名字,修改时间等问题,但都是基于文件级别的操作
	 *
	 * 今天,我们来将对文件内容的读取操作,在java中对文件进行操作使用的是IO流
	 * IO流:就是指InputStream(输入流)和OutputStream(输出流)
	 * 特别说明:
	 * 输入流就是把文件中的东西进行输入到内存中,
	 * 输出流就是把内存中的东西输出到文件中,
	 * 我们可以使用内存来做分别,输入到内存就是输入流,从内存中输出就是输出流
	 *
	 * 我们使用最基础的类:FileInputStream
	 * 使用文件路径:F:\fileInputStream\a.txt
	 * a.txt文件中的内容是:abcdefghijklmn
	 * 最后:流就像是水龙头一样,有开有关,所以使用交流之后记得对流进行关闭操作,
	 * 不然会浪费内存,导致你的电脑开发的时候越来越卡
	 */

	//创建FileInputStream对象,使用FileInputStream(File file)
	//创建这个对象的时候需要传递一个File类,所以我们先创建File类,使用File(String pathname)
	//我们传递一个本地文件的绝对路径就可以了
	public  static  void main(String[] args) throws Exception {
		//创建File类对象
		File file = new File("F:\\fileInputStream\\a.txt");
		//创建FileInputStream对象,并关联对应的文件,创建对象的时候会出现异常
		FileInputStream fis = new FileInputStream(file);
		//我们现在可以通过FileInputStream对象对文件的内容进行读取了
		/*************第一种方式开始代码{一次读取一个}****************/
		//使用的时候请关闭方式二的代码
//		int len;
		//循环一个一个读取{当读取不到的时候会返回-1所以可以使用这个做循环的条件}
		//可能有人觉得奇怪,我文件里面的内容是字母,为什么可以使用int类型接收呢?
		//答案:读取的时候获取到的是ASCII碼{可以System.out.println(len);不转换输出试一下},
		// 所以我们需要转换
//		while ((len = fis.read()) != -1) {
//			System.out.println((char)len);
//		}
//		fis.close();//关闭流
		/*************第一种方式结束代码****************/

		/*************第二种方式开始代码{一次读取多个放到字节数组中}****************/
		//这种方式效率更加高,因为不用频繁的操作硬盘,一次就读了1M
		//byte[] bytes = new byte[1024];//为了读取方便,一次读取1M,
		//将读取到的数据保存到bytes这个字节数组中
		int length;
		byte[] bytes = new byte[1024];
		while ((length = fis.read(bytes)) != -1) {
			System.out.print(new String(bytes, 0, length));//将数据变为字符串输出
		}
		fis.close();//关闭流
		//int read = fis.read(bytes);//返回读取到的长度{也是字节数组中的长度}
		/*************第二种方式结束代码****************/

	}


}