IO流
1 什么是IO流
PS:笔者不会讲解具体方法的具体使用和说明,在扩展里面会说明其中使用的方法。
2 Java中的IO流
在没有接触到IO之前写的Java程序基本上是暂时性的,它只运行在内存中,当运行完毕之后,程序就会停止。这不是我们想要的,因为往往我们需要将程序运行过程中产生的数据记录下来,以便下次再使用,这就需要JavaIO了。它可以将程序运行产生的数据记录下来并将其保存在指定的存储设备中,不会因为电脑的关闭而消失。
Java语言的IO体系基本上做得很完善,它是基于数据流Stream的形式输出或者输入数据的。而且最常用的就是流式部分。
下图也基本上介绍了Java的IO体系:
3 字节流
前面也介绍了数据是以二进制的方式在计算机中表示的,而8位二进制就组成了一个字节,Java用Unicode编码表示,一个字符用两个字节表示。
字节流,顾名思义,在使用的时候就是一个字节一个字节的方式传输数据,这种方式在实际中也是非常喜欢使用的,分为InputStream和OutputStream。
一开始笔者总是弄不清楚两者到底是怎么区分的。其实很简单,我们单独从内存这个角度看,将数据从内存输出到外界存储设备用OutputStream,将外接设备上的数据传送到内存上用InputStream。
InputStream和OutputStream是抽象类,他两不能直接创建对象,所以就需要使用其子孙类。可以说,子孙类的数量太多,笔者至今还是记不住,关键时刻还是查询API。
所以说,要想全部了解IO的API,那是不可能的,我们只需要了解其基本的使用就行,其他的用时再查。
其具体方法不做讲解。
4 字符流
一个字符用两个字节来表示。字符流针对的主要是字符串方面的操作进行了优化,就像是.txt文本文件一样,用字符流操作效率会更高。
字符流的两个顶级类:Writer和Reader,同样的是抽象类,不能直接创建对象,其子孙类也是特别的多。
是不是觉得没有代码,不知从何下手,放心,最后会有一个案例。
其具体方法不做讲解。
5 缓冲流
缓冲流是做什么用的?计算机访问外存非常耗时,访问外存的频率越高,CPU的占用率就会非常大,这样会影响计算机的其他任务。
所以说,为了减少访问外存的频率,就使用到缓冲的技术。缓冲就是在一次访问外存的时候,尽量读取多个数据。
大多数还是尽量使用缓冲技术,这样会提高读取到速率。
/**
*
* @author Administrator
* 目标:测试从控制台输入数据并读取数据将其输出
*/
public class TestConsole {
public static void main(String[] args) throws IOException {
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(is);
String text = reader.readLine();
System.out.println(text);
}
}
6 文件的复制
将文件A中的内容复制到文件B中,文件A是已经存在的。
一个文件的复制包含以下几个步骤:创建文件B、读取文件A的内容、将文件A的内容写入到文件B中、关闭IO流。
这里涉及到文件类File,具体的方法和使用可以参考API。
关闭IO流是很重要的步骤,必须要关闭,否则将会一直占有CPU资源。
FileInputStream rf = null;
FileOutputStream of = null;
try{
//首先要获取A文件
File fileA = new File("D:\\A.jpg");
//读取A文件内容
rf = new FileInputStream(fileA);
//一次最多读取1024个字节的内容
int n = 1024;
byte buffer[] = new byte[n];
//创建B文件
File fileB = new File("D:\\B.jpg");
fileB.createNewFile();
//创建B文件的输出对象
of = new FileOutputStream(fileB);
while((rf.read(buffer,0,n)!=-1)&&(n>0)){
// System.out.println(new String(buffer));
of.write(buffer, 0, n);
}
} catch(IOException IOe){
System.out.println(IOe.toString());
} finally {
of.close();
rf.close();
}
以上演示的是图片的复制,大家有兴趣也可以使用字符流和缓冲来进行文本文件的复制。
扩展:
- File类:这是很频繁使用的一个类,不仅是表示某种具体的文件类型,同时也可以通过mkdirs()来创建文件目录。
- read和write方法:该方法有很多重载的方法参数,以上的是用字节数组来指定每一次访问的字节数,read方法如果读取文件内容完毕,那么就会返回一个值-1,否则返回的是读取的字节数。
- 通过while语句就可以知道,字节流需要多次访问外存来读取数据。