1.IO流
1.概念
* IO流用来处理设备之间的数据传输
* Java对数据的操作是通过流的方式
* Java用于操作流的类都在IO包中
* 流按流向分为两种:输入流(读取数据),输出流(写入数据)。
* 流按操作类型分为两种:
* 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
* 字符流 : 字符流只能操作纯字符数据,比较方便。
2.IO流常用父类
* 字节流的抽象父类:
* InputStream
* OutputStream
* 字符流的抽象父类:
* Reader
* Writer
* 3.IO程序书写
* 使用前,导入IO包中的类
* 使用时,进行IO异常处理
* 使用后,释放资源
2.FileInputStream
1 //从一个文件中读取数据 2 /** 3 * 1。创建一个文件输入对象,并关联a。txt 4 * 2.定义一个遍历,记录每次读到的字节 5 * 3.循环遍历打印读出该内容 6 * read()方法 依次读取一个字节 7 */ 8 FileInputStream file = new FileInputStream("a.txt"); 9 int b; 10 while((b = file.read()) != -1) { 11 System.out.println(b); 12 } 13 //释放资源!! 14 file.close(); 15 16 /** 17 * throws抛出的是文件可能找不到的错误 18 * 读文件是也有可能读不成功,同样需要进行异常处理 19 * FileNotFoundException是IOException的一个子类 20 * 输出内容就是GBK编码,原因GBK编码包含了ASCII码表 21 * -1表示文件的结尾,当遇到-1时,表示文件已经读取完毕 22 * 23 */
3.read()方法返回值为什么是int
read()方法读取的试试一个字节,为什么返回的是int而不是byte
因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式存储,如果每次读取都返回byte,
有可能在读到中间的时候遇到11111111,那么这11111111在byte中表示的是-1,而我们的程序在遇到-1时停止运行,后面的数据
会丢失,所以在读取时用int类型,如果遇到11111111时会在前面补上3个字节的0,byte类型的-1就变成int类型的255
这样就可以保证整个数据都可以读取完成,读取完成后,就会返回个-1,结束程序
4.FileOutputStream
1 //write()方法一次录入一个字节 2 //如果没有b.txt的话,就创建一个 3 FileOutputStream file = new FileOutputStream("b.txt"); 4 //虽然输入的时int类型,但在写出时会自动转为byte类型,去掉前面的3个字节 5 file.write(98); 6 //释放资源 7 file.close(); 8 9 10 //追加功能 11 //重新在录入时,会把原来的数据清除掉,在去添加,也就是把原来的数据覆盖掉 12 //在关联文件时,加一个true的关键字,就不会覆盖,而是在原来数据之后在添加内容 13 FileOutputStream file1 = new FileOutputStream("b.txt",true); 14 file1.write(98); 15 file1.write(99);
5.拷贝文件
1 FileInputStream file = new FileInputStream("F:\21班Java基础课程\课件视频\day20_IO流\video\01.wmv"); 2 FileOutputStream file1 = new FileOutputStream("F:\21班Java基础课程\课件视频\day20_IO流\video\复制.wmv"); 3 //获取关联文件的所有字节 4 int i = file.available(); 5 //声明一个和文件大小一样的byte的数组 6 byte [] bytes = new byte[i]; 7 //一次性的读完整个文件的所有内容 8 file.read(bytes); 9 //把这个内容一次性的写入指定的文件 10 file1.write(bytes); 11 file.close(); 12 file1.close();