一、文件的創建
-------------------------------------------------------
File類,表示磁盤上的文件或目錄,可對文件或目錄進行操作.
? * 常用方法
??? File.separator? separator用于表示目錄間的分隔符
??? creatNewFile() 創建一個新文件
mkdir() 創建一個目錄
??? delete() 可以將文件刪除
deleteonExit() 當程序終止后刪除文件
??? createTempFile() 創建臨時文件
??? list() 反回當前目錄下的所有文件名和子目錄的名字
??? isDirectory() 判斷是不是目錄
??? isFile 判是不是文件
??? FilenameFilter() 文件名的過濾器,它是個接口,
它有個方法accept(File dir,String name)返回企為值為boolean型,判斷每個文件名是不是,符合要求 ?
1. 創建一個文件
?? File f=new File("1.txt");
?? f.creatNewFile(); //創建一個名為1.txt的文件
f.mkdir(); //創建一個名為1.txt的目錄
2. File f=new File("E:\\java\\abc\\1.text"); //在windows下可以這么做,在linux下則不行,linux下沒有盤符
?? f.createNewFile(); 在e:\java\abc下創建1.text文件
?-----------------------------------------------------
3. File fDir=new File(File.separator);? //separator用于表示目錄間的分隔符,這里是表示在系統根目錄下
????????????????????????????????????????? 也可以 File fDir=new File(\); Windows可以這樣表示跟目錄
?? String strFile="java"+File.separator+"abc"+file.separator+"1.txt"; //? java/abc/1.txt
File f=new File(fDir,strFile); //fDir是創建文件的父目錄,strFile是文件位置
?? f.createNewfile();
?? f.delete() //可以將文件刪除
f.deleteonExit() //當程序終止后刪除文件
?? Thread.sleep(3000); //3秒后程序會結束,這樣這個文件創建3秒后,程序結束,然后執deleteonExit刪除文件
?--------------------------------
4. for (int i=0;i<5;i++)
?{ File f=File.createTempFile("winsun",".tmp"); //創建5個臨時文件,文件名是winsun,后綴名是tmp,文件位置在環境
變量的temp所指定的臨時文件的目錄下?? createTempFile是一個靜態變量,可以直接調用
?? f.deleteOnExit();
?}
?Thread.sleep(3000);
? for (int i=0;i<5;i++)
?{ File.createTempFile("winsun",".tmp"); } //可以這樣直接創建5個臨時文件
?---------------------------------
5. File fDir=new File(File.separator);
? String strFile="java"+File.separator+"abc"+file.separator+"aa"; //因為list()顯示的目錄是從當
前文件所在盤開始的,所以必須
??????????????????????????????????????????????????????????????????? 從跟目錄一直找到要用到的文件目錄
?File f=new File(fDir,strFile);
?if (f.isDirectory()) //判斷是不是目錄
?{?? String[] names=f.list(); //list返回的是一個String類型的靜態數組
???? for (int i;i<names.length;i++)
??? { System.out.println(names[i]); }
?}
?else
?{ System.out.println("沒有該目錄");
?}
------------------------------------------
6. 文件名的過濾器的用法
File fDir=new File(File.separator);
?String strFile="java"+File.separator+"abc";
?File f=new File(fDir,strFile);
?String[] names=f.list(new FilenameFilter()????? //在list()中建個文件過濾器
?{ public boolean accept(File dir,String name)
{ return name.indexOf(".java")!=-1; } // 顯示擴展名為.java的文件,如果不等于-1返回true,否則返回flase
?}); //匿名內部類,在查看java原文件中看到,File的list(FilenameFilter filter)方法中,自已調用了accept方法,
??????
?for (int i;i<names.length;i++)
?{ System.out.println(names[i]); }
---------------------------------------------
*********************************************
---------------------------------------------
二、文件的讀寫
流的分類:1、節點流:從特定的地方讀寫的流類,例如:磁盤或一塊內存區域。
2、過濾流:使用節點流作為輸入輸出。過濾流是使用一個已經存在的輸入流或輸出流連接創建的。
* InputStream
???? 三個基本的讀方法
?abstract int read() : 讀取一個字節的數據,但是按整型返回的,如果返回-1表示讀到了文件流的末尾。
??????????????????????? 整型占四個字節,它的第一個字節才是有效的數據(注意)
?int read(byte[] b)? :? 將數據讀入一個字節數組,同時返回實際讀取的字節數??
?int read(byte[]b,int off,int len)
其它方法
?long skip(long n): 在輸入流中跳過n個字節,并返回實際跳過的字節數。
?int available(): 返回可讀取的字節數。
?void close():關閉輸入流,釋放和這個流相關的系統資源。
?void mark(),void reset(),booleanmarkSupported(),在這個流中都是空實現的方法
* ouputStream
??? 三個基本的寫方法
?abstract void write(int b): 往輸出流中寫入一個字節,但傳進去一個整型的數據,它只寫整型的第一個字節
?void write(byte[] b)
?void write(byte[]b,int off,int len)
??? 其它方法
?void flush(): 刷新輸出流,強制緩沖區中的輸出字節被寫出。(它只對使用了緩沖的流類起作用)
?void close():關閉輸出流
--------------------------------
System.in 和 System.out 的 in 和out 都是PrintStream類型的
import java.io.*;
class StreamTest
{ public static void main(String[] args)throws Exception
? { int data;
??? while((data=System.in.read())!=-1)? //read它可以讀取一個字節的數據,但它的返回值是一個整型,如果返回-1說明
已經到了流的結尾
??? { System.out.write(data);}??? //write方法的參數也是整型
?}
}
???
---------------------------------------------------
***文件輸入輸出流 FileInputStream FileOutputStream (節點流)***
FileOutputStream fos=new FileOutputStream("1.txt")
fos.write("()); //write只能寫入一個字節或是一個字節數組,不能寫入字符串,但它的getBytes能獲取一個字節數組
fos.close();
?FileOutputStream fos=new FileOutputStream("1.txt",true)? //后面加true是在文件后面追加
fos.write("());
fos.close();
?
FileInputStream fis=new FileInputStream("1.txt");
byte[] buf=new byte[100];
int len=fis.read(buf);
System.out.println(new String(buf,0,len));
fis.close();
StringBuffer s=new StringBuffer();
FileInputSteam fis=new FileInputStream();
int c;
while ((c=fis.read())!=-1)
? s.append((char)c);
System.out.println(s.toString);
?----------------------------------------
**BufferedInputStream? BufferedOutputStream () (過濾流)使用已經存在的節點來構造,提供帶緩沖的讀寫,提高了讀寫效
率
?BufferedInputStream 真正實現了mark()和reset()方法
?BufferedOutputStream 實現了flush()方法
FileOutputStream fos=new FileOutputStream("1.txt");
BufferedOutputstream bos=new BufferedOutputStream(fos);
bos.write("());?? //這時1.txt中并沒有數據,數據在緩充區中,因為緩充區中還沒有滿
// bos.flush();? //刷新緩充區,執行這條語句,就會把緩沖區中的內容寫到1.txt文件中
bos.close();??? //如果不加bos.flush()的話bos.close()后,也會把數據寫到1.txt中了
FileInputStream fis=new FileInputStream("1.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
byte[] buf=new byte[100];
int len=bis.read(buf);
System.out.println(new String(buf,0,len));
bis.close();
-------------------------------
**DataInputStream 和 DataOutputStream (過濾流) 提供了讀寫java中的基本數據類型的功能
?
FileOutputStream fos=new FileOutputStream("1.txt");
BufferedOutputstream bos=new BufferedOutputStream(fos);
DataOutputStream dos=new DataOutputStream(bos);?? //將3個流連到一起
byte b=3; int i=78; char ch='a';? float f=4.5f;
dos.writeByte(b);
dos.writeint(b);
dos.writeChar(b);
dos.writeFloat(b);
dos.close();
FileInputStream fis=new FileInputStream("1.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
DataInputStream dis=new DataInputStream(bis);
System.out.println(dis.readByte());
System.out.println(dis.readInt());
System.out.println(dis.readChar());
System.out.println(dis.readFloat());
dis.close();
------------------------------------------------------
** PipedInputStream 和 PipedOutputStream (管道流,用于線程間的通信,必須同時構造管道輸入流和管道輸出流)
*PipedInputStream的兩個構造方法
?PipedInputStream()?
?PipedInputStream(PipedOutputStream src)
?
?PipedInputStream 的方法connect(PipedOutputStream src) 使此傳送輸入流連接到傳送輸出流 src。
?
import java.io.*;
?class PipedStreamTest
?{? public static void main(String[] args)
??? { PipedOutputStream pos=new PipedOutputStream();
????? PipedInputStream pis=new PipedInputStream();
??????????????????????????????
???????????????????????????? //在連接時會拋出個異常
????? try{ pos.connect(pis); //可以用管道輸出流連管道輸入流,也可用管道輸入流連管理輸出流
?????????????????????????????? 可定成 pis.connect(pos);??
?????????? new Produer(pos).start();
?????????? new Consumer(pis).start();
???????? }
????? catch(Exception e)
???? { e.printStackTrace(); }
??? }
?}
?class Producer extends Thread
?{ private PipedOutputStream pos;
?? public Producer(PipedOutputStream pos)
?? { this.pos=pos;? }
?? public void run()
?? { try
???? { pos.write("Hello,welcome you!",getBytes());
?????? pos.close();
???? }
???? catch(Exception e)
???? { e.printStackTrace();
???? }
?? }
}
?
?Class Consumer extends Thread
?{ private PipedInputStream pis;
?? public Consumer(PipedInputStream pis)
?? { this.pis=pis;
?? }
?? public void run()
? { try{ byte[] buf=new byte[100];
???????? int len=pis.read(buf);
???????? System.out.println(new String(buf,0,len));
???????? pis.close();
?????? }
??? catch(Exception e)
??? { e.printStackTrace(); }
?}
}
--------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------
reader? writer (兩個抽象類)
InputStreamReader 從字節流到字符流的轉換
OutputStreamWriter 從字符流到字節流的轉換
?// 帶緩沖的字符流
?BufferedWriter
?BufferedReader
?//用字符流向文本文件中寫入數據
?FileOutputStream fos=new FileOutputStream("1.txt");
?OutputStreamWriter osw=new OutputStreamWriter(fos);//將字符流轉為字節流的輸出
?BufferedWriter bw=new BufferedWriter(osw);
?bw.write("?bw.close();
?
?//從文本文件中讀入數據
?FileInputStream fis=new FileInputStream("1.txt");
?InputStreamReader isr=new InputStreamReader(fis);//將字節流轉為字符流讀出
?BufferedReader br=new BufferedReader(isr);
?System.out.println(br.readLine());
?br.close();
?---------------------------
//在命令行中讀入數據然后顯示數據
?InputStreamReader isr=new InputStreamReader(System.in);
?BufferedReader br=new BufferedReader(isr);
?String StrLine;
?while((StrLine=br.readLine())!=null)
?{ System.out.println(strLine);? }
?br.close();
----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------
****RandomAccessFile類同時實現了DataInput和DataOutput接口,可以對文件隨機存取,在文件任何位置
??????????????????? 讀取或寫入數據。
??????????????????? 它有一個指針,用來進行讀寫操作的下一數據的位置。
寫入一個字符串的方法
writeBytes(String s); 將一個字符的兩個字節的第一個字節寫入到文件中,第二個字節舍棄(最好不用)
writeChars(String s); 將兩個字節表示的一個數據,全都寫入到文件中
writeUTF(String str); 英文件一般占一個字節,中文是三個字節,它會在寫入數據的前面兩個字節處,記錄
寫入數據的長度,比如寫入"myblog"這樣6個字符,它會在"myblog"前記錄個6。表明
????????????????????? "myblog"占六個字節長度,對應的有一個readUTF()?? (最好用這個)
getFilePointer: 文件指針,獲取文件當前位置
seek(long pos): 設置文件指針的偏移量,將pos設為0,文件指針就指向文件起始位置。
?
import java.io.*;
class RandomFileTest
{ public static void main(String[] args) throws Exception
? { Student s1=new Student(1,"zhangsan",98,5);
??? Student s2=new Student(2,"lisi",96.5);
??? Student s3=new Student(3,"wangwu",78.5);
??? RandomAccessFile raf=new RandomAccessFile("student.txt","rw");
??? s1.writeStudent(raf);
??? s2.writeStudent(raf);
??? s3.writeStudent(raf);
???
??? Student s=new Student();
??? raf.seek(0);
??? for (long i=0;i<raf.length();i=raf.getFilePointer()) //獲取一個文件的長度,它的返回值是一個long型
??? { s.readStudent(raf);
????? System.out.println(s.num+":"+s.name+":"+s.score);
??? }
??? raf.close();
? }
}
class Student
{ int num;
? String name;
? double score;
? public Student()
? {
? }
? public Student(int num,String name,double score)
? {? this.num=num;
???? this.name=name;
???? this.score=score;
? }
? public void writeStudent(RandomAccessFile raf) throws IOException
? { raf.writeInt(num);
??? raf.writeUTF(name);
??? raf.writeDouble(score);
? }
? pubic void readStudent(RandomAccessFile raf) throws IOException
? { num=raf.readInt();
??? name=raf.readUTF();
??? score=raf.readDouble();
? }
}
--------------------------------------------------
--------------------------------------------------
--------------------------------------------------
*****對象序列化
?* 將對象轉換為字節流保存起來,并在日后還原這個對象,這種機制叫做對象序列化。
?* 將一個對象保存到永久存儲設備上稱為持續性。
?* 一個對象要想能夠實現序列化,必須實現Serializable接口或Externalizable接口。
?
? Serializable接口中沒有任何方法,是個空接口,是個標識接口,對象去實現這個接口,表明這個對象,可以進行
????????????? 序列化了。
? Externalizable接口它繼承自Serializable接口
?
---實現對象的序列化,可利用io包中的兩個類,
?? ObjectOutputStream,它實現了DataOutput接口,它提供了往輸出流中寫入java基本數據類型的功能,
???????? ObjectOutputStream()???
???????? ObjectOutputStream(OutputStream out)
???? 它的方法,writeObject(Object obj)可以寫入指定的對象,到對象的輸出流中,它可以完成對象的序列化。
?? ObjectInputStream,它實現了DataInput接口,它也提供了java基本數據類型讀寫的功能,
???? 它的方法,readObject()從對象輸入流中讀取一個對象。可實現對象的反序列化操作。
?*當一個對象被序列化時,只保存對象的非靜態成員變量,不能保存任何的成員方法和靜態的成員變量。
?*如果一個對象的成員變量是一個對象,那么這個對象的數據成員也會被保存。
?*如果一個可序列化的對象包含對某個不可序列化的對象的引用,那么整個序列化操作將會失敗,并且會拋出一個?
NotSerializableException。我們可以將這個引用標記為transient,那么對象仍然可以序列化。
import java.io.*;
class ObjectSerialTest
{ public static void main(String[] args) throws Exception
? { Employee e1=new Employee("zhangsan",25,3000.50);
??? Employee e1=new Employee("lisi",24,3200.40);
??? Employee e1=new Employee("wangwu",27,3800.55);
???
??? FileOutputStream fos=new FileOutputStream("employee.txt");
??? ObjectOutputStream oos=new ObjectOutputStream(fos);
??? oos.writeObject(e1);
??? oos.writeObject(e2);
??? oos.writeObject(e3);
??? oos.close();
??? FileInputStream fis=new FileInputStream("employee.txt");
??? ObjectInputStream ois=new ObjectInputStream(fis);
??? Employee e;
??? for (int i=0;i<3;i++)
??? { e=(Employee)ois.readObject(); //它返回的是一個Object類型,所以得轉換成Employee類型
????? System.out.println(e.name":"+e.age+":"+e.salary);
??? }
? }
}
class Employee implements Serializable
{ String name;
? int age;
? double salary;?? //如果在salary前加上transient,salary這個變量也不會保存
?
? transient Thread t=new Thread(); 這里的線程對象t是個不可序列化的對象,但前面要是加個transient,
?????????????????????????????????? t這個對象就不會參與到序列化當中.
??
? public Employee(String name,int age,double salary)
? { this.name=name;
??? this.age=age;
??? this.salary=salary;
? }
?
? //下面的兩個方法比較特殊,private的方法,一般不可以被外部調用,但下面的兩個方法,可以被調用
??? 如果想對 對象進行控制,可以用下面的兩個方法,按自已的想法去讀寫對象信息, 下面的這兩方法就是
在讀和寫的時候都沒有加salary這個變量
? private void writeObject(ObjectOutputStream oos) throws IOException
? { oos.writeInt(age);
??? oos.writeUTF(name);
??? System.out.println("Write Object");
? }
? private void readObject(ObjectInputStream ois) throws IOException
? { oos.writeInt(age);
??? oos.writeUTF(name);
??? System.out.println("Read Object");
? }
}
地震讓大伙知道:居安思危,才是生存之道。
posted on 2007-03-12 22:25
小尋 閱讀(388)
評論(0) 編輯 收藏 所屬分類:
j2se/j2ee/j2me