編碼表、位元組流、位元組緩衝流
概念:
位元組流不需要重新整理(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];