android培训、 java培训、期待与您交流!
(黑马程序员)
IO
四个基类:InputStream、 OutputStream两个字节流和Reader、Writer两个字符流。
字符流的由来:字符的编码问题而诞生。字符流内部可以指定其使用的编码表。
FileWriter:
Code:
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象。该对象一旦被初始化就必须明确其操作的文件,该文件会被创建到指定目录下,如果该目录已有同名文件,原文件将会被覆盖。
FileWriter fw = new FileWriter("Demo.txt");
//调用write方法,将字符串写入流中,实际就是写入内存的流对象中。
fw.write("ABCDETY");
//内存中的流对象就是一个缓冲池,需要将其通过flush刷新到数据的目的地。
fw.flush();
//由于jvm在写数据时其实调用的是windows或者Linux的写文件方法,故会占用其系统资源,我们使用完后务必将其关闭,节省资源。close方法在关闭前会先调用flush方法。
fw.close();
}
}
IOException处理方式
Code:
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
FileWriter fw = null;//从try块中拿出来是为了避免fw引用在finally块中无法引用
try{
fw = new FileWriter("K://Demo.txt");(1)//如果系统中就没有K盘自然会出错,首先创建Demo.txt就会出文件无法找到的错,而fw自然就没有指向对象,则出现指针异常。
fw.write("ABCDETY");
fw.flush();
}
catch(IOException e)
{
System.out.println(建立输入流出错);
}
finally
{
try{ //关闭资源也可能出错
if(fw != null) //(1)如果出现类似错误,务必判断指针
{
fw.colse();
}
}catch(IOException){System.out.print("关闭出错了"!);}
}
}
}
文件的续写:
使用FileWriter的带参数构造函数通过指定参数中boolean是ture还是false确定是将续写还是写在文件前面。其中boolean为ture表示将续写。具体构造函数如下:
public FileWriter(File file,boolean append)throws IOException
文件的读取方式
第一种,单字符形式读取:
Code:
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
//创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件已经存在,如果不存在就会发生FileNotFoundException
FileReader fr = new FileReader("demo.txt");
//调用读取流对象的read方法:read()一次读一个字符,而且会自动向下读。读到文件末尾将返回-1
int ch =0;
while((ch=fr.read())!=-1)
{
System.out.print((char)ch);
}
}
第二种,字符数组形式读取
Code:
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
FileReader fr = null;
fr = new FileReader(FileWriterDemo.txt);
char[] buf = new char[1024]; //定义一个字符数组作缓冲,存储读到的字符
int num = 0;
while((num=fr.read(buf))!=-1)//read(char[])返回的int是读到的字符数,而第一 种方式中返回的就是读到的字符
{
System.out.println(new String(buf,0,num));
}
fr.close();
}
}
字符流的缓冲区
缓冲区的出现提高了对数据读写的效率。它必须结合流才能使用。是对流功能的加强。缓冲区的底层原理就是封装了数组对象。
写入缓冲区:
Code:
import java.io.*;
class BufferedWriteDemo
{
public static void main (String[] args) throws IOException
{
FileWriter fw = new FileWriter("buf.txt");//创建一个写入流并与目标文件相关联
BufferedWriter bufw = new BufferedWriter(fw);//给写入流加上缓冲器
for(int x = 1;x<5;x++)
{
bufw.write("abc"+x);
bufw.newLine();//通用换行方式
bufw.flush();//有缓冲器必须想到刷新
}
bufw.close();
}
}
读取缓冲区:
Code:
import java.io.*;
class BufferedWriteDemo
{
public static void main (String[] args) throws IOException
{
FileReader fr = new FileReader("buf.txt");
BufferReader bufr = new bufferedReader(fr);
String line = null;//中转站
while((line = bufr.readLine())!=null)//line = bufr.readLine()读的操作返回一个String,当其读到文件尾返回null
{
System.out.println(line);
}
bufr.close();//close的就是fr
}
}
Readline方法原理:无论读取一行,获取多个字符。其实最终都是在硬盘上一个一个读取。所以最终使用的还是read方法一次读一个的方法。当它读取到\n换行符号时就自然而然的将前面读取到的字符形成字符串对外提供。
装饰设计模式
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,提供加强功能。则自定义的该类成为装饰类。
装饰类通常会通过构造方法接收被装饰的对象,并基于装饰的对象的功能提供更强的功能。
---------------------- android培训、 java培训、期待与您交流! ---------------------- 详细请查看: http://edu.csdn.net/heima