java基礎專欄—IO(1)

輸入圖片說明

IO

File類

文件,文件夾,路徑java

file就是文件路徑,文件,文件夾的抽象類。數組

//file的三種夠着函數public File(String pathName)

	File file = new File("d:\\xxxx");
  //只負責抽象出對象,提供方法,無論路徑是否存在
	public File(String father, String child)

  	public File(File parent, String child)

    public boolean createNewFile(String name)
    //只能從建立文件不能建立文件夾
    public boolean mdirs()
      
   	public boolean delete()
      
    public File getAbsoluteFile()
      
    public boolean exists()
      
    public boolean isDirectory()
      
    //list listFile獲取功能
    public String[] list()
    //獲得File中的文件和文件夾名的集合
    public File[] listFile()

文件過濾器

遍歷一個文件對象的時候能夠根據需求選擇合適的文件app

  • 在listFile的重載方法的基礎上
  • public File[] listFile(FileFilter filter)
  • 實現接口FileFilter並實現內部方法
  • public boolean accept(File pathName)

for example:函數

public boolean accept(File file){測試

​ return file.getName().endWith(".java")編碼

}操作系統

**原理:**實現了FileFilter的類就會調用acceptcode

File file = new File("xxxx");
File[] fileArr = file.listFile(new xxxxFilter());

​ listFile先遍歷File對象,而後將得到的文件名的全路徑,用過濾器傳遞給accept方法進行判斷,最後返回true的就裝進File[]對象

對目錄的全遍歷

public static getAllDir(File dir){
  	File[] fileArray = dir.list;
    for(File file : fileArray){
    	if(file.isDirectory){
      		getAllDir(file);
		}else{
      		System.out.println(file);
		}
    }
}

字節流

​ 在存儲中,任何一個文件個的最小單位都是Byte,字節流就是操做最小的存儲單元,對於任何的文件均可以操做,每次只操做一個字節,能夠寫一個文件,也能夠讀取文件,可是文件夾不是文件接口

字節輸出流-OutputStream

|--java.io.OutputStream全部的字節輸出流的超類
	

public void 

public Byte write(int b)寫入一個字節

public Byte write(byte[] b)寫入b.length長度的字節

public Byte write(byte[] b, int index, int howmunch)寫誰,從哪開始寫,寫幾個字節

public void close()

public void flush()

FileOutputStream

​ 流對象的構造方法都是用來綁定數據目的,File對象 String串

public FileOutputStream(){
    
}

流對象的操做

  • 建立流對象,綁定數據對象,注意文件被覆蓋
  • 調用流對象的write()
  • close()釋放資源
FileOutputStream fos = new FileOutputStream("流對象");
//構造方法會自動建立,若是有,就會將數據覆蓋
//FileNotFoundException
fos.write(100);
//IOException,可能寫不進去
fos.close();

//寫字節數組
byte[] bytes = {65,66,67,68};
fos.write(bytes);
//從一開始寫兩個
fos.write(bytes, 1, 2);
//直接寫入字符串的方式
fos.write("hello".getBytes())

打開文件看見的不是100而是d字母,由於文本在打開的時候都會去運行ASCII碼。

換行問題和續寫問題

​ 續寫問題,流對象

​ public FileOutputStream = newFileOutputStream(File file, boolean append)

​ 在不一樣的操做系統中,換行符不同,可是在Windows中是\r\n

File file = new File("xxxx.txt")
FileOutputStream  fos = new FileOutputStream(file,true);
fos.write("hello\r\n".getBytes())

IO中的異常處理

  • 確保變量對的做用域
    • 若是文件創建失敗了,不用關流對象
  • catch怎麼處理
    • 看見那裏出現了問題
    • 讓系統停下來
//try的外面聲明變量,內部創建對象
//對fos的做用域提高
FileOutputStream fos = null;
try{
 	fos = new FileOutputStream("xxxxx");
  	fos.write()
}catch(IOException ex){
    System.out.println(ex.getMessage());
  	throw new RuntimeException("文件寫入失敗");
}finally{
  	//提高做用域自後,Unhandle exception type of ioException
  	if(fos != null){}
 		try{
    		fos.close();    
  		}catch (IOException ex){
        	throw new RuntimeException("關閉文件失敗");
    	} 
	}
}

字節輸入流—InputStream

public int available()
  
public void close()
  
public void mark(int readlimit)在此輸入流中標記當前位置

public void reset()定位到最後一次調用mark的位置

public boolean MarkSupported()測試此輸入流是否支持mark和reset

public int read()將文件讀入,下一次調用自動讀取下一個字節,到達文件末尾返回-1

public int read(byte[] b)從輸入流中讀取必定數量的字節,而且將其寫入緩衝區數組b中,返回值讀取了多少個有效字節,-1表示結束

public long skip(long n)跳過和丟棄n個字節

FileInputstream

流對象操做

  • 建立流對象
  • 調用public ==int== read()
  • 關閉流對象
FileInputStream fis = new FileInputStream("xxxx");
//接受read方法的返回值
int len = 0;
while((len = fis.read() != -1){
    System.out.prineln((char)len)
}
fis.close()
      
      
//解決讀多了的問題
byte[] b = new byte[1024];
int len = 0;
while((len = fis.read(b)) != -1){
    System.out.print(new String(b,0,len));
}
fis.close();

文件複製原理

​ 將一個文件中的字節放到另外一個文件中去就是複製

//按字節的方式去拿,弊端 慢
public static void main(String[] args){
	FileInputStream fis = null;
  	FIleOutputStream fos = null;
  	int len = 0;
  	try{
      	fis = new FileInputStream("xxxx");
      	fos = new FileOutputStream("xxxx");
        while((len = fis.read()) != -1){
            fos.write(len);
        }
    }catch(IOException ex){
    	System.out.println(ex.getMessage());
      	throw new RuntimeException("文件複製失敗")
    }finally{
    	if((fis != null)&&(fos != null))){
            fis.close();
          	fos.close();
        }
    }
}


//採用數組的緩衝來提升效率
public static void main(String[] args){
  	FileInputStream fis = null;
  	FIleOutputStream fos = null;
  	int len = 0;
  	try{
      	fis = new FileInputStream("xxxx");
      	fos = new FileOutputStream("xxxx");
      	byte[] bytes = new byte[1024]
        while((len = fis.read(bytes)) != -1){
            fos.write(bytes,0,len);
        }
    }catch(IOException ex){
    	System.out.println(ex.getMessage());
      	throw new RuntimeException("文件複製失敗")
    }finally{
    	if((fis != null)&&(fos != null))){
            fis.close();
          	fos.close();
        }
    }
}

編碼表

ASCII:一個字節中有七位表示內容

用兩個字節表示中文,可是第一個字節的開頭必定是複數,可是第二個開頭多是負數

unicode,不管什麼類型都用連個字節表示,在java中char就是使用這個編碼

UTF-8,一個字節就可存儲,不用兩個字節,在每一個字節頭加入了編碼信

字符流

這個超類只能寫文本文件,每次操做的是一個字符,只能用來讀和寫字符文件

write

  • write(int c)
  • write(char[] c)
  • write(char[] c,int offset,int how)
  • write(String s)

FileWriter

​ 與FileOutputStream不一樣的是,寫入以後必須調用flush才能寫入,而且close暗含刷新的方法。

FileWriter fw = new FileWriter("xxxxxx");

fw.write("xxxxx");
fw.flush();

Reader

全部字符輸入流的超類

  • int read()讀取一個字符
  • int read(char[] c)
  • 沒有讀取字符串的讀取方法,由於字符串的意義沒法界定

FileReader

FileReader fr = new FileReader("xxxx");
int len = 0;
char[] c = new char[1024];
while((len = fr.read()) != -1){
    System.out.println(new String(char,0,len));
}
相關文章
相關標籤/搜索