Io(Input Output):
字节流的抽象基类:
InputStream OutputStream
字符流的抽象基类:
Reader Writer
注:由这四个类派生出来的子类名称都是以其父类名作为
子类名的后缀的。
如:InputStream的子类FileInputStream
Reader 的子类FileReader
FileWriter 写入流
FileWriter fw = new FileWriter("Demo.txt");
fw.write("fannaocan"); 如果“”后代参数true 表示在末尾续写,没有此文件则新建文件
//fw.flush(); 区别flush刷心后,流可以继续使用,close刷心后,会将流关闭。
fw.close();
读写异常处理
关闭资源放在finally中要判断关闭对象是否为null
FileReader 读入流
第一种读取方式 一次读一个字符
//创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件时已经存在的。如果不存在,会发生异常。FileNotFoundException
FileReader fr = new FileReader("Demo.txt");
//调用读取流的方法,read方法一次读一个字符,而且会自动往下读。
int ch=0; read返回时int型的数,即返回的是字符的ascII表对应的数字
while ((ch=fr.read())!=-1)
{
sop((char)ch);
}
第二种读取方式
//创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件时已经存在的。如果不存在,会发生异常。FileNotFoundException
FileReader fr = new FileReader("Demo.txt"); 把Demo.txt中的数据读到控制台
//定义一个字符数组,用于存储独到的字符该read(char[]) 返回的是读到字符的个数
char[] buf = new char[1024];
int len=0;
while((len=fr.read(buf))!=-1) 把读到的字符暂时存到buf数组中
{
sop("num="+num+"...."+new String(buf,0,len));
}
利用读和写复制文件
复制的原理:
其实就是讲c盘下的文件数据存储到D盘的一个文件中
步骤:1 在d盘创建一个文件,用于存c盘文件中的数据
2 定义读取流和c盘文件关联 3 通过不断的读写完成数据存储 4 关闭资源
FileWriter fw = new FileWriter("RuntimeDemo18_2_copy_222.txt");
FileReader fr = new FileReader("RuntimeDemo18_2.java");
char[] buf = new char[1024];
int len=0;
//把要copy的数据存到流中,再通过fr。read读取流中的数据并存到buf数组中
while ((len = fr.read(buf))!=-1)
{//再通过fw。write把数组中的数据写到流中。然后再通过flush或者
fw.write(buf,0,len); //close刷新流 让流中的数据存入目的地
fr.close(); fw.close();
字符读取流缓冲区 BufferedReader
该缓冲区提供了一个一次读一行的方法readLine并返回一个字符串,方便于对文本数据的获取当返回null时表示读到文件末尾
FileReader fr = new FileReader("buf.txt");
BufferedReader bufr = new BufferedReader(fr);
String line = null;
while((line=bufr.readLine())!=null)
System.out.println(line);
利用缓冲区复制文件,效率高
BufferedReader bufr = new BufferedReader(new FileReader("a.java"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("a_copy.txt"));
String line =null;
while ((line=bufr.readLine())!=null)
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufr.close(); bufw.close();
字节流 读 InputStream 写 OutputStream
字节流的写入
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("abcd".getBytes()); // 字符串转换成字节类型
fos.close();
字节流的读3中方法
第一种方式一次读一个字符(需要把ASCII码转成char类型)
public static void readFile_1()throws IOException
{
FileInputStream fis = new FileInputStream("fos.txt");
int ch = 0;
while ((ch=fis.read())!=-1)
{
System.out.println((char)ch);
}
fis.close();
}
第二种方式,穿件一个byte的buf数组,把字符存到buf数组中
public static void readFile_2() throws IOException
{
FileInputStream fis = new FileInputStream("fos.txt");
byte[] buf = new byte[1024];
int len = 0;
while ((len=fis.read(buf))!=-1)
{
System.out.println(new String(buf,0,len));
}
fis.close();
}
第三种方式,available()方法返回字符的长度,慎用,容易内存溢出
public static void readFile_3() throws IOException
{
FileInputStream fis = new FileInputStream("fos.txt");
int num = fis.available();
byte[] buf = new byte[num];//定义一个刚刚好的缓冲区
fis.read(buf);
System.out.println(new String(buf));
fis.close();
}
利用缓冲技术复制图片
思路:
1 用字节读取流对象和图片关联
2 用字节写入流对象创建一个图片文件,用于存存储取到的图片数据
3 通过循环读写,完成数据的存储
4 关闭资源
FileOutputStream fos = new FileOutputStream("1.jpg");
FileInputStream fis =new FileInputStream("1111.jpg");
byte[] buf = new byte[1024];
int len = 0;
while ((len=fis.read(buf))!=-1)
{
fos.write(buf,0,len);
}
fis.close() fos close()
装饰设计模式
当想要对已有的对象进行功能增强时,可以定义类,
将已有对象传入,基于已有对象的功能,并提供加强功能
那么自定义的该类称为装饰类
装饰类通常会通过构造方法接受被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
装饰设计模式和继承的区别
MyReader 专门用于读取数据的类。 继承可以看出操作比较麻烦
|-- MyTextReader
|--MyBufferedTextReader
|-- MyMediaReader
|--MyBufferedMediaReader
|-- MyDateReader
|--MyBufferedDateReader
class MyBufferReader extends MyReader
{
private MyReader r;
MyBufferReader(MyReader r) 利用多态 提高扩展性。
{
this.r = r;
}
}
MyReader 装饰设计模式
|-- MyTextReader
|-- MyMediaReader
|-- MyDateReader
|-- MyBufferReader
装饰模式比继承要灵活,避免了继承体系臃肿。
而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能
所以装饰类和被装饰类通常都属于一个体系中的。
|