----------------- android培训、java培训、期待与您交流!-----------------
IO流 --
流本意液体流动之意,在开发中,也是个很形象的概念,是来处理数据传输的操作。java通过流来处理数据传输.当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文本,媒体文件,内存,获取网络连接;同样的在程序需要写入数据的时候,就会开启一个通向目的的流。我们可以想象一下,此时数据就好像在这通道中'流动'着。
IO流的分类--
1 根据数据类型分
a-- 字符流 Reader读取 , Writer写入
b-- 字节流 InputStream , OutputStream
2 根据数据流向分
a-- 输出流 OutputStream , Writer
b-- 输入流 InputStream , Reader
字符流操作字符文件,一般在在纯文本文件时所使用,它具备自己默认字符编码
下面我们就来看看具体列子,我们写了一个方法,使用了字符流写入文件的操作:
public class StreamDemo {
public static void main(String[] args) {
File f1 =new File("D:\\writerDemo.txt"); //创建一个File文件对象,为D盘下的writerDemo.txt文件
writerFile(f1);
}
/**
* 写入文件的步骤:
* 1 创建一个FileWriter的对象,该对象在实例化是需要指定操作的文件
* 2 对流对象进行写入操作
* 3 切记关闭流对象,释放资源
*/
public static void writerFile(File fileName){
FileWriter fw =null; //创建FileWriter对象指向null
try { //操作IO时,是一定要进行异常捕获或者抛出异常的
//初始化对象--在这一定要指定操作的文件
//文件根据指定的目录创建文件,若无指定目录则创建在默认目录(即java文件所在目录),若已有文件则覆盖
fw =new FileWriter(fileName);
//write()方法--将数据写入到文件
fw.write("字符流写入文件的操作的实例-这是我们写入到文件中的数据");
//flush()--刷新流对象缓冲区中的数据
//将数据刷新到文件中,要注意每次写入文件是都要刷新下
fw.flush();
fw.write("---写入文件2---");
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
//若FileWriter对象为空则不需关闭,否则一定要关闭,释放资源,否则报异常
if (fw!=null)
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}}
通过上面的实例我们很容学会了字符流写入文件的操作,接下来就来看看这字符流读取文件应该如何操作的。请看下面的实例
public class StreamDemo {
public static void main(String[] args) {
File f1 =new File("D:\\writerDemo.txt");
readFile(f1);
}
/**
* 读取文件步骤:
* 1 创建FileReader对象,指向指定的文件
* 2 进行流操作,读取指定文件
* 3 关闭流对象
*/
public static void readFile(File fileName){
FileReader fr =null; //创建FileReader对象指向null
try {
//初始化对象--在这一定要指定操作的文件
fr =new FileReader(fileName);
/**
* 文件读取方式一:
* read()--方法读取数据,返回读取的字符,当无读取数据时返回-1
* 每读取一个字符就打印一次,循环次数多
*/
// int num ;
// while ((num=fr.read())!=-1) {
// System.out.print((char)num);
// }
/**
* 文件读取方式二:
*每读取一次,一次读取char[]大小,就打印一次
*效率比第一个方法高,建议使用
*/
char [] ch =new char [1024]; //定义一个字符数组,用于存储读到的字符
int num2; //num2用于接收读到的字符个数
while ((num2=fr.read(ch))!=-1) {
System.out.println(new String(ch,0,num2));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
//若FileReader对象为空则不需关闭,否则一定要关闭,释放资源
if (fr!=null)
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
现在字符流的读写我们都已经基本学习完毕,接下来就来看到缓冲技术在流中的使用。
缓冲区是一个暂时存放数据的容器。我们可以看个形象的列子如我们将水从水壶中倒入杯子中,我们拿着杯子喝水,这被子就可以看成一个缓冲区。而我们在对流对象操作时,使用缓冲技术.就是在 读取/写入 数据时,先将数据存储到缓冲区中,存储完毕后,再取出来。这就避免了在操作流时,进行多次读取写入的处理,提高了效率。缓冲区的也正是为了提高流操作效率而出现的。缓冲区可以进行整行的读取。下面就看看如何在流操作中加入缓冲技术的。
package com.blog;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class StreamDemo {
public static void main(String[] args) {
File f1 =new File("D:\\writerDemo.txt");
buffWriteFile(f1);
buffReadFile(f1);
}
/**
* 使用缓冲技术加强写入文件的效率
* 步骤
* 1 创建缓冲区对象,将一个字符写入流做参数传入到缓冲区
* 2 操作缓冲区
* 3 关闭缓冲区
* @param fileName 要写入的内容文件名
*/
public static void buffWriteFile(File fileName){
BufferedWriter bfw =null; //创建一个缓冲区对象指向null
try {
//实例化对象,将new出来的字符写入流作为参数传入到缓冲区中
//new FileWriter(fileName,true)---true表示在这文件已有的内容上添加新内容
bfw =new BufferedWriter(new FileWriter(fileName,true));
bfw.write("bufferWriter缓冲区对象测试,写入到文件"); //写入到缓冲区
bfw.newLine(); //可跨平台的换行符
bfw.flush(); //只要用到缓冲区操作就是刷新
} catch (IOException e) {
e.printStackTrace();
}finally{
if(bfw!=null)
try {
bfw.close(); //关闭缓冲区就是在关闭对象
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 使用缓冲技术读取文件操作
* 读取文件的步骤与写入差不多,只是一个是读取流,一个是写入流
* BufferedReader字符读取流提供了readLine()方法一次读取一行,方便对文本进行获取
* 当返回null时,表示读到文件末尾
* @param fileName 读取的文件名
*/
public static void buffReadFile(File fileName){
BufferedReader bfr =null;
try {
bfr =new BufferedReader(new FileReader(fileName));
String strLine =null;
//整行读取
while ((strLine=bfr.readLine())!=null) {
System.out.print(strLine);
}
bfr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//通过上面2个方法我们知道了缓冲字符流的读写,下面来看看2个一起使用的列子
/**
* 将一个文件的内容复制到另一个文件中去
* 步骤
* 1 分别创建BufferedReader,BufferedWriter对象,指定文件
* 2 将文件的内容读取出来,写入到另一个文件中去
* 3 关闭缓冲区
* @param fileSrc
* @param fileCopy
*/
public static void buffCopyFile(File fileSrc,File fileCopy){
BufferedReader bfr=null;
BufferedWriter bfw =null;
try {
bfr =new BufferedReader(new FileReader(fileSrc));
bfw =new BufferedWriter(new FileWriter(fileCopy));
String strLine =null;
while ((strLine =bfr.readLine())!=null) {
bfw.write(strLine);
bfw.newLine(); //每写入一行数据进行回车换行
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(bfr!=null)
try {
bfr.close();
} catch (IOException e) {
e.printStackTrace();
}
if (bfw!=null)
try {
bfw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
通过上面的实例,应该已经知道字符流的使用了,字符流的简单应用就到这里了。