有关Java中的IO流
一、IO概述
1.1 基本概念-IO
I-Input;O-Output; IO流就是通过内存对硬盘上的文件进行读写,输入是指将硬盘上的文件写入内存中;输出指的是将内存中的数据“放入”硬盘中;在Java中所有的流均存在于:java.io.*;包下。
1.2 IO的分类
1.2.1 IO的分类
Java中的流分类有多种方式:
①按照流的方向分类:
输入流(Input);
输出流(Output)。
②按照操作数据方式不同进行分类:
字节流:一次读取1个字节byte(8个二进制位),是一种万能流,可以操作任何类型的文件;
字符流:一次读取1个字符,专门用来读取普通纯文本文档而存在的,无法读取图片、声音…
1.2.2 Java中的IO流都有哪些?
1)Java中IO流有四大抽象类,分别是:
①以Stream结尾的字节流:
java.io.InputStream;
java.io.OutputStream;
②以Reader或者Writer结尾的字符流:
java.io.Reader;
java.io.Writer;
2)需要了解的流:
①文件专属流
java.io.FileInputSteam
java.io.FileOutputSteam
java.io.FileReader
java.io.FileWriter
②转换流
java.io.InputStreamReader
java.io.OutputStreamReader
③缓冲流专属
java.io.BufferedReader
java.io.BufferWriter
java.io.BufferInputStream
java.io.BufferOutputStream
④数据流专属
java.io.DataInputStream
java.io.DataOutputStream
⑤标准输出流
java.io.PrintWriter
java.io.PrintStream
⑥对象专属流
java.io .ObjectInputStream
java.io.ObjectOutputStream
1.2.3 Java中IO流的特征
1)所有的流均实现了Closeable接口,均有close()方法,因此流都是可关闭的,用完流一定要关闭流,否则资源占用很严重。
2)凡是输出流均实现了Flushable接口,均是可刷新的,都有flush()方法,当使用了输出流之后一定要调用此方法刷新输出流,这个方法是会强制将流里的数据全部输出,清空管道;如果不使用这个方法,有可能导致数据丢失。
二、有关Java中的FileInputStream及FileOutputStream
以字节的形式操作文件,万能的流,可以操作任何格式的文件。
2.1 FileInputStream-文件字节输入流
2.1.1 构造方法:
//创建字节输入流对象
FileInputStream fis = null;
try {
fis = new FileInputStream("C:\\Users\\wanli\\Desktop\\en.txt");
int readCount = 0;
while ((readCount = fis.read()) != -1){
System.out.print(readCount + " ");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
2.1.2 其他方法
①int read()——从此输入流中读取一个字节,并返回该字节,若到达文件末尾无数据可读返回-1;
以此方法读取文件效率很低,一次只能读取一个字节,当读取大数据量的时候内存与硬盘交互频繁。(很少使用)
②int read(byte[] b)——一次读取b.length个字节,效率比上面的方法高。返回值为读取到的字节数量。这个读取的时候,若在最后一次读取字节数量a小于b.length,那么其实b中只有前a个元素被覆盖,a+1及后面的元素均不变。当无数据可读时,返回-1。
利用第二种方法读取的时候,可以用String类的构造方法将byte型的数组转换成字符串输出。示例:
fis = new FileInputStream("C:\\Users\\wanli\\Desktop\\en.txt");
//准备一个一定长度的byte数组
byte[] bytes = new byte[4];
//声明一个变量用来存储每一次读取的字节数量,并控制new String方法
int readCount = 0;
while ((readCount = fis.read(bytes)) != -1){
String s = new String(bytes, 0 ,readCount);
System.out.print(s);
}
③int available()——返回剩余的能够读取的字节数量;用法:可以在读取文件前,先获取其总字节数量,然后直接声明byte[]数组的长度为这个方法的返回值,就不需要用循环了。这种方式不太适合太大的文件,因为byte[]数组不能太大。
2.2 FileOutputStream-文件字节输出流
未完待续。。。