IO

IO
 File: 代表文件或者目录(文件夹)
  delete()方法:  如果删除的是普通的文本文件 可以直接删除
        如果删除的是目录 , 
         1.如果目录中没有其他的文件或者目录  可以直接删除
         2.如果目录中有其他的文件 或者目录 ,先把当前目录中的文件删除 才能删除当前的目录
  mkdir()  创建文件或者目录  不能创建父目录
  mkdirs()   创建文件或者目录   如果父目录不存在,把父目录一起创建
 
     isDirectory()   判断文件是否是一个目录
  isFile()   判断是否是一个标准的文件
  
  length()  返回的是文件的长度 大小
  
  list()   获得子文件或者目录的名字
  listFiles() :File[]   获得子文件或者目录的对象  存储到数组中
  
 
 输入流     输出流
 字节流(byte)   字符流(char)

  字节流:  如果读入的网络上的资源 就用字节流  比如:图片 音频  文本
  字符流:  当确定是偶数个字节 才用字符流
 
  输入流:
   字节输入流:xxxxInputStream
   
   字符输入流:xxxxReader
   
  输出流:
   字节输入流:xxxxOutputStream
   
   字符输入流:xxxxWrite
   
 转换流:
  InputStreamReader  和  OutputStreamWriter
   
   InputStreamReader:  字节输入流 转换为字符输入流
   OutputStreamWriter: 字节输出流 转换为字符输出流

  
 缓存流
  BufferedReader  BufferedWriter
  
  数据先存储到缓冲区(8192字符大小),等缓冲区满了再一次性输出。
  
 装饰者模式
  比如二次开发的时候,发现原来的工具类功能不够强大,但是又不想改变原来的代码,就可以用
  装饰者模式来增强原来的功能。
  
  特点:
      1) 装饰对象和真实对象有相同的接口。
   这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
  (2) 装饰对象包含一个真实对象的引用(reference)
  (3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
  (4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。
   这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。
   
  装饰者模式简单示例:

public interface Car {
    //车启动时 功能
    public void run(); 
}
public class BMW1 implements Car{//这是宝马一代

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("最高时速200km/h");//只有这一个功能
    }
}
public class BMW2 implements Car{//这是宝马2代
    
    private BMW1 bm1;
    
    public BMW2(BMW1 bm1){
        this.bm1=bm1;
    }

    @Override
    public void run() {//增强了故障检测和故障排除功能
        // TODO Auto-generated method stub
        System.out.println("故障检测");
        bm1.run();
        System.out.println("故障排除");
        
    }

}
public class Go {
    
    public static void main(String[] args) {
        //真实的对象
        BMW1 bm1=new BMW1();
        
        //装饰对象
        BMW2 bm2=new BMW2(bm1);
        
        bm2.run();
    }

}

对象流
  ObjectOutputStream  和  ObjectInputStream
   
  注意存储的对象要实现Serializable

实现Serializable  作用:
 
     标记Person  是可序列化的 
       对象 可以存储到文件中  也可以通过网络进行传输
   空接口:  名称:  标记型的接口 
            Serializable  标记型接口之一
         代表: 对象可持久化的(对象保存到文件中了)
   
  示例 :

public class Person implements Serializable{
    
    private String name;
    private int age;
    private String adgress;
    
    public Person(String name,int age,String adgress){
        this.name=name;
        this.age=age;
        this.adgress=adgress;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", adgress=" + adgress
                + "]";
    }

}
public class Test4 {
    
    public void f1() throws Exception{
        Person p1=new Person("张三",20,"上海");
        
        ObjectOutputStream objOut=new ObjectOutputStream(new FileOutputStream("d:/a.txt"));
        
        objOut.writeObject(p1);
        
        objOut.flush();
        objOut.close();
    }
    
    public void f2() throws Exception{
        ObjectInputStream objIn=new ObjectInputStream(new FileInputStream("d:/a.txt"));
        
        Person p1=(Person) objIn.readObject();
        
        System.out.println(p1);
    }
    
    public static void main(String[] args) throws Exception{
        
        Test4 t=new Test4();
        
        t.f1();
        t.f2();
        
    }

}

浅克隆和深克隆
  浅克隆:学生时 引用的老师teacher也被克隆了  称为 浅克隆
   
   克隆一个对象:要求被克隆的对象 实现一个接口  Cloneable
   
   Cloneable 也是一个标记型接口: 标记通过对象创建的类 可以被克隆
   
   被克隆对象要重写clone() 方法
  

public class Student implements Cloneable{
    
    private int age;
    private String name;
    private Teacher teacher;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Student(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }

}
public class Teacher {
    
    private int age;
    private String name;
    private ArrayList<Student> student;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public ArrayList<Student> getStudent() {
        return student;
    }
    public void setStudent(ArrayList<Student> student) {
        this.student = student;
    }
    public Teacher(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }

}
public class Go {
    
    public static void main(String[] args) throws Exception {
        Student s1=new Student(20,"张三");
        Student s2=new Student(21,"李四");
        
        Teacher t=new Teacher(34,"陈老师");
        
        //建立学生和老师之间的联系
        s1.setTeacher(t);
        s2.setTeacher(t);
        ArrayList<Student> list=new ArrayList<Student>();
        list.add(s1);
        list.add(s2);
        t.setStudent(list);
        
        Student s1Clone=(Student) s1.clone();
        
        System.out.println(s1==s1Clone);
    }

}

 


  深克隆:学生s1 引用的老师teacher没有被克隆  称为 深克隆
   要用到对象流  只需要把学生保存到文件中,读取出来后,与之相关联的老师也被克隆了

public class Student implements Serializable{
    
    private int age;
    private String name;
    private Teacher teacher;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Student(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

}
public class Teacher implements Serializable{
    
    private int age;
    private String name;
    private ArrayList<Student> student;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public ArrayList<Student> getStudent() {
        return student;
    }
    public void setStudent(ArrayList<Student> student) {
        this.student = student;
    }
    public Teacher(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
}
public class Go {
    
    public static void main(String[] args) throws Exception {
        Student s1=new Student(20,"张三");
        Student s2=new Student(21,"李四");
        
        Teacher t=new Teacher(34,"陈老师");
        
        //建立学生和老师之间的联系
        s1.setTeacher(t);
        s2.setTeacher(t);
        ArrayList<Student> list=new ArrayList<Student>();
        list.add(s1);
        list.add(s2);
        t.setStudent(list);
        
        //用对象流 把s1保存到文件中
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("d:/a.txt"));
        
        oos.writeObject(s1);
        
        oos.flush();
        oos.close();
        
        ObjectInputStream oin=new ObjectInputStream(new FileInputStream("d:/a.txt"));
        
        Student s3=(Student) oin.readObject();
        oin.close();
        System.out.println(s1==s3);
        System.out.println(s1.getTeacher()==s3.getTeacher());
      }

}

properties:map集合下面的子类  是以文件的形式进行存储的
 
  作用: 一般是用来配置文件  比如存储 用户名  密码   java连接数据库参数
 
  properties 存储的形式: username="张三"   password="123456"

public class Test6 {
    
    public static void main(String[] args) throws Exception {
        Properties pro=new Properties();
        File file=new File("user.properties");
        FileInputStream in=new FileInputStream(file);
        
        pro.load(in);//从user.properties中把键值对加载进来
        
        String name=pro.getProperty("username");
        String pass=pro.getProperty("password");

        System.out.println(name+"   "+pass);
    }

}

 

 

题目一:从一个文档读取文件内容,输出到控制台。

public static void main(String[] args) throws Exception {
        File file=new File("D:/a.txt");
        FileInputStream in=new FileInputStream(file);
        int len=0;
        byte[] by=new byte[1024];
        while((len=in.read(by))!=-1){
            String s=new String(by, 0, len);
            System.out.print(s);
        }
        
    }
View Code

 

posted on 2016-09-05 15:02  cch_java  阅读(144)  评论(0编辑  收藏  举报

导航