1. 程式人生 > >Java I/O 使用位元組流/字元流進行檔案拷貝

Java I/O 使用位元組流/字元流進行檔案拷貝

例項

利用位元組流複製檔案

	/**
	 * 利用位元組流複製檔案
	 * @throws IOException
	 */
	@Test
	public void testByteCopy() throws IOException {
		InputStream in = new FileInputStream("MyTxt.txt");//定位輸入檔案	
		OutputStream out = new FileOutputStream("MyTxt3.txt");//定位輸出檔案
		
		byte [] buffer = new byte[1024*10];//定義位元組陣列,用於讀取檔案
		int len = 0;
		while((len = in.read(buffer))!=-1) {	//迴圈讀取檔案到陣列buffer,讀取長度為陣列長度
			out.write(buffer, 0, len);					//此處使用write(byte[] b, int off, int len) 而非write(byte[] b) 
		}														//是因為防止最後一次讀取的檔案長度不足陣列的長度而導致結尾輸出錯誤
		//關閉輸入,輸出流
		in.close();
		out.close();
	}

利用字元流複製檔案

@Test
	public void testChCopy() throws IOException {
		Reader in = new FileReader("MyTxt.txt");	
		Writer out = new FileWriter("MyTxt4.txt");
		
		char [] buffer = new char[1024*20];//定義字元陣列,用於讀取檔案
		int len = 0;
		while((len = in.read(buffer))!=-1) {
			out.write(buffer, 0, len);
		}
		
		in.close();
		out.close();
	}

總結

這篇部落格主要是想記錄的一點就是在呼叫OutputStream/Writer的write方法時是使用write(byte[] b, int off, int len) 而非write(byte[] b),因為在陣列最後一次讀檔案的時候,可能檔案長度小於陣列長度,此時用write(byte[] b)就會輸出 最後一次讀取的檔案+上一次讀取的部分檔案

比如檔案長度為106,陣列長度為10,前十次會正常輸出,最後一次就會輸出(101-106)+(97-100) 使用write(byte[] b, int off, int len) 而非write(byte[] b)。 最後此複製檔案的方法還可以複製其他型別的檔案。