1. 程式人生 > >編碼表、位元組流、位元組緩衝流

編碼表、位元組流、位元組緩衝流

概念: 

       位元組流不需要重新整理(byte)

    字元流需要重新整理(char)

    IO流:input(通過Java程式往記憶體裡讀取) output(通過Java程式往硬碟上外寫出) 輸入輸出流

 * IO流的分類

 *          按照操作的資料不同

 *                 位元組流:操作位元組,由於計算機上一切皆是位元組,位元組流可以操作一切資料

 *                 字元流:操作字元,只能操作文字檔案

 *                 文字檔案:能使用文字工具 開啟 看懂的叫做文字檔案 txt java html xml css。(  world excel是文字檔案嗎? 不是文字)

 *          按照流向分類

 *                 位元組流

 *                        位元組輸入流  InputStream read  讀一個位元組 讀一個位元組陣列

 *                                      FileInputStream

 *                                      BufferedInputStream

                            BufferedInputStream infile=new BufferedInputStrean(new FileInputStream("檔案路徑") );

 *                        位元組輸出流 OutputStream write 寫一個位元組 寫一個位元組陣列 寫位元組陣列的一部分

 *                                    FileOutputStream

 *                                    BufferedOutputStream

 *                 字元流

 *                        字元輸入流 Reader read 讀一個字元  讀一個字元陣列

 *                                    FileReader

 *                                     BufferedReader

 *                        字元輸出流 Writer write 寫一個字元 寫一個字元陣列 寫字元陣列的一部分 寫字串

 *                                    FileWriter

 *                                    BufferedWriter

 * java.io.OutputStream 所有位元組輸出流的抽象超類

 *           方法

 *                        write(int b) 寫一個位元組

 *                        write(byte[] byte) 寫一個位元組陣列

 *                        write(byte[] bytes,int offset, int length) 寫位元組陣列的一部分

 *                        close() 關閉資源

 *

 *          常用子類

 *                         FileOutputStream

 *                 構造方法繫結資料目的

 *                        FileOutputStream(File file)

 *                        FileOutputStream(String name)

 *                 引數

 *                        File物件

 *                        String路徑

 *                        IO流物件本身沒有讀寫功能,需要呼叫作業系統的讀寫功能 完成讀寫

 *                         在呼叫後,需要關閉資源

       檔案的續寫與換行

 *   續寫

 *          FileOutputStream類的構造方法

 *                 FileOutputStream(File file, boolean append)

 *                 FileOutputStream(String name, boolean append)

 *                 當引數 append為true時 則續寫  為false則覆蓋 不加append預設false

 java.io.InputStream 所有位元組輸入流的超類

 *          方法

 *                        int read() 讀一個位元組

 *                        int read(byte[] bytes) 讀一個位元組陣列

 *          常用子類

 *                              FileInputStream

 *                       構造方法繫結資料來源

 *                              FileInputStream(File file)

 *                              FileInputStream(String name)

 *                       引數

 *                              File物件

 *                              String路徑

 * int read(byte[] bytes) 讀一個位元組陣列

 *

 *                 返回值

 *                        int 讀取的有效位元組數(返回的是有效個數)

 java.io.BufferedOutputStream extends OutputStream 位元組輸出緩衝流

 *                 可以使用所有OutputStream的方法  write 寫一個位元組 一個位元組陣列 一個位元組陣列的一部分

 *   構造方法

 *                        BufferedOutputStream(OutputStream out)

 *                 引數

 *                        OutputStream out:所有位元組輸出流的超類 ,抽象類不能建立物件,需要傳入其子類物件

 *                                                     FileOutputStream

 java.io.BufferedInputStream extends InputStream 位元組輸入緩衝流

 *                 可以使用所有InputStream的方法 read 讀一個位元組 讀一個位元組陣列

 *   構造方法

 *                 BufferedInputStream(InputStream in)

 *          引數

 *                 InputStream in:所有位元組輸入流的超類,抽象類不能建立物件 ,需要傳入其子類物件

 *                                         FileInputStream

 

 

java.util.Properties extends Hashtable  implements Map

 *          鍵和值都是字串型別 唯一一個可以和IO流直接結合使用的集合

 *

 *   方法

 *                 setProperty(String key,String value) 新增元素  put(K key ,V value)

 *                 String getProperty(String key) 根據鍵找值

 *                 Set<String> stringPropertyNames() 獲取所有鍵的set集合

             <讀取檔案>和IO流結合使用

 *                      load(InputStream in) 將檔案中的鍵值對載入進集合

 *                 load(Reader in)

 *         引數  任意輸入流物件

              <寫入檔案>

 *                       store(OutputStream out ,String com) 將集合中的資料 寫入到配置檔案中

 *                       store(Writer out ,String com)

 *         引數  任意輸出流物件       

 

 

 

<複製檔案例子複製(H:\\刪除新增練習使用檔案1)到(H:\\刪除新增練習使用檔案2)>

 

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

public class CopyDir {

       public static void main(String[] args) throws IOException {

              File src = new File("H:\\刪除新增練習使用檔案1");

              File dest = new File("H:\\刪除新增練習使用檔案2");

              copyDir(src,dest);

       }     

       public static void copyDir(File srcDir,File destDir) throws IOException{

              //確定資料夾的資料來源和資料目的

              //獲取資料來源的資料夾名稱

              String srcDirName = srcDir.getName();

              //確定資料夾的資料目的

              //使用資料目的+資料來源的資料夾名稱 拼出最終的資料目的

              File destDir2 = new File(destDir,srcDirName);

             

              System.out.println("--------複製檔案--------------");

              if(srcDir.isDirectory()){

              //建立資料目的資料夾

              destDir2.mkdirs();

              //獲取資料來源資料夾的所有檔案

              File[] srcFileArr = srcDir.listFiles();

              //遍歷陣列 依次獲取到每個資料來源檔案

              for(File srcFile: srcFileArr){

                     //確定資料目的的檔案

                     //獲取資料來源的檔名

                     if(srcFile.isDirectory()){

                            copyDir(srcFile, destDir2);

                     }else{

                     String srcFileName = srcFile.getName();

                     //使用資料目的的資料夾 + 原始檔的檔名 確定資料目的的檔案

                     File destFile = new File(destDir2,srcFileName);

                     //複製檔案

                     copy(srcFile,destFile);

              }

              }

              }else{

                     String srcFileName = srcDir.getName();

                     //使用資料目的的資料夾 + 原始檔的檔名 確定資料目的的檔案

                     File destFile = new File(destDir2,srcFileName);

                     //複製檔案

                     copy(srcDir,destFile);

              }

       }     

       public static void copy(File src,File dest) throws IOException{

              //建立位元組緩衝輸入流物件,繫結位元組輸入流,繫結資料來源

              BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));

              //建立位元組緩衝輸出流物件,繫結位元組輸出流,繫結資料目的

              BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));

              byte[] bytes = new byte[1024];

              int len = 0;

              while((len = bis.read(bytes))!=-1){

                     bos.write(bytes, 0, len);

              }

             

             

              //關閉資源

              bos.close();

              bis.close();   

       }

}

<檔案複製例子二>

package Test_03_03;

 

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileFilter;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.HashMap;

import java.util.Random;

import java.util.Scanner;

import java.util.Set;

/*

 * 從控制檯獲取輸入的檔案目錄然後將該目錄(包含子目錄)下的.java檔案複製到D:/java資料夾中,並統計java檔案的個數.

提示:如果有相同的名稱的檔案,如果兩個Test01.java,則拷貝到目標資料夾時只能有一個Test01.java,

另一個Test01.java要修改為另一個名稱:該名稱可隨機生成,只要不重複即可.

 */

public class Test {

       static int sum=0;

       public static void main(String[] args) throws IOException {

              Scanner sc=new Scanner (System.in);

              System.out.println("請輸入要訪問的檔案目錄:");

              String str=sc.nextLine();

              //根據輸入的目錄建立檔案

              File file1=new File(str);

              File file2=new File("H:\\刪除新增練習使用檔案2");

              file2.mkdirs();

              copyPath(file1,file2);

       }

       //檔案路徑複製

       public static void copyPath(File file1,File file2) throws IOException{

              if(file1.isDirectory()){

                     File[] file=file1.listFiles(new FileFilter(){

                            @Override

                            public boolean accept(File pathname) {

                                   //判斷如果是以

                                   if(pathname.getName().endsWith(".java")||pathname.isDirectory()){

                                          return true;

                                   }

                                   return false;

                            }

                           

                     });

                     //如果是資料夾新增後遍歷進行檔案儲存

                     for (File file3 : file) {

                            if(file3.isDirectory()){

                                   copyPath(file3,file2);

                            }else{

                                   String str2=file3.getName();

                                   File file11=new File(file2,str2);

                                   //如果同名隨機一個名字遞迴直到不重名

                                   while(file11.exists()){

                                          file11 = new File(file2,new Random().nextInt(100000) + str2);

                                   }

                                  

                                   //file11.mkdir();

                                   System.out.println(file11);

                                   copy(file3,file11);

                            }

                     }

              }else{

                     if(file1.getName().endsWith(".java")){

                            String str2=file1.getName();

                            File file11=new File(file2,str2);

                            copy(file1,file11);

                     }else{

                            System.out.println("你輸入的不是資料夾:");

                     }                   

              }

       }

       public static void copy(File file1,File file2) throws IOException{

              //建立檔案高效寫流

              BufferedOutputStream outfile=new BufferedOutputStream(new FileOutputStream(file2));

              //建立檔案高效讀取流

              BufferedInputStream infile=new BufferedInputStream(new FileInputStream(file1));

              byte[] b=new byte[1024];

              int len=0;      

              while((len=infile.read(b))!=-1){

                     outfile.write(b,0,len);

              }

              outfile.close();

              infile.close();

             

              sum++;

       }

}

 

按照流向分:輸入流與輸出流,每個IO流物件均要繫結一個IO資源

分類關係如下:

       位元組輸入流 InputStream 抽象類

                     FileInputStream 操作檔案的位元組輸入流

       位元組輸出流 OutputStream 抽象類

                     FileOutputStream 操作檔案的位元組輸出流

       字元輸入流 Writer寫入字元流的抽象類

                     FlieWriter操作檔案的字元輸入流

       字元輸出流 Reader用於讀取字元流的抽象類

                     FileReader操作檔案的字元輸入流

       緩衝流,根據流的分類分類位元組緩衝流與字元緩衝流。

                     位元組緩衝流:BufferedInputStream

                               BufferedOutputStrea

                     字元緩衝流:BufferedReader

                               BufferedWriter

       <位元組流不需要重新整理字元流需要>

       按照傳輸方式:分為位元組流和字元流

                         字元流  按照字元的方式讀寫

                         位元組流  按照位元組的方式讀寫

       定義一個緩衝區提高效率

                     位元組型 byte[]  bytes=new byte[1024];

                     字元型 char[]  ch=new char[1024];