javaIO流介绍
一,javaIO流的作用
用于处理设备上的数据,如读取数据和写入数据
二,流的分类方式
1.1、按流向分类:
输入流: 读取数据的流,只能进行读操作。
输出流: 写入数据的流,只能进行写操作。
1.2、按数据传输单位分类:
字节流:以字节(8位二进制)为单位进行处理。以处理所有类型数据,主要用于读写诸如图像或声音的二进制数据。
字符流:以字符(16位二进制)为单位进行处理。只能用来处理文字等字符。
结论:只要是处理纯文本数据,就要优先考虑使用字符流。除此之外都用字节流。
1.3、按功能分类:
节点流:从特定的地方读写的流类,如磁盘或者一块内存区域。
过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或者输出流连接创建的。
三、IO流的四大抽象类:
不管流的分类是多么的丰富和复杂,其根源来自于四个基本的类。这四大抽象类是所有IO流的父类,一般子类名后缀绝大部分是父类名称,而前缀都是体现子类功能的名字,这样方便记忆和查找子类。
这个四个类的关系如下:
| 字节流 | 字符流 |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
IO流的四大抽象类及其子类。请看以下表格:
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
访问字符串 |
|
| StringReader | StringWriter |
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 |
|
| InputStreamReader | OutputStreamWriter |
对象流 | ObjectInputStream | ObjectOutputStream |
|
|
抽象基类 | FilterInputStream | FilterOutputStream | FilterReader | FileWriter |
打印流 |
| PrintStream |
|
|
推回输入流 | PushbackInputStream |
| PushbackReader |
|
特殊流 | DataInputStream | DataOutputStream |
| |
四、读写字符文件的主要是用到FileReader和FileWriter,他们分 别是继承了,Reader和Writer,下面就写一个读取文件以及写入 数据到一个文件的例子。
import java.io.*;
public class FileOperate{
public static void main(String[] args){
try{
//读取read文件中的数据到FileReader流
FileReader fr = new FileReader("F:read.txt");
//把文件写入到FileWriter流
FileWriter fw = new FileWriter("F:writer.txt");
//创建存储字节数据的数组
char[] c = new char[1024];
int i = 0;
while((i=fr.read(c))!=-1){
fw.write(c,0,i);
}
//将写入缓冲区的流刷出到文件中,当然关闭流时也会先刷出
fw.flush();
fw.close();
fr.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
五、使用缓冲流加快数据的传输,可以提高读写效率。以上面的例子 说,字符 流缓冲流是BufferedReader和BufferedWriter
import java.io.*;
public class FileOperate{
public static void main(String[] args){
try{
//读取read文件中的数据到FileReader流
FileReader fr = new FileReader("F:read.txt");
//创建读取缓冲流BufferedReader
BufferedReader br = new BufferedReader(fr);
//把文件写入到FileWriter流
FileWriter fw = new FileWriter("F:writer.txt");
//创建写入缓冲流
BufferedWriter bw = new BufferedWriter(fw);
String line = null;
//在下面我们使用字符流缓冲流一次读取一行的方法readLine();
while((line=br.readLine())!=null){
bw.write(line);
//BufferedWriter 的换行方法newLine();
bw.newLine();
}
//将写入缓冲区的流刷出到文件中,当然关闭流时也会先刷出
fw.flush();
br.close();
bw.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
六、读写图片文件的主要是用到FileInputStream和FileOutputStream,他们分 别是继承了,InputStream和OutputStream,下面利用字节流复制图片的例子。
import java.io.*;
public class copy{
public static void main(String[] args){
try{
FileInputStream fi = new FileInputStream("F://图片.jpg");
FileOutputStream fo = new FileOutputStream("F://copy.jpg");
byte[] b = new byte[1024];
int i = 0;
while((i = fi.read(b))!=-1){
fo.write(b,0,i);
}
fi.close();
fo.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
七、字节流缓冲流和字符流缓冲流使用方法差不多此处不再叙述。
八、字节流和字符流的相互转换
1、InputSreamReader用于将一个字节流中的字节解码成字符,OutputStream用于将写入的字符编码成字节后写入一个字节流
例:
Import java.io.*;
public class Convert{
public static void main(String[] args){
BufferedReader buf = null;
String str = null;
While(true){
System.out.println(“请输入:”);
try{
buf = new BufferedReader(new InputStreamRead(System.in));
str = buf.readLine();
System.out.println(str);
}catch(IOException e){
e.printStacktrace();
}
}
}
}