菜鸟学习笔记:Java IO流1——IO流的概念、字节流、字符流、缓冲流、转换流
IO流的原理及概念
在基础篇的讲解中大家已经了解了File对象以及它的一些方法(复习链接)。但是File的主要作用仅仅是建立文件和程序的联系,File对象的方法只能用于文件和目录的创建、文件的查找和文件的删除等功能,但无法对文件的内容做具体的操作。所以引入了现在所要讲的IO流知识点。
在Java程序中,对数据的输入输出操作以“流”的方式进行:
如果大家觉得不好理解可以这样想,我们要读取的文件好比一个装满水的桶,文件内容就是里面的水,我们的流相当于一根管道,一端接文件,一端接程序,读取文件就相当于把水抽过来,,放到程序里。不过不一样的一点是读取文件后原文件内容不变,也就是抽水过程不影响文件桶里的水,抽的水凭空产生。
对于IO流按不同的角度可以分成不同的类:
- 如果以数据流向可以分为输入流(程序从文件抽水)和输出流(文件从程序抽水)。
- 如果以读取数据的基本单元来划分可以分为字节流(读取基本单位是字节)和字符流(读取基本单位是字符)。这里稍微讲解一下字节和字符,字节是计算机存储的一个基本单位,它由8个2进制位组成。而一个字符表示一个文字所占的大小,为2个字节。一般情况下字节流可以用来读取一切文件,而字符流只能读取文本文件。
- 如果按照功能来划分又可以把IO流划分为节点流(基本读取用)和处理流(包裹节点流,提高性能)。
节点流
字节流
由于读取的基本单位是字节,字节是文件的基本构成单位,所以字节流可以处理一切图片、视频音频、文本文件。InputStream和OutputStream类是Java中字节流的实现,通过这两个类所提供的方法,可以实现用字节流文件读写。
文件读取
对于流的操作我们都用代码来呈现,为方便读取代码,首先讲解几个点:
- FileInputStream是InputStream的子类,可以用来建立文件与程序间的流
- FileInputStream类的read(byte[] b)方法用来读取文件,b表示一个读取用的容器,每次读取的内容会存放到b中,该方法会返回每次读取文件的长度,如果读取内容为空会返回-1,也就是读取完成。
- jdk1.7之前读取完成需要手动调用close()方法关闭流。
有了这些知识基础我们就可以看实例代码了,这段代码的功能就是从文件中读取内容并输出,首先看我们的文件:
public static void main(String[] args) {
//1、建立联系 File对象
File src =new File("D:/testFile/haha.txt");
//2、选择流(输入字节流)
//注意流需要在读取结束后关闭,必须放在trycatch之外。jdk1.7之后可不用这样
InputStream is =null;
//首先IO操作会产生FileNotFoundException和IOException两个异常,需要捕获出路
try {
//建立程序和文件之间的流(之前例子里的水管)
is =new FileInputStream(src);
//3、操作 不断读取 缓冲数组
byte[] car =new byte[1024];
int len =0; //接收 实际读取大小
//循环读取
StringBuilder sb =new StringBuilder();
while(-1!=(len=is.read(car))){
//输出 字节数组转成字符串
String info =new String(car,0,len);
sb.append(info);
}
System.out.println(sb.toString());//打印haha
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件不存在");
} catch (IOException e) {
e.printStackTrace();
System.out.println("读取文件失败");
}finally{
try {
//4、释放资源
if (null != is) {
is.close();
}
} catch (Exception e2) {
System.out.println("关闭文件输入流失败");
}
}
}
程序效果
文件写出
和读入对应
- 写出文件所用的是FileOutputStream(dest,true),构造方法中第一个参数表示要写入的文件对象。第二个参数为true表示如果文件存在则追加内容 ,false表示覆盖文件内容。
- 写入文件用的是write(data,start,end)方法,data必须为byte[]类型,可以指定开始和结束位置。
- flush()方法的作用是将存放在流中的数据强行写道文件中防止写出文件不完整的情况。
输出流的代码如下:
public static void main(String[] args) {
//1、建立联系 File对象 目的地
File dest =new File("D:/testFile/houhou.txt");
//2、选择流 文件输出流 OutputStream FileOutputStream
OutputStream os =null;
//以追加形式 写出文件 必须为true 否则为覆盖
try {
os =new