----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
一、java中为什么要有IO流,它是用来做什么的?
IO流:主要用来操作设备上的数据。比如用java程序复制文件、用程序将数据录入到文件中都用到了IO流。
二、IO流具体的分类
1.按操作数据来分:
<1>字符流:
字符流的由来:
因为文件的编码不同,从而有了对字符进行高效操作的字符流对象。
原理:其实就是基于字节流读取字节时,去查了指定的编码表:也就是:字符流 = 字节流 +编码表
<2>字节流:
字节流在读取的时候,读到一个字节返回一个字节。它可以操作任何类型的数据。比如“mp3文件、音频文件、视频文件、文本文件。”
2.按流向分:
<1>输入流:
<2>输出流:
3.字符流与字节流的区别:
<1>字节流只能读取一个字节,而字符流可以读取一个字符或多个字符。
<2>字节流可以操作任何文件,字符流只能操作文本文件。
三、IO的体系:
IO所具备最基本的功能就是"读和写"。
1.字符流
Reader<读> Writer<写>
2.字节流
InputStream<读> OutPutStream<写>
注意:在操作IO流数据的时候,分清2个明确就可以。
A: 明确操作数据源和目的地体系
1、明确数据源
从数据源是读取数据
InPutStream
Reader
2、明确目的地
把数据写入目的地
OutPutStream
Writer
B: 明确具体的数据源和目的地是否是文本文件
1、明确数据源
是文件: 用Reader
不是文件: InputStream
2、明确目的地
写入的目的地是否是文件,如果是: 用Wrtier
如果不是文件: 用OutPutStream
四:IO流的使用步骤:
1.先明确数据源和目的地
2.封装数据源和目的地
3.调用流对象的方法
4.释放资源。
五:在操作IO流遇到的一些问题:
1.什么时候需要用到转换流?
在操作字节流数据的时候,为了使用高效字符流的一些方法需要把字节流进行转换,这个时候java就提供了转换流。
(InputStreamReader:字节流转换成字符流
OutPutStreamWriter:字符流转换成字节流)
2.在创建字符输出流对象做了几件事?
三件事:1.创建文件对象 2.创建输出流对 3.输出流指向文件对象。
3.为什么一定要释放资源?
1.让对象变成垃圾 2.通知操作系统释放被占用的资源。
4.flush方法和close方法的区别?
flush方法:刷新缓冲区后,还可以继续使用流对象
close方法:是在关闭流之前先进行的刷新动作,关闭流后,对象不能使用,变成垃圾了。
六:IO流的一些实例:
字符流实例1:
/*
* 把d盘目录下的a.txt复制到e盘下的b.txt中,并加入异常处理。
*/
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyTest {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
// 字符输入流封装数据源
fr = new FileReader("d:\\a.txt");
// 字符输出流封装目的地
fw = new FileWriter("e:\\b.txt");
// 基本读写
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
// fw.flush();
}
} catch (IOException ie) {
ie.printStackTrace();
} finally {
// 释放资源
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字节流实例2:
/**
*测试字节流的复制mp3所用的时间:
*
*/
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyMP3 {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
method();
long end = System.currentTimeMillis();
System.out.println("共耗时:" + (end - start) + "毫秒");
}
// 高效的一次读写一个字节
private static void method() throws IOException {
//创建字节输入流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
"zxmzf.mp3"));
//创建字节输出流对象
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("method4.mp3"));
//定义缓冲区
byte[] bys = new byte[1024];
int len = 0;
//调用输入流方法
while((len=bis.read(bys))!=-1){
bos.write(bys,0,len);
}
//释放资源
bos.close();
bis.close();
}
}
转换流实例3:
/**
*把键盘录入的数据,转成大写通过标准流显示在控制台。
*
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class SystemOutDemo2 {
public static void main(String[] args) throws IOException {
// 封装数据源和目的地
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//基本读写操作
String line= null;
while((line=br.readLine())!=null){
//数据源是键盘录入的时候,一定要自定义结束标记
if("886".equals(line)){ //==
break;
}
bw.write(line.toUpperCase());
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
br.close();
}
}
上述总结:
实例1:当数据源和目的地的操作的数据是文本文件的时候,用字符流是最高效。
实例2:高效字节流,之所以高效是因为每次读取字节的时候,都将数据存在了缓冲区。在写入的时候从缓冲区写入,提高了效率
实例3:当从键盘录入和控制台结束的时候,需要定义标记。因为控制台录入的都是字节和字符,所以需要用到了转换流,转换成字符流,并使用它的高效方法。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------