---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
readLine的方法原理:无论是读一行,或者是读取多个字符,其实最终都是在硬盘上一个一个读取。所以最终使用的还是read方法一次读一个的方法。
IO 流:
IO流用来处理设备之间的数据传输。
Java对数据的操作时通过流的方式。
java用于操作流的对象都在IO包中。
流按操作数据类型分为两种:字符流,字节流。
流按流向分为:输入流,输出流。
IO体系:
InputStream OutputStream
Read Write
流缓冲区:
BufferInputStream BufferOutputStream
BufferRead BufferWrite
使用FileWrite创建一个文件,以及异常的处理。
class FileWriterDemo
{
public static void main(String[] args)
{
FileWriter fw=null;
try
{
fw=new FileWriter("a.txt");
fw.write("a");
fw.fulsh();
}
catch (IOException e)
{
System.out.println(e.toString);
}
finally
{
if(fw!=null)
{
try
{
fw.close();
}
catch (IOException e)
{
System.out.println(e.toString);
}
}
}
}
}
文本文件的续写:使用FileWriter的一个构造方法创建对象:FileWrite(String name,boolean append);append为true时续写。
文本文件的读取方式:
方式一:一次读取一个,read()的返回值为int,当读到文件末尾时,返回-1;
class FileReaderDemo
{
public static void main(String[] args) throws Exception
{
FileReader fr=new FileReader("a.txt");
while (true)
{
int ch=fr.read();
if (ch==-1)
break;
System.out.println((char)ch);
}
fr.close();
}
}
方式二:read(char[] cbuf,cbuf),将读取的数据存入一个char数组,返回读取的长度。
class FileReaderDemo
{
public static void main(String[] args) throws Exception
{
FileReader fr=new FileReader("a.txt");
char[] cbuf=new char[1024];
int len=0;
while ((len=fr.read(ch))!=-1)
{
System.out.println(new String(ch,0,len);
}
fr.close();
}
}
拷贝文本文件:
流程:1.FileReader读取文件,存入char[] 。
2.FileWriter写入新文件,把char[]中的数据写入文件,读一次,取一次
class FileReaderDemo
{
public static void main(String[] args) throws Exception
{
FileReader fr=new FileReader("a.txt");
FileWriter fw=new FileWriter("a_copy.txt");
char[] cbuf=new char[1024];
int len=0;
while ((len=fr.read(ch))!=-1)
{
fw.write(cbuf,0,len);
}
fr.close();
fw.close();
}
}
缓冲字写符流BufferedWriter:
为了提高字符写入流效率,加入了缓冲技术。操作方法是把被流对象作为参数传递给缓冲区的构造函数。
例: BufferedWriter buf=new BufferedWriter(new FileWrite("buf.txt"));
BufferWriter的特有方法:newline(),开始新的一行。
缓冲字读符流BufferedReader:
从字符输入流读取文本,缓冲各个字符,从而实现字符,数组,和行的高效读取。
特有方法:readLine(),读取一行,返回读取的字符串,不包含任何终止符,读到文件末尾处返回null。
通过缓冲区复制文本文件:
class FileCopyDemo
{
public static void main(String[] args) throws Exception
{
BufferedReader buffr=new BufferedReader(new FileReader("a.txt"));
BufferedWriter buffw=new BufferedWriter(new FileWriter("a_copy.txt"));
String line=null;
int len=0;
while ((line=bufr.readLine(ch))!=null)
{
bufw.write(line);
}
fr.close();
fw.close();
}
}
根据这个原理自定义一个缓冲区:
class MyBufferedReader
{
private FileReader fr=null;
public MyBufferedReader(FileReader fr)//把流文件传进来
{
this.fr=fr;
}
public String myReadLine() throws IOException //抛出异常,让调用者处理
{
//使用StringBuilder缓存读取的数据,当读到\r\n时,返回StringBuilder.
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch = fr.read())!=-1)
{
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
sb.append((char)ch);
}
return null;
}
public void myClose()//调用流的方法创建自己的关闭流方法
{
fr.close();
}
}
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有的对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接受被装饰的对象,并基于已有的功能,并提供加强功能。
装饰 和继承的区别:
装饰模式比继承要灵活,避免了继承体系臃肿,而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。
所以装饰类和被装饰类通常都属于同一个体系中。
自定义一个装饰类
class MyBufferedReader extends Reader //继承Reader
{
private Reader fr=null;
public MyBufferedReader(Reader fr)
{
this.fr=fr;
}
public String myReadLine() throws IOException
{
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch = fr.read())!=-1)
{
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
sb.append((char)ch);
}
return null;
}
//覆盖父类中的抽象方法
public int read(char[] cbuf, int off, int len) throws IOException
{
return fr.read(cbuf, off, len) ;//使用传入对象来实现该方法
}
//覆盖父类中的抽象方法
public void close() throws IOException
{
fr.close();
}
}
LineNumberReader是一个装饰类,继承自BufferedReader
有两个独有的方法。
serLineNumber(int i) 设置当前行号。
getLineNumber() 获取当前行号。
自定义一个LineNumberReader
class MyLineNumberReader extends BufferedReader
{
private int lineNum;
public MyLineNumberReader(Reader fr)
{
super(r);
}
public String myReadLine() throws IOException
{
lineNum++;
return super.readLine();
}
public void setLineNumber(int lineNumber)
{
this.lineNum=lineNum;
}
public int getLineNumber()
{
return lineNum;
}
}
字节流:
想要操作图片等数据,就要用到字节流。基本操作与字符流差不多。
字节流缓冲区没有readLine();
------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net