Io流
1、Java流类图结构:
2、IO流的概念
在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。通过流的形式允许java程序使用相同的方式来访问不同的输入/输出源。
3、IO流的分类
IO流的输入、输出是相对于我们的程序而言
输入流:从其他地方(本地文件,网络上的资源等)获取资源输入到我们的程序中
输出流:从我们的程序中输出到其他地方(本地文件),将一个字符串保存到本地文件中,就需要使用输出流。
1字符 = 2字节 、 1字节(byte) = 8位(bit) 、 一个汉字占两个字节长度
字节流:每次读取(写出)一个字节(8位二进制),可以传输所有种类的资源,例如:文本,图片,视频等。
字符流:每次读取(写出)两个字节(16位二进制),纯文本建议首选字符流传输,该流只适用字符传输,传输其他资源会造成部分丢失。
节点流:以从或向一个特定的地方(节点)读写数据。如FileInputStream
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
4、流的用途分类
抽象基类无法直接创建实例。
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象基类 | 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 | FilterWriter |
打印流 | PrintStream | PrintWriter | ||
推回输入流 | PushbackInputStream | PushbackReader | ||
数据流 | DataInputStream | DataOutputStream |
5、代码实例
1.使用字节流(不带处理流)实现文本文件的复制,将a.txt复制到b.txt。
public static void main(String[] args) {
InputStream in=null;
OutputStream os = null;
try {
//定位目标文件位置,并创建字节输出流
os = new FileOutputStream("D:\\music\\b.txt");
//定位源文件位置,并创建字节输入流
in = new FileInputStream("D:\\music\\a.txt");
//读取源文件内容,创建中转站,提高读取速度
byte[] bytes = new byte[4];
int len;
while ((len=in.read(bytes))!=-1){
//写入目标文件
os.write(bytes,0,len);
}
System.out.println("复制完成");
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (in!=null) {
in.close();
}
if (os!=null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.使用字节流(带处理流),实现写入写出数据,纯文本不建议使用DataInputStream和DataOutputStream,可能会出现编码问题。建议使用字符流。
public static void main(String[] args) throws Exception {
//创建数据输出流,节点流
FileOutputStream fos = new FileOutputStream("D:\\music\\bw.txt");
//使用处理流套接增强功能
BufferedOutputStream bos = new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);
//创建数据输入流,节点流
FileInputStream fis = new FileInputStream("D:\\music\\bw.txt");
//处理流套接,增强功能
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
dos.writeUTF("哈哈哈哈");
//数据刷出
dos.flush();
//读取数据
String s = dis.readUTF();
System.out.println(s);
//关流
dos.close();
dis.close();
}
3.使用字符流(带处理流),复制文本文件,将a.txt复制到bw.txt
public static void main(String[] args) throws Exception{
//字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("D:\\music\\a.txt"));
//字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\music\\bw.txt"));
String line =null;
//一行一行读
while ((line = br.readLine())!= null){
System.out.println(line);
//将字符串写出去
bw.write(line);
//换行
bw.newLine();
}
//数据刷出
bw.flush();
//关流时 关闭 顶层流即可 不需要将 字节流也关掉
br.close();
bw.close();
}