package com.itheima;
import java.io.FileWriter;
import java.io.IOException;
/*字符流和字节流
*字节流两个基流:
*InputStream OutStream
*字符流两个基类:
*Reader Writer
*然后IO流是用于操作数据的,那么数据最常见体现形式是文件。
*专门用于操作文件的方法FileWriter
**/
public class IoStreamDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件
//会被创建到指定目录下,如果同名将会被覆盖
//该步就是明确数据要存放的目的地
FileWriter fw = new FileWriter("demo.txt");
//调用Writer方法,将字符串写入流中
//属性流对象中的缓冲中的数据
//fw.flush();
fw.write("I Love You");
//关闭流资源,但是关闭之前会刷新一次北部的缓冲中的数据
//将数据刷到目的地中。
//和flush区别。flush刷新后,流可继续使用,close刷新后,会将流关闭。
fw.close();
}
}
----------------------------------------------------------------------------
IO异常处理方式:
clas FileWriterDemo2{
public static void main(String[] args){
FileWriter fw = null;//全局变量
try{
fw = new FileWriter("k:\\demo.txt");/对象没有创建成功,初始化失败
fw.write("abcdefg");
}
catch(IOException e){
System.out.println("catch:"+e.toString());
}
finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){
System.out.println("catch:"+e.toString());
}
}
}
}
-----------------------------------------------------------------------------------
//拷贝文本文件
/*
* 复制的原理:其实就是将C盘下的文件数据存储到D盘的一个文件中。
*
*/
/*步骤:
* 1、在D盘创建一个文件。用于存储在C盘文件中的数据。
* 2、定义读取流和C盘文件关联。
* 3、通过不断的读写完成数据储存
* 4、关闭资源。
*/
class CopyText{
public static void main(String[] args) throws IOException{
copy_1();
}
public static void copy_2(){
FileWriter fw = null;
FileReader fr = null;
try{
fw = new FileWriter("SystemDemo.copy.txt");
fr = new FileReader("System.java");
char[] buf = new char[1024];
int len = 0;
while(len=fr.read(buf)!=-1);{
fw.write(buf,0,len);
}
}catch(IOException e){
throw new RuntimeException("读写失败");
}
finally{
if(fr!=null){
try {
fr.close();
} catch (IOException e) {
}
if(fr!=null){
try {
fw.close();
} catch (IOException e) {
}
}
}
}
public static void copy_1()throws IOException{
//创建目的地
FileWriter fw = new FileWriter("RuntimeDemo_copy.txt");
//与已有文件关联
FileReader fr= new FileReader("RuntimeDemo.java");
int ch = 0;
while((ch=fr.read())!=-1){
fw.write(ch);
}
fw.close();
fr.close();
}
}
流是操作数据
---------------------------------------------------------------------
File类
用来将文件或文件夹封装成对象
方便对文件与文件夹的属性信息进行操作
File对象可以作为参数传递给流的构造函数
----------------------------------------
readline的原理
readLine方法的原理
无论是读一行,获取读取多个字符。其实最终都是在读取一个一个读取。所以最终使用的还是read方法一次读一个的方法。
------------------------------------------------
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接受被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
package com.itheima;
public class Person {
public void diner(){
System.out.println("吃饭");
}
}
package com.itheima;
public class SuperPerson {
private Person p;
SuperPerson(Person p){
this.p = p;
}
public void surperDiner(){
System.out.println("开胃菜");
p.diner();
System.out.println("sweet");
System.out.println("smoking");
}
}
package com.itheima;
public class PersonDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p = new Person();
SuperPerson sd = new SuperPerson(p);//装饰类通常会通过构造方法接受被装饰的对象。
sd.surperDiner();
}
}
------------------
class BufferedReaderDemo{
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("buf.txt");//创建一个读取流对象和文件相关联
BufferedReader bufr = new BufferedReader(fr);//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数
String line = null;
while(line = bufr.readLine()!=null){
System.out.println(line);
}
bufr.close();
}
}
----------------------------------------
流操作规律
通过两个明确来完成
1、明确源和目的
源:输入流 InputStream Reader
目的:输出流 OutputStream Writer
2、操作的数据是否是纯文本
是:字符流
不是:字节流
3、当体系明确之后,再明确要使用哪个具体的对象
通过设备来进行区分:
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
------------------------
eg:
1、将一个文本文件中数据存储到另一个文件中。复制文件
源:因为是源,所以使用读取流InputStream Reader
是不是操作文本文件。
是!这时候就可以选择Reader
这样体系明确了。
接下来明确要使用该体系中的哪个对象。
明确设备:硬盘上的文件
Reader体系中可以操作文件的对象是FileReader
是否需要提高效率。是!加入Reader体系中的缓冲区BufferedReader
FileReader fr = new FileReader("a.txt");
BufferedReader bufr = new BufferedReader(fr)
目的:OutputStream Writer
是否是纯文本。
是!Writer
设备:硬盘,一个文件
Writer体系中可以操作文件的对象是FileWriter
是否需要提高效率。是!加入Writer体系中的缓冲区BufferedWriter
FileWriter fw = new FileWriter("b.txt");
BufferedWirter bufw = new BufferedWriter(fw);