(一)、基础知识
1.什么是IO?
IO是输入input输出output的首字母缩写形式,直观意思是计算机输入输出,它描述的是计算机的数据流动的过程,因此IO第一大特征是有数据的流动;另外,对于一次IO,它究竟是输入还是输出,是针对不同的主体而言的,不同的主体有不同的描述。例如,甲乙两人交谈,甲将大脑中的想法通过声带震动,继而通过声波传入乙的耳朵,乙通过耳膜的震动再由神经将信号解析到大脑,这个数据流动的过程对甲而言是输出,对乙而言是输入。
2.什么是流?
(1).概念:内存与储存设备之间传输数据的通道
eg: 我们的程序存储在内存中,我们的文件存储在硬盘中 水库: 数据 输水的管道: 相当于流 接水池: 流入/流出 水借助管道进行流入/流出 数据借助流进行传入/传出
3.流的分类
(1).按照流的方向
输入流: 将硬盘中的数据读入到内存中
输出流: 将内存中的数据输出到硬盘中
(2).按单位:
字节流:以字节为单位,可以读写所有数据。
字符流:以字符为单位,只能读写文本数据。
(3).按功能划分:
节点流 :具有实际传输数据的读写功能
过滤流 :在节点流的基础之上增强功能
(二).文件字节流(FileInputStream与FileOutStream)
4.字节流的父类(抽象类)
InputStream : 字节输入流 (1). public int read(){} 从输入流读取数据的下一个字节。 OutputStream : 字节输出流 (1). public void write(){} 将指定的字节写入此输出流。
5.文件字节流(输入流)
FieInputStream : 文件输入流 (1). public int read(byte[] b) 从流中读取多个字节,将读到的内容存入 b数组,返回实际读到的字节数;如果达到文件的尾部返回-1 FileOutputStream : 文件输出流 (1).public void write(byte []b) 一次写多个字节,将b数组中的所有字节,写入输出流.
基本思路:
public int read(){} 单个单个的读取
1.创建文件输入流,
2.读取文件,因为读的操作(如果文件的下一个为空,那么返回-1)
3.打印读取的文件信息
4.一定要关闭文件的流操作
import java.io.FileInputStream; public class Demo0 { public static void main(String[] args) throws Exception{ //1.创建文件输入流 ,并且指定文件路径 FileInputStream fileInputStream_one=new FileInputStream("e:\\123.txt"); //2.读取文件 int date=0; while ((date=fileInputStream_one.read())!=-1){ System.out.print((char)date); } fileInputStream_one.close(); } }
基本思路:
1.利用byte数组 一次性储存数据
2.利用new String() 函数,实现以字符串的形式进行输出
3.read() 返回的类型是int ,单个返回指的是ascll码,如果是byte 那么返回的是读取的个数.
import java.io.FileInputStream; public class Demo0 { public static void main(String[] args) throws Exception{ //1.创建文件输入流 ,并且指定文件路径 FileInputStream fileInputStream_one=new FileInputStream("e:\\123.txt"); //2.读取文件 byte date[]=new byte[4]; int count=fileInputStream_one.read(date); System.out.println(fileInputStream_one.read()); System.out.println(new String(date)); System.out.println("个数为:"+count); fileInputStream_one.close(); } }
二次读取操作
import java.io.FileInputStream; public class Demo0 { public static void main(String[] args) throws Exception{ //1.创建文件输入流 ,并且指定文件路径 FileInputStream fileInputStream_one=new FileInputStream("e:\\123.txt"); //2.读取文件 byte date[]=new byte[3]; //第一次读取 int count=fileInputStream_one.read(date); System.out.println(new String(date)); System.out.println("个数为:"+count); //第二次读取 int count1=fileInputStream_one.read(date); System.out.println(new String(date)); fileInputStream_one.close(); } }
byte[]数组的
import java.io.FileInputStream; public class Demo0 { public static void main(String[] args) throws Exception{ //1.创建文件输入流 ,并且指定文件路径 FileInputStream fileInputStream_one=new FileInputStream("e:\\123.txt"); //2.读取文件 byte date[]=new byte[3]; int count=0; while ((count=fileInputStream_one.read(date))!=-1){ System.out.println(new String(date)); } fileInputStream_one.close(); } }
6.文件字节流 (输出流)
基本思路: 1.FileOutputStream 输出流 2.write 写的操作
import java.io.FileOutputStream; public class Demo1 { public static void main(String[] args) throws Exception{ //1.创建文件的输出流 FileOutputStream fileOutputStream_one=new FileOutputStream("e://123.txt"); /* //2.写文件 fileOutputStream_one.write(97); fileOutputStream_one.write('b'); fileOutputStream_one.write(99); */ String string="hello word"; fileOutputStream_one.write(string.getBytes()); //3.关闭文件 fileOutputStream_one.close(); System.out.println("项目执行完毕!"); } }
7.文件字节流复制文件
基本思路: 1.首先先从文件中读取数据 2.然后开始使用文件写入数据 3.1024个字节等于1kb,假如说字节数写少了,那么读取的文件会不完整。
import java.io.FileInputStream; import java.io.FileOutputStream; public class Demo0 { public static void main(String[] args) throws Exception{ //1.创建文件输入流 ,并且指定文件路径 FileInputStream fileInputStream_one=new FileInputStream("E:\\美化图片\\123.jpg"); FileOutputStream fileOutputStream_one=new FileOutputStream("E:\\美化图片\\13.jpg"); //2.边读边写 byte []buf=new byte[1024]; int count=0; //每次都读取1024个字节 while ((count=fileInputStream_one.read(buf))!=-1){ //截取具体化 fileOutputStream_one.write(buf,0,count); } fileInputStream_one.close(); fileOutputStream_one.close(); System.out.println("项目完毕!"); } }
(三)、字节缓冲流(BufferedOutputStream)
8.字节缓冲流(输入流)
缓冲流: BufferedInputStream/BufferedOutputStream 1.提高IO效率,减少访问磁盘的次数 2.数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close. 3.在使用的过程中,会创建一个缓冲区.用于数据的缓存
基本思路: 1.创建文件流,先获取文件() 2.把文件放入缓冲区中去 3.利用缓冲区进行访问文件 (相当于一次性就把文件放入到缓冲区,就访问了一哈硬盘)
import java.io.BufferedInputStream; import java.io.FileInputStream; public class Demo3 { public static void main(String[] args) throws Exception { //1.创建一个输入流 FileInputStream fileInputStream=new FileInputStream("e://123.txt"); //2.创建一个缓冲流,并且把文件写入到缓冲区 BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream); //3.读取数据 int count=0; while ((count=fileInputStream.read())!=-1){ System.out.println((char)count); } fileInputStream.close(); bufferedInputStream.close(); } }