1. 程式人生 > >java基礎----編解碼 轉換流

java基礎----編解碼 轉換流

package cn.itcast.other;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
/*
編碼與解碼 
 
 編碼: 把看得懂的字元變成看不懂碼值這個過程我們稱作為編碼。
 
解碼: 把碼值查詢對應的字元,我們把這個過程稱作為解碼。


注意: 以後編碼與解碼一般我們都使用統一的碼錶。否則非常容易出亂碼。


 */


public class Demo7 {

public static void main(String[] args) throws Exception {
/*
String str = "中國";
byte[] buf = str.getBytes("utf-8");// 平臺預設的編碼表是gbk編碼表。  編碼
System.out.println("陣列的元素:"+Arrays.toString(buf)); //

str = new String(buf,"utf-8");  //預設使用了gbk碼錶去解碼。 
System.out.println("解碼後的字串:"+ str);
*/


/*String str = "a中國"; // ,0, 97, 78, 45, 86, -3
byte[] buf = str.getBytes("unicode");  //編碼與解碼的時候指定 的碼錶是unicode實際上就是用了utf-16.
System.out.println("陣列的內容:"+ Arrays.toString(buf));
*/


String str = "大家好";
byte[] buf = str.getBytes(); //使用gbk進行編碼
System.out.println("位元組陣列:"+ Arrays.toString(buf));  // -76, -13, -68, -46, -70, -61

str = new String(buf,"iso8859-1");
// 出現亂碼之後都可以被還原嗎?  不一定 

byte[] buf2 = str.getBytes("iso8859-1");
str = new String(buf2,"gbk"); 


System.out.println(str);




}

}



package cn.itcast.other;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
/*
 轉換流:
 
輸入位元組流的轉換流:InputStreamReader 是位元組流通向字元流的橋
  InputStreamReader
 
輸出位元組流的轉換流:
OutputStreamWriter   可以把輸出位元組流轉換成輸出字元流 。  
 
 
轉換流的作用:
1. 如果目前所 獲取到的是一個位元組流需要轉換字元流使用,這時候就可以使用轉換流。  位元組流----> 字元流
  2. 使用轉換流可以指定編碼表進行讀寫檔案。
 
 
 */




public class Demo8 {

public static void main(String[] args) throws IOException {
// readTest();
// writeTest();'

// writeTest2();
readTest2();
}

//使用輸入位元組流的轉換流指定碼錶進行讀取檔案資料
public static void readTest2() throws IOException{
File file = new File("F:\\a.txt");
FileInputStream fileInputStream = new FileInputStream(file);
//建立位元組流的轉換流並且指定碼錶進行讀取
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"utf-8");
char[] buf = new char[1024];
int length = 0;
while((length = inputStreamReader.read(buf))!=-1){
System.out.println(new String(buf,0,length));
}

}





//使用輸出位元組流的轉換流指定碼錶寫出資料
public static void writeTest2() throws IOException{
File file = new File("F:\\a.txt");
//建立資料的輸出通道
FileOutputStream fileOutputStream = new FileOutputStream(file);
//把輸出位元組流轉換成字元流並且指定編碼表。
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");
outputStreamWriter.write("新中國好啊");
//關閉資源
outputStreamWriter.close();

}



public static void writeTest() throws IOException{
File file = new File("F:\\a.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
//把輸出位元組流轉換成輸出字元流。
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);

outputStreamWriter.write("大家好");
outputStreamWriter.close();

}




public static void readTest() throws IOException{
InputStream in = System.in; //獲取了標準的輸入流。
// System.out.println("讀到 的字元:"+ (char)in.read());  //read()一次只能讀取一個位元組。
//需要把位元組流轉換成字元流。
InputStreamReader inputStreamReader = new InputStreamReader(in);
//使用字元流的緩衝類
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
while((line = bufferedReader.readLine())!=null){
System.out.println("內容:"+ line);
}


}


}



package cn.itcast.other;


/*
遞迴:函式的自身呼叫函式的自身。


遞迴的使用前提: 必須要有條件的情況下呼叫。




需求: 算出5的階乘。 5! = 5*4 *3 * 2*1 




*/
public class Demo9 {


public static void main(String[] args) {
int result = print(5);
System.out.println("結果:"+ result);
}

public static int print(int num){
if(num==1){
return 1;
}else{
return num*print(num-1);
}
}




public static int test(int num){
int result  =  1;
while(num>0){
result = result*num;
num--;
}
return result;
}
}




package cn.itcast.other;


import java.io.File;


/*
 需求1:列出一個資料夾的子孫檔案與目錄。
 
 2,列出指定目錄中所有的子孫檔案與子孫目錄名,要求名稱前面要有相應數量的空格:
第一級前面有0個,第二級前面有1個,第三級前面有2個...,以此類推。


3,列出指定目錄中所有的子孫檔案與子孫目錄名,要求要是樹狀結構,效果如下所示:
|--src
|   |--cn
|   |   |--itcast
|   |   |   |--a_helloworld
|   |   |   |   |--HelloWorld.java
|   |   |   |--b_for
|   |   |   |   |--ForTest.java
|   |   |   |--c_api
|   |   |   |   |--Student.java
|--bin
|   |--cn
|   |   |--itcast
|   |   |   |--i_exception
|   |   |   |   |--ExceptionTest.class
|   |   |   |--h_linecount
|   |   |   |   |--LineCounter3.class
|   |   |   |   |--LineCounter2.class
|   |   |   |   |--LineCounter.class
|--lib
|   |--commons-io.jar


需求4: 刪除一個非空的資料夾。 
 
 
作業:  剪下一個非空目錄。


 
 */




public class Demo10 {

public static void main(String[] args) {
/* File dir = new File("F:\\1208project\\day22");
listFiles3(dir,"|--");*/

File dir = new File("F:\\aa");
deleteDir(dir);
}


//刪除了一個非空的目錄
public static void deleteDir(File dir){ // bb
File[] files = dir.listFiles(); //列出了所有的子檔案
for(File file : files){
if(file.isFile()){
file.delete();
}else if(file.isDirectory()){
deleteDir(file);
}
}
dir.delete();
}




public static void listFiles3(File dir,String space){ //space 儲存的是空格
File[] files = dir.listFiles(); //列出所有 的子檔案
for(File file : files){
if(file.isFile()){
System.out.println(space+file.getName());
}else if(file.isDirectory()){
System.out.println(space+file.getName());
listFiles3(file,"|   "+space);
}

}


}



//列出一個資料夾的子孫檔案與目錄。
public static void listFiles2(File dir,String space){ //space 儲存的是空格
File[] files = dir.listFiles(); //列出所有 的子檔案
for(File file : files){
if(file.isFile()){
System.out.println(space+file.getName());
}else if(file.isDirectory()){
System.out.println(space+file.getName());
listFiles2(file,"  "+space);
}

}


}




//列出一個資料夾的子孫檔案與目錄。
public static void listFiles1(File dir){
File[] files = dir.listFiles(); //列出所有 的子檔案
for(File file : files){
if(file.isFile()){
System.out.println("檔名:"+file.getName());
}else if(file.isDirectory()){
System.out.println("資料夾:"+file.getName());
listFiles1(file);
}

}


}

}