-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
概述:
一. IO(Input Output)流
1. IO流用来处理设备之间的数据传输
2. java对数据的操作是通过流的方式
3. java用于操作流的对象都在IO包中
4. 流按操作数据分为两种:字节流与字符流.
5. 流按流向分为:输入流,输出流.
二. IO流常用基类
1. 字节流的抽象基类:inputStream,OutputStream
2. 字符流的抽象基类:Reader,Writer
3. 注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀.
a) 如:InputStream的子类FileInputStream
b) 如:Reader的子类FileReader.
体系:
一. 字符流的特点
a) 既然IO是用于操作数据的,那么数据的最常见体现形势是:文件.以下就以操作文件为主来学习.流程如下 :
i. 创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件.该文件会被创建到指定目录下,如该目录下已有同名文件,将被覆盖.该步就是在明确数据要存放的目的地.
ii. 调用write方法,将字符串写入到流中.
iii. 刷新流对象中的缓冲中的数据,将数据刷到目的地中.
iv. 调用close()方法,关闭流资源。但是关闭前会刷新一次内部的缓冲数据,并将数据刷新到目的地中。
b) close()和flush()区别
i. flush()刷新后,流可以继续使用;而close()刷新后,将会关闭流,不可再写入字符流。
c) 注意
i. java自身不能写入数据,而是调用系统内部方式完成数据的书写,使用系统资源后,一定要关闭资源。
二. IO异常的处理方式
a) 由于在创建对象时,需要指定创建文件位置,如果指定的位置不存在,就会发生IOException异常,所以在整个步骤中,需要对IO异常进行try处理。
三. 文件的续写
a) 创建数据存放的目的地.FileWriter fw = new FileWriter(“demo.txt”,true);
b) 传递一个true参数,代表不覆盖已有的文件,并在已有文件的未尾进行数据的续写
c) 换行续写,可使用”\r\n”
四. 文本文件的读取
a) 创建一个文件读取流对象,和指定名称的文件相关联.要保证该文件是存在的,如不存在会发生异常,FileNotFoundException
b) 调用读取流对象read方法.作为整数读取的字符,范围在0-65535之间,如果已达到流的未尾,则返回-1
c) 读取后要调用close方法将流资源关闭.示例代码如下:
importjava.io.*;
class FileReaderDemo
{
public static void main(String[] args)
{
//第一种读取方式
singleCharReader();
//第二种读取方式
arrayCharReader();
}
//第一种读取方式,单个字符读取
public static void singleCharReader()
{
FileReader fr=null;
try
{
fr=newFileReader("demo.txt");//读取文件位置和文件名
for (intch=0;(ch=fr.read())!=-1 ; )
{
System.out.print((char)ch);
}
}
catch (IOException e)
{
throw newRuntimeException("读取失败");
}
finally
{
try
{
if(fr!=null)
fr.close();//关闭读取流资源
}
catch (IOExceptione)
{
}
}
}
//第二种读取方式,通过字符数组进行读取
public static void arrayCharReader()
{
FileReader fr=null;
char[] arr=new char[1024];//定义一个字符数组,用于临时存储读取的字符
try
{
//读取一个.java文件,并打印在控制台上。
fr=newFileReader("FileReaderDemo.java");
for (intlen=0;(len=fr.read(arr))!=-1 ; )
{
//显示字符数组的字符个数
System.out.print(newString(arr,0,len));
}
}
catch (IOException e)
{
throw newRuntimeException("读取失败");
}
finally
{
if(fr!=null)
try
{
fr.close();
}
catch(IOException e)
{
}
}
}
}
五. 文本文件读取练习
a) 读取一个.JAVA文件,并打印在控制台上.
import java.io.*;
publicclass Learnio {
publicstaticvoid main(String[]args)throws IOException {
FileReader fr = new FileReader("Date.java");
char[]buf =newchar[1024];
intnum = 0;
while ((num =fr.read(buf)) != -1) {
System.out.print(new String(buf, 0, num));
}
fr.close();
}
}
六. 字符流的缓冲区
a) 缓冲区的出现提高了对数据的读写效率
b) 对应类:BufferedWriter,BufferedReader
c) 缓冲区要结合流才可以使用.
d) 在流的基础上对流的功能进行了增强
e) 缓冲区的出现是为了提高流的操作效率而出现的所以在创建缓冲区之前,必须先有流对象.
f) 写入流缓冲区BufferedWriter的步骤:
i. 创建一个字符写入流对象。
ii. 为了提高字符写入流效率。加入缓冲技术。只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
iii. 调用write方法写入数据到指定文件
iv. 其实关闭缓冲区,就是在关闭缓冲区中的流对象。
g) 读取流缓冲区BufferedReader
i. 该缓冲区提供了一个一次读一行的方法readLine,方便于堆文本数据的获取,当返回null时表示读到文件末尾。readLine方法返回的时候,只返回回车符之前的数据内容。并不返回回车符。
ii. readLine方法原理:无论是读一行。或者读取多个字符。其实最终都是在在硬盘上一个一个读取。所以最终使用的还是read方法一次读一个的方法。
iii. 读取流缓冲区BufferedReader的步骤
1. 创建一个读取流对象和文件相关联
2. 为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲区对象的构造函数。
3. 调用该缓冲区提供的readLine方法一行一行读取,如果到达文件末尾,则返回null
4. 关闭流资源
示例:通过缓冲区复制一个文本文件。
</pre><p align="left"></p><p align="left"> </p><p align="left">h) 自定义BufferedReader</p><p align="left"> i. 原理:可根据BufferedReader类中特有一行一行读取方法readLine()的原理,自定义一个类中包含相同功能的方法</p><p align="left"> ii. 初始化自定义的类,加入流对象</p><p align="left"> iii. 定义一个临时容器,原BufferedReader封装的是字符数组,此类中可定义一个StringBuilder的容器,最终可实现字符串的提取.</p><p align="left">/*</p><p align="left">需求:根据readLine方法原理,模拟BufferedReader写一个自己的MyBufferedReader</p><p align="left">*</p><pre name="code" class="java">/
importjava.io.*;
//自定义缓冲类
classMyBufferedReader extends Reader
{
private Reader r;//定义接收的流对象
MyBufferedReader(Reader r)
{
this.r=r;
}
//自定义整行读取
public String myReadLine()throwsIOException
{
//创建一个容器,用来存储一行的字符
StringBuilder sb =newStringBuilder();
//一个字符一个字符读取
for (intch=0;(ch=r.read())!=-1 ; )
{
if(ch=='\r')//如果遇到换行符,则继续
continue;
if(ch=='\n')//如果遇到回车符,表示该行读取完毕
return sb.toString();
else
sb.append((char)ch);//将该行的字符添加到容器
}
if(sb.length()!=0)//如果读取结束,容器中还有字符,则返回元素
returnsb.toString();
return null;
}
//复写父类中的抽象方法
public int read(char[] cbuf, int off,int len) throws IOException
{
return r.read(cbuf,off,len);
}
//复写父类的close方法
public void close()throws IOException
{
r.close();
}
}
//测试MyBufferedReader
class MyBufferedReaderDemo
{
public static void main(String[] args)
{
MyBufferedReader mbr=null;
try
{
mbr=newMyBufferedReader(new FileReader("BufferedCopyDemo.java"));
for (Stringline=null;(line=mbr.myReadLine())!=null ; )
{
System.out.println(line);//显示效果
}
}
catch (IOException e)
{
throw newRuntimeException("读取数据失败");
}
finally
{
try
{
if(mbr!=null)
mbr.close();
}
catch (IOExceptione)
{
throw newRuntimeException("读取流关闭失败");
}
}
}
}