黑马程序员技术交流社区
标题:
IO 总结 part 1
[打印本页]
作者:
fmi110
时间:
2015-8-9 21:38
标题:
IO 总结 part 1
IO
字符流和字节流的区别:
1、字节流是读到一个字节就返回一个字节。
字符流调用字节流读取一个或多个字节,然后对照指定的编码表,返回对应的字符
2、字节流可以处理所有的数据
字符流只能处理字符数据
IO体系的基本功能读和写
字符: Reader Writer
字节: InputStream OutputStream
Reader 常用方法:
int read(); 返回读取的字符对应的整数,结尾时返回-1
int read(char[]); 返回读取字符的个数,结尾返-1
void close();可能会抛出异常,需要处理
Writer 常用方法:
write(ch); 写一个字符到流
write(char[],offset,length);
write(string);
flush();刷新流
close();关闭流,会自动调用flush(),刷新流
FileWriter :
该类没有自己特有的方法,只有自己的构造器
特点:
1、用于处理文本文件
2、该类有默认的编码表。 GBK
3、该类有临时缓冲
构造器:在写入流对象初始化时,必须关联一个数据存储的目的地(硬盘文件)
FileWriter(String fileName); 会将同名文件删除,然后新建一个
FileWriter(String fileName,boolean append)
当 append 为 true 时,会将数据流添加到文件末尾 而不是覆盖原文件
FileReader:
1、用于读取文本文件的流对象
2、用于关联文本文件
构造函数: FileReader(String fileName)
fileName必须是已存在的文件,否则抛出异常 FileNotFoundException
文本写入代码演示
class Demo
{
public static void main(String[] args)
{
FileWriter fw = null;
try
{
fw = new FileWriter("Demo.txt");
fw.write("This is a demo of writing chars...");
fw.flush();
}
catch (IOException e)
{
System.out.pringtln(e.toString());
}
finally
{
try
{
if(fw!=null)
fw.close();
}
catch (IOException e)
{
System.out.pringtln(e.toString());
}
}
}
}
class ReaderDemo
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("demo.txt");
int ch = 0 ;
whlie((ch=fr.read())!=-1)
{
System.out.println((char)ch);//返回的是一个字节的整形,需要强转成字符
}
fr.close();
}
}
字符流缓冲区:
缓冲区出现的目的是提高对流的操作效率
原理:用数组对流进行存储,减少对对磁盘的读取次数
对应的类:
BufferedWriter(FileWriter fw)
特有方法:
newLine(); 跨平台的换行符
BufferedReader(FileReader fr)
特有方法:
readLine();以行为单位进行读取,返回行标记之前的内容,不返回行标记
读到末尾时返回 null
注意:缓冲区是为了增强流的功能而存在,所以新建缓冲区对象,必须关联已经存在的流对象。
否则,将出现异常。
练习:通过缓冲区进行文本的拷贝
class BufferedDemo
{
public static void main(String[] a) throws IOException
{
BufferedReader bufr = new BufferedReader(new FileReader("demo.txt"))'
BufferedWriter bufw = new BufferedWriter(new FileWriter("copy.txt"));
//以行为单位读取
String line = null;
while((line=bufr.readLine())!=null)
{
bufw.write(line);
bufw.newLine();//换行
bufw.flush();//刷新
}
bufw.close();
bufr.close();
}
}
readLine() 方法的原理:缓冲区对象,调用与之关联的流对象的read的方法读取字符,
但不是马上进行具体的操作,而是先进行判断,只有读取换行符时
才进行操作,否则现将读到的字符进行临时存储。当读到换行符时,
将临时存储区的数据一次性返回。
class MyReadLine()
{
private Reader r;
MyreadLine(Reader r)
{
this.r = r;
}
public String readline() throws IOException
{
//建立临时存储区
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=r.read())!=-1)
{
if(ch=="\r")
continue;
if(ch=="\n")
return sb.toString();
else
sb.append((char)ch);//返回的是int型,需要强转
}
if(sb.length()!=0)//不是换行符结尾,需要判断是否有字符
return sb.toString();
else
return null;
}
public void close() throws IOException
{
r.close();
}
}
装饰设计模式:基于对象的功能,并将其功能增强。
与继承的区别:
1、比继承有更好的灵活性
2、通常装饰类和被装饰类都具有相同的父类或者实现了相同的接口
练习:编写 LineNumberReader 中的 getLineNumber() 和 setLineNumber() 方法
class MyLineNumberReader extends MyReaderLine
{
private Reader() r;
private int lineNumber = 0;
MyLineNumberReader(Reader r)
{
super(r);//调用父类的构造器初始化
}
public void setLineNumber(int num)
{
this.lineNumber = num;
}
public String readLine() throws IOException
{
lineNumber++;
return super.readLine();//直接调用父类的方法
}
public int getLineNumber()
{
return lineNumber;
}
}
复制代码
作者:
fmi110
时间:
2015-8-9 21:39
自己顶贴 加油
作者:
谭威威威威
时间:
2015-8-9 21:58
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2