java.io常見流/java.io.file檔案操作大全
http://wosyingjun.iteye.com/blog/1885786
今天學習了下java的IO流,這裡做個總結,方便查詢。
InputStream/OutputSrteam
InputStream是個抽象類,表示位元組輸入流的所有類的超類。常見的有向檔案寫入資料。
OutputStream是個抽象類,表示位元組輸出流的所有類的超類。常見的有從檔案寫出資料。
繼承關係:
舉例:採用FileInputStream/FileOutputStream讀寫檔案。
Java程式碼- package yingjun.io;
- import java.io.*;
- //讀取檔案
- public
- publicstaticvoid main(String[] args) {
- FileInputStream in = null;//定義一個輸入位元組流
- try {
- in = new FileInputStream("D:/test/newfilename.txt");
- } catch (FileNotFoundException e) {
- System.out.println("找不到指定檔案");
- System.exit(-1);
- }
- try {
- long num = 0;
- int b = 0;
- while((b=in.read())!=-1){ //不等於-1就說明沒有讀到結尾
- System.out.print((char)b); //輸出位元組
- num++;
- }
- in.close();
- System.out.println();
- System.out.println("共讀取 "+num+" 位元組");
- } catch (IOException e1) {
- System.out.println("檔案讀取錯誤"
- }
- }
- }
- package yingjun.io;
- import java.io.*;
- //讀出檔案並寫入另一個檔案
- publicclass TestFileOutputStream {
- publicstaticvoid main(String[] args) {
- int b = 0;
- FileInputStream in = null;//用於讀檔案
- FileOutputStream out = null;//用於向檔案寫資料
- try {
- in = new FileInputStream("D:/test/oldfile.txt");//就像在oldfile這個檔案裡插入一個管道用於讀取裡面的內容。
- out = new FileOutputStream("D:/test/newfile.txt");//就像在newfile這個檔案裡插入一個管道用於向裡面寫人內容
- while((b=in.read())!=-1){
- out.write(b);
- }
- in.close();
- out.close();
- } catch (FileNotFoundException e2) {
- System.out.println("找不到指定檔案"); System.exit(-1);
- } catch (IOException e1) {
- System.out.println("檔案複製錯誤"); System.exit(-1);
- }
- System.out.println("檔案已經複製");
- }
- }
##################################################################
Reader/Writer
Reader用於讀取字元流的抽象類子類必須實現的方法只有 read(char[], int, int) 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
Writer寫入字元流的抽象類。子類必須實現的方法僅有 write(char[], int, int)、flush() 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
舉例:採用FileReader/FileWriter讀寫檔案。
- package yingjun.io;
- import java.io.*;
- //讀取檔案
- publicclass TestFileReader {
- publicstaticvoid main(String[] args) {
- FileReader fr = null;
- int c = 0;
- try {
- fr = new FileReader("D:/test/newfilename.txt");
- while ((c = fr.read()) != -1) {
- System.out.print((char)c);
- }
- fr.close();
- } catch (FileNotFoundException e) {
- System.out.println("找不到指定檔案");
- } catch (IOException e) {
- System.out.println("出錯");
- }
- }
- }
- package yingjun.io;
- import java.io.*;
- //寫入檔案
- publicclass TestFileWriter {
- publicstaticvoid main(String[] args) {
- FileWriter fw = null;
- try {
- fw = new FileWriter("D:/test/newfilename.txt");
- for(int c=0;c<=50000;c++){
- fw.write(c);//c表示的是unicode編碼,50000基本涵蓋了所有國家的文字。
- }
- fw.close();
- } catch (IOException e1) {
- e1.printStackTrace();
- System.out.println("出錯");
- System.exit(-1);
- }
- }
- }
########################################################################
常見處理流
########################################################################
1:緩衝流
Java程式碼- package yingjun.io;
- import java.io.*;
- publicclass TestBufferStream2 {
- //向一個檔案裡寫入資料並且從中讀取出
- publicstaticvoid main(String[] args) {
- try {
- BufferedWriter bw = new BufferedWriter(new FileWriter("D:/test/DateTest.java,true"));//true表示不會刪除檔案之前所有的內容
- BufferedReader br = new BufferedReader( new FileReader("D:/test/DateTest.java"));
- String s = null;
- for(int i=1;i<=10;i++){
- s = String.valueOf(Math.random());
- bw.write(s);
- bw.newLine();
- }
- bw.flush();
- while((s=br.readLine())!=null){ //BufferReader有快取區的功能,可以讀一行
- System.out.println(s);
- }
- bw.close();
- br.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
2:轉換流
Java程式碼- package yingjun.io;
- import java.io.*;
- publicclass TestTransForm2 {
- publicstaticvoid main(String args[]) {
- InputStreamReader isr = new InputStreamReader(System.in);//System.in代表鍵盤輸入流
- BufferedReader br = new BufferedReader(isr);//在外面再套接一層
- String s = null;
- try {
- s = br.readLine(); //等待鍵盤輸入直到輸入一行
- while(s!=null){
- if(s.equalsIgnoreCase("exit")) break;
- System.out.println(s.toUpperCase());
- s = br.readLine();
- }
- br.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
3:資料流
Java程式碼- package yingjun.io;
- import java.io.*;
- publicclass TestDataStream {
- publicstaticvoid main(String[] args) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream(); //定義位元組陣列流
- DataOutputStream dos = new DataOutputStream(baos);//套接資料型別流
- try {
- dos.writeDouble(Math.random());//寫入double型別資料
- dos.writeBoolean(true);
- ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
- System.out.println(bais.available());
- DataInputStream dis = new DataInputStream(bais);
- System.out.println(dis.readDouble());//讀取double型別資料
- System.out.println(dis.readBoolean());
- dos.close();
- dis.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
4:列印流
Java程式碼- package yingjun.io;
- import java.io.*;
- publicclass TestPrintStream1 {
- publicstaticvoid main(String[] args) {
- PrintStream ps = null;
- try {
- FileOutputStream fos = new FileOutputStream("D:/test/DateTest.java");
- ps = new PrintStream(fos);
- } catch (IOException e) {
- e.printStackTrace();
- }
- if(ps != null){
- System.setOut(ps);//設定System.out輸出到ps(原來是在dos)
- }
- for(char c = 0; c <= 60000; c++){
- System.out.print(c+ " ");//print具有自動的flush功能,所有資料將被寫入檔案
- }
- }
- }
- package yingjun.io;
- import java.text.SimpleDateFormat;
- import java.util.*;
- import java.io.*;
- //類似log功能
- publicclass TestPrintStream3 {
- publicstaticvoid main(String[] args) {
- String s = null;
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- try {
- FileWriter fw = new FileWriter ("D:/test/log.java", true);//log
- PrintWriter log = new PrintWriter(fw);
- while ((s = br.readLine())!=null) {
- if(s.equalsIgnoreCase("exit")) break;
- System.out.println(s.toUpperCase());
- log.println("-----");
- log.println(s.toUpperCase());
- //log.flush();
- }
- log.println("==="+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())+"===");
- log.flush();
- log.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
5:物件流
Java程式碼- package yingjun.io;
- import java.io.*;
- publicclass TestObjectIO {
- publicstaticvoid main(String args[]) throws Exception {
- T t = new T();
- t.k = 111;
- FileOutputStream fos = new FileOutputStream("D:/test/DateTest.java");
- ObjectOutputStream oos = new ObjectOutputStream(fos);
- oos.writeObject(t);
- oos.flush();
- oos.close();
- FileInputStream fis = new FileInputStream("D:/test/DateTest.java");
- ObjectInputStream ois = new ObjectInputStream(fis);
- T tReaded = (T)ois.readObject();
- System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k);
- }
- }
- class T implements Serializable //可以被序列化的(可以把物件寫到檔案或者網路上傳輸)
- {
- int i = 10;
- int j = 9;
- double d = 2.3;
- transientint k = 15; //transient修飾的成員變數在序列化的時候不考慮
- }
==================================================================================================
http://wosyingjun.iteye.com/blog/1885404
java.io.file檔案操作大全
Java程式碼- package yingjun.file;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import org.junit.Test;
- publicclass TestFile {
- //建立檔案、資料夾
- @Test
- publicvoid addFile() throws IOException{
- //File file=new File("D:/test/testfile/"+"filename.txt");
- File file=new File("D:/test/testfile/","filename.txt");
- if(!file.getParentFile().exists()){ //如果該檔案路徑不存在就建立該路徑
- file.getParentFile().mkdirs();
- }
- if(!file.exists()) { //指定路徑下的filename.txt檔案要是不存在就建立
- file.createNewFile();
- }
- }
- //刪除檔案
- @Test
- publicvoid deleteFile(){
- File file=new File("D:/test/testfile/"+"filename.txt");
- if(file.exists()&&file.isFile())
- file.delete();
- }
- //刪除檔案目錄
- @Test
- publicvoid deleteFileDir(){
- RecursionDel("D:/test/"); //採用遞迴刪除test目錄下的的所有檔案(包括test)
- }
- privatevoid RecursionDel(String path){
- File dir=new File(path);
- if(dir.exists()){
- File[] tmp=dir.listFiles();
- for(int i=0;i<tmp.length;i++){
- if(tmp[i].isDirectory()){
- RecursionDel("D:/test/"+tmp[i].getName());
- }else{
- tmp[i].delete();
- }
- }
- dir.delete();
- }
- }
- //複製檔案
- @Test
- publicvoid copyFile() throws IOException{
- FileInputStream in=new FileInputStream("D:/test/testfile/filename.txt"); //要拷貝的檔案目錄
- File file=new File("D:/test/filename.txt"); //拷貝到的檔案目錄
- if(!file.exists()) {
- file.createNewFile();
- }
- FileOutputStream out=new FileOutputStream(file);
- int c;
- byte buffer[]=newbyte[1024];
- while((c=in.read(buffer))!=-1){
- for(int i=0;i<c;i++)
- out.write(buffer[i]);
- }
- in.close();
- out.close();
- }
- //剪下檔案
- @Test
- publicvoid copyFileDir() throws IOException{
- File oldfold=new File("D:/test/testfile/lala/asd.txt");
- File newfold=new File("D:/test/asd.txt");
- Boolean cover=true;//用於判斷是否覆蓋
- if(newfold.exists()){ //若在待轉移目錄下,已經存在待轉移檔案
- if(cover){//覆蓋
- oldfold.renameTo(newfold);
- }else
- System.out.println("在新目錄下已經存在");
- }else{
- oldfold.renameTo(newfold);
- }
- }
- //檔案重新命名
- @Test
- publicvoid renameFile(){
- File oldfile=new File("D:/test/filename.txt");
- File newfile=new File("D:/test/newfilename.txt");
- if(newfile.exists())//若在該目錄下已經有一個檔案和新檔名相同,則不允許重新命名
- System.out.println("已經存在!");
- else{
- oldfile.renameTo(newfile);
- }
- }
- //採用遞迴的方法遍歷某個資料夾下的所有檔案.
- @Test
- publicvoid listFile(){
- File f = new File("d:/test");
- fileList(f);
- }
- privatestaticvoid fileList(File f) {
- File[] childs = f.listFiles();
- for(int i=0; i<childs.length; i++) {
- if(childs[i].isDirectory()) {
- fileList(childs[i]);
- }else{
- System.out.println(childs[i].getAbsolutePath());
- }
- }
- }
- }