IO
File: 表明文件或者目錄(文件夾)
delete()方法: 若是刪除的是普通的文本文件 能夠直接刪除
若是刪除的是目錄 ,
1.若是目錄中沒有其餘的文件或者目錄 能夠直接刪除
2.若是目錄中有其餘的文件 或者目錄 ,先把當前目錄中的文件刪除 才能刪除當前的目錄
mkdir() 建立文件或者目錄 不能建立父目錄
mkdirs() 建立文件或者目錄 若是父目錄不存在,把父目錄一塊兒建立
isDirectory() 判斷文件是不是一個目錄
isFile() 判斷是不是一個標準的文件
length() 返回的是文件的長度 大小
list() 得到子文件或者目錄的名字
listFiles() :File[] 得到子文件或者目錄的對象 存儲到數組中
輸入流 輸出流
字節流(byte) 字符流(char)java
字節流: 若是讀入的網絡上的資源 就用字節流 好比:圖片 音頻 文本
字符流: 當肯定是偶數個字節 才用字符流
輸入流:
字節輸入流: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() 方法
ide
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"this
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); } }
題目一:從一個文檔讀取文件內容,輸出到控制檯。spa
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); } }