1、IO概述 java
IO是InputOutput的縮寫,IO流即輸入輸出流。
一、IO流:
1) 用來處理設備之間的數據傳輸。
2) Java 對數據的操做是經過IO流操做的。
3) Java用於操做流的對象都在IO包中。
4) 流只能操做數據。
5) 流按操做數據分兩種:字節流、字符流;流按流向分爲:輸入流、輸出流。
Note:字符流融合了編碼表,用於處理文字。字節流用於處理圖片、文字,通用的是字節流。程序從輸入流中讀取數據,向輸出流中寫入數據。在數據類型上,read()方法在做提高,write()方法在作強轉,以保證原數據的不變化。
二、IO 流經常使用類:
字節流的抽象基類:InputStream、OutputStream
字符流的抽象基類:Reader、Writer
字符流:FileWriter、FileReader (字符流緩衝區:BufferedWriter、BufferedReader)
字節流:FileOutputStream、FileInputStream (字節流緩衝區:BufferedOutputStream、BufferedInputStream)
Note:由這四類派生出來的子類名稱都是以其父類名做爲子類名的後綴。
eg:InputStream 的子類 FileInputStream Reader 的子類 FileReader linux
2、字符流
字符流是字節流根據指定編碼表編碼而獲得的,因此字符流是在字節流以後出現的。
字符流有如下特色:
一、字符流中的對象融合了編碼表。默認的編碼,即當前系統的編碼。
二、字符流只用於處理文字數據,而字節流能夠處理媒體數據。
Writer:寫入字符流的抽象類。
子類必須實現的方法僅有 writer()、flush()、close(),多數子類將重寫方法,以提供更高的效率和其餘功能。IO流是用於操做數據的,而數據的最多見體現形式是文件。查看API,找到一個專門用於操做文件的Writer子類:FileWriter。
一、字符流的讀寫
a、字符流寫入
步驟:
1) 建立文件。建立一個 FileWriter 對象,該對象一初始化就必需要明確被操做的文件。並且該文件會被建立到指定的目錄下。若是該目錄下已有同名文件,已有文件將被覆蓋。明確數據要存放的目的地(文件)。
eg:FileWriter fw=new FileWriter(「demo.txt」);
2) 調用 writer 方法,將字符串寫入(內存)流中。
eg:fw.writer(「abcfgggg」);
3) 刷新流對象中的緩衝區數據。將數據刷新到目的地(文件) 。
eg:fw .flush();
4) 關閉流資源(必須有的步驟)。但關閉以前會刷新一次內部緩衝區中的數據,將數據刷新到目的地(文件)。
eg:fw.close();
flush() 與 close() 的區別:
flush() 刷新後,流一直存在,能夠繼續寫入數據。
close() 刷新後會將流關閉,不能再繼續寫入數據。關閉資源須要單獨作 try 處理。
Note:
1) 其實java自身不能寫入數據,而是調用系統內部方式完成數據的書寫,使用系統資源後,必定要關閉資源。
2) 文件的數據的續寫是經過構造函數 FileWriter(Strings,boolean append),在建立對象時,傳遞一個true參數,表明不覆蓋已有的文件。並在已有文件的末尾處進行數據續寫。(windows系統中的文件內換行用\r\n兩個轉義字符表示,在linux系統中只用\n表示換行)。
3) 因爲在建立對象時,須要指定建立文件位置,若是指定的位置不存在,就會發生IOException異常,因此在整個步驟中,須要對IO異常進行try處理。
示例以下: windows
import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class FileWriterDemo { public static void main(String[] args) { // FileWriter(File file) 建立一個file關聯的字符流對象,file對象隨之建立 Writer file = null; try { file = new FileWriter("fileWriter.txt"); // 調用write方法,將字符串寫入字符流中 file.write("fileDemo"); // 刷新字符流中的緩衝,將數據刷新到目的地文件中 file.flush(); // flush刷新後流資源還可使用,close關閉以後流資源不能訪問 } catch (IOException e) { throw new RuntimeException("文件寫入失敗"); } finally { // 關閉以前判空操做提升效率 if (file != null) { try { file.close(); } catch (IOException e) { throw new RuntimeException("文件關閉失敗"); } } } } }b、字符流讀取
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class FileReaderDemo { public static void main(String[] args) { readerMethod_1(); readerMethod_2(); } public static void readerMethod_2() { FileReader fr = null; try { fr = new FileReader("FileWriterDemo.java"); // 定義一個字符數組用於存儲讀到的字符 // read(char[] ch)返貨的是讀到的字符個數 char[] buf = new char[1024]; int num = 0; // int read(char[] buf) 返回本次讀取到的字符個數 while ((num = fr.read(buf)) != -1) { System.out.print(new String(buf, 0, num)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fr != null) fr.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void readerMethod_1() { FileReader fr = null; try { // 建立一個文件讀取流對象,和指定文件名相關聯 // 要保證該文件是存在的,不然會報FileNoFoundException fr = new FileReader("FileWriterDemo.java"); int ch = 0; // read()一次讀取一個字符 while ((ch = fr.read()) != -1) { System.out.print((char) ch); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fr != null) fr.close(); } catch (IOException e) { e.printStackTrace(); } } } }當咱們讀取文件的時候,上述示例中的第二種方法是先建立了一個字符數組用於存儲讀取到的字符,而後利用read(buf)方法一次讀取多個字符並返回字符個數,這樣一來就比以前的read()方法,每次只讀取一個字符來得要快,其中的字符數組buf就能夠稱爲字符緩衝區。而Java中也提供了字符緩衝區對象。
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyTextByBuf { public static void main(String[] args) { // 定義文件讀取流、輸出流緩衝區 BufferedReader br = null; BufferedWriter bw = null; try { // 將緩衝區關聯文件 br = new BufferedReader(new FileReader("buf.txt")); bw = new BufferedWriter(new FileWriter("copyofbuf.txt")); // buf記錄緩衝區讀取到的字符數據 String buf = null; while ((buf = br.readLine()) != null) { bw.write(buf);// 向緩衝區中寫入數據 bw.newLine();// 換行 bw.flush();// 刷新緩衝區中的數據到目的文件中去 } } catch (IOException e) { throw new RuntimeException("文件操做失敗"); } finally {// 最後關閉資源 if (bw != null) { try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } } }LineNumberReader
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; public class LineNumberReaderDemo { public static void main(String[] args) { // 定義字符讀取流 FileReader fr = null; LineNumberReader lnb = null; try { fr = new FileReader("FileWriterDemo.java"); // 讓LineNumberReader關聯一個存在的字符讀取流 lnb = new LineNumberReader(fr); String line = null; // 設置讀取初始行號爲100 lnb.setLineNumber(100); while ((line = lnb.readLine()) != null) { System.out.println(lnb.getLineNumber() + " " + line); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally {// 關閉資源 if (lnb != null) { try { lnb.close(); } catch (IOException e) { e.printStackTrace(); } } if (fr != null) { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } } }3、字節流
示例以下: 數組
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class OutputStreamDemo { public static void main(String[] args) { // fileOutputStream(); // fileInputStream_1(); // fileInputStream_2(); fileInputStream_3(); } // 逐個字節讀取 public static void fileInputStream_1() { FileInputStream fis = null; try { fis = new FileInputStream("fos.txt"); int ch = 0; while ((ch = fis.read()) != -1) { System.out.print((char) ch); } } catch (IOException e) { System.out.println(e.getMessage()); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } } } // 藉助緩衝數組buf,一次讀取多個字節的形式完成文件讀取操做 public static void fileInputStream_2() { FileInputStream fis = null; try { fis = new FileInputStream("fos.txt"); byte[] buf = new byte[1024]; int len = 0; while ((len = fis.read(buf)) != -1) { System.out.println(new String(buf, 0, len)); } } catch (IOException e) { System.out.println(e.getMessage()); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } } } // 藉助特有方法avaliable()返回的文件大小創建一個字節數組,在完成讀取操做 public static void fileInputStream_3() { FileInputStream fis = null; try { fis = new FileInputStream("fos.txt"); // 獲取待讀取文件的大小 int numOfChar = fis.available(); // 建立一個剛恰好的緩衝區 byte[] buf = new byte[numOfChar]; int len = 0; while ((len = fis.read(buf)) != -1) { System.out.println(new String(buf, 0, len)); } } catch (IOException e) { System.out.println(e.getMessage()); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } } } // 字節寫入操做演示 public static void fileOutputStream() { FileOutputStream fos = null; try { fos = new FileOutputStream("fos.txt"); fos.write("abcdef".getBytes()); } catch (IOException e) { System.out.println(e.getMessage()); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } } } }二、字節流緩衝區
/* 自定義字節流讀取緩衝區 思路: 一、定義一個固定長度的數組 二、定義一個指針和計數器用於讀取數組長度,和計數數組元素是否取完爲0 三、每次將字節數據存入元素要先將數組中的元素取完 */ import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; class MyBufferedInputStream { private InputStream in; private byte[] by = new byte[1024]; private int count = 0, pos = 0; MyBufferedInputStream(InputStream in) { this.in = in; } // 自定義讀方法,一次讀一個字節 public int myRead() throws IOException { // 經過in對象讀取硬盤上數據,並存儲by中。 // 存儲在數組中的數據被讀取完,再經過in對象從硬盤上讀取數據 if (count == 0) { count = in.read(by); if (count < 0)// 文件數據所有被讀取出來了 return -1; pos = 0;// 初始化指針 byte b = by[pos]; count--;// 每被讀一個字節,表示數組中的字節數少一個 pos++;// 指針加1 return b & 255;// 返回的byte類型提高爲int類型,字節數增長,且高24位被補1,原字節數據改變。 // 經過與上255,主動將byte類型提高爲int類型,將高24位補0,原字節數據不變。 // 而在輸出字節流寫入數據時,只寫該int類型數據的最低8位。 } else if (count > 0)// 若是數組中的數據沒被讀取完,則繼續讀取 { byte b = by[pos]; count--; pos++; return b & 0xff; } return -1; } // 自定義關閉資源方法 public void close() throws IOException { in.close(); } } // 測試自定義輸入字節流緩衝區 public class MyBufferedCopyMp3 { public static void main(String[] args) { // 利用字節流的緩衝區進行復制 copy(); } // 使用字節流的緩衝區進行復制 public static void copy() { BufferedOutputStream bout = null; MyBufferedInputStream bin = null; try { // 關聯複製文件輸入流對象到緩衝區 bin = new MyBufferedInputStream(new FileInputStream( "E:\\BaiduMusic\\Songs\\My Love - Westlife.mp3")); // 指定文件粘貼位置的輸出流對象到緩衝區 bout = new BufferedOutputStream(new FileOutputStream( "My Love - Westlife.mp3")); int by = 0; while ((by = bin.myRead()) != -1) { bout.write(by);// 將緩衝區中的數據寫入指定文件中 } } catch (IOException e) { throw new RuntimeException("MP3複製失敗"); } finally { try { if (bin != null) bin.close();// 關閉輸入字節流 } catch (IOException e) { throw new RuntimeException("讀取字節流關閉失敗"); } try { if (bout != null) bout.close();// 關閉輸出字節流 } catch (IOException e) { throw new RuntimeException("寫入字節流關閉失敗"); } } } }三、轉換流
示例以下: 網絡
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintStream; public class ReaderInAndWriterOut { public static void main(String[] args) throws IOException { InputStreamMethod(); changeMethod(); } public static void changeMethod() throws IOException { // 改變標準輸入輸出流 System.setIn(new FileInputStream("FileWriterDemo.java")); System.setOut(new PrintStream("char.txt")); // 獲取鍵盤錄入對象 InputStream in = System.in; // 將字節流轉換成字符流對象使用轉換流InputStreamReader InputStreamReader isr = new InputStreamReader(in); // 爲提升效率,將字符串進行緩衝區技術的操做使用BufferedReader BufferedReader br = new BufferedReader(isr); // 簡化書寫以下: BufferedReader bufferReader = new BufferedReader(new InputStreamReader( System.in)); BufferedWriter bufferWriter = new BufferedWriter( new OutputStreamWriter(System.out)); // 獲取控制檯輸出 對象 OutputStream out = System.out; OutputStreamWriter osw = new OutputStreamWriter(out); BufferedWriter bw = new BufferedWriter(osw); String line = null; while ((line = br.readLine()) != null) { if ("over".equals(line)) { break; } // System.out.println(line.toUpperCase()); bw.write(line.toUpperCase()); bw.newLine(); bw.flush(); } br.close(); } // 自定義鍵盤錄入方法 public static void InputStreamMethod() throws IOException { InputStream in = System.in; StringBuilder sb = new StringBuilder(); int ch = 0; while (true) { ch = in.read(); if (ch == '\r') { continue; } if (ch == '\n') { String s = sb.toString(); if (s.equals("over")) { break; } System.out.println(s.toUpperCase()); // 將緩衝區清空 sb.delete(0, sb.length()); } else { sb.append((char) ch); } } } }五、流操做規律
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyPic { public static void main(String[] args) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream( "C:\\Users\\caven\\Desktop\\HeiMa\\IMG_ME.jpg"); fos = new FileOutputStream("ME1.jpg"); byte[] buf = new byte[1024]; int len = 0; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } } catch (IOException e) { System.out.println(e.getMessage()); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } if (fos != null) { try { fos.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } } } }4、File類
import java.io.File; import java.io.IOException; /* * File類:將文件或者文件夾封裝成對象 * File常見方法演示: */ public class FileDetials { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub // fileConstructMethod(); // method_1(); // method_2(); // method_3(); method_4(); } public static void method_4() throws IOException { File f = new File("abc\\file.txt"); System.out.println("createNewFile::" + f.createNewFile()); System.out.println("path::" + f.getPath()); System.out.println("AbsolutePath::" + f.getAbsolutePath()); System.out.println("Parent::" + f.getParent()); System.out.println("Modified::" + f.lastModified()); System.out.println("length::" + f.length()); } public static void method_3() throws IOException { File f = new File("file.txt"); // 判斷文件對象是不是文件或者文件目錄以前,必須先判斷文件對象是否存在exists() // f.createNewFile(); // f.delete(); // f.mkdir(); System.out.println("isAbsolute::" + f.isAbsolute()); System.out.println("isHidden::" + f.isHidden()); System.out.println("file::" + f.isFile()); System.out.println("dir::" + f.isDirectory()); } public static void method_2() throws IOException { File f = new File("FileWriterDemo.java"); // System.out.println("canExecute::" + f.canExecute()); System.out.println("exsits::" + f.exists()); } public static void method_1() throws IOException { File f = new File("file.txt"); // 虛擬機退出時刪除文件 f.deleteOnExit(); boolean flag1 = f.delete(); System.out.println("delete::" + flag1); boolean flag = f.createNewFile(); System.out.println("createNewFile::" + flag); File dir = new File("abc\\edf"); System.out.println("mkdir::" + dir.mkdirs()); } // 建立File對象 public static void fileConstructMethod() { // 經過將給定路徑名字符串轉換爲抽象路徑名來建立一個新 File 實例。 File f = new File("file.txt"); // 建立指定父目錄下的文件對象 // File.separator跨平臺的文件分割符 File fileUnderParent = new File("D:" + File.separator + "JDoc", "file.txt"); System.out.println(f); System.out.println(fileUnderParent); } }5、Properties類
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.util.Properties; import java.util.Set; public class PropertiesDemo { public static void main(String[] args) throws IOException { // setAndGet(); // info2Map(); loadDemo(); } // 加載設置文件中的信息並修改打印在控制檯 public static void loadDemo() throws IOException { Properties prop = new Properties(); FileInputStream fis = new FileInputStream("info.txt"); prop.load(fis); // System.out.println(prop); FileOutputStream fos = new FileOutputStream("info.txt"); prop.store(fos, "ok"); prop.setProperty("lisi", "38"); prop.list(System.out); } /* * 需求:將info.txt中的鍵值對數據存入到集合中 一、用一個流對象與文件info.txt關聯 二、讀取一行數據,用「=」進行切割 * 三、等號左邊爲鍵,右邊爲值,存入到Properties中 */ public static void info2Map() throws IOException { BufferedReader br = new BufferedReader(new FileReader("info.txt")); String line = null; Properties prop = new Properties(); while ((line = br.readLine()) != null) { String[] datas = line.split("="); // prop.put(datas[0],datas[1]); prop.setProperty(datas[0], datas[1]); // System.out.println(line); } br.close(); System.out.println(prop); } // 設置和獲取元素 public static void setAndGet() { Properties prop = new Properties(); prop.put("zhangsan", "12"); prop.put("nihao", "33"); System.out.println(prop); String age = prop.getProperty("nihao"); System.out.println("age::" + age); Set<String> names = prop.stringPropertyNames(); System.out.println(names); for (String name : names) { System.out.println(name + ".." + prop.getProperty(name)); } } }5、其餘IO類
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; /* * 打印流: */ public class OtherClass { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PrintWriter pr = new PrintWriter(new BufferedWriter(new FileWriter( "a.txt")), true); String line = null; while ((line = br.readLine()) != null) { if ("over".equals(line)) { break; } pr.println(line); // pr.flush(); } pr.close(); br.close(); } }三、序列流
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.SequenceInputStream; import java.util.Enumeration; import java.util.Vector; /* * 文件合併 * SequenceInputStream * 一、SequenceInputStream(Enumeration en) * 二、SequenceInputStream(FileInputStream file1,FileInputStream file2) * */ public class SequenceDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Vector<FileInputStream> v = new Vector<FileInputStream>(); v.add(new FileInputStream("1.txt")); v.add(new FileInputStream("2.txt")); v.add(new FileInputStream("3.txt")); Enumeration<FileInputStream> en = v.elements(); SequenceInputStream sis = new SequenceInputStream(en); FileOutputStream fos = new FileOutputStream("4.txt"); byte[] buf = new byte[1024]; int len = 0; while ((len = sis.read(buf)) != -1) { fos.write(buf, 0, len); } sis.close(); fos.close(); } }四、管道流
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; //建立Peason類,實現Serializable接口 class Person implements Serializable { private static final long serialVersionUID = -4461523780114351798L; private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public Person(String name, int age) { super(); this.name = name; this.age = age; } public Person() { super(); } } public class ObjectStreamDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { writeObject(); readObject(); } // 讀取指定文件中的對象,也稱反序列化 public static void readObject() throws FileNotFoundException, IOException, ClassNotFoundException { File file = new File("object.txt"); if (!file.exists()) { return; } ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); Person p = (Person) ois.readObject(); System.out.println(p); ois.close(); } // 將指定對象序列化到指定文件中 public static void writeObject() throws IOException, FileNotFoundException { File file = new File("object.txt"); if (!file.exists()) { file.createNewFile(); } ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream( file)); oos.writeObject(new Person("zhangsan", 313)); oos.close(); } }
六、字節數組的流:
ByteArrayInputStream和ByteArrayOutputStream
這個對象並無調用底層資源,因此不用關閉流資源,即便關閉後,仍可調用。 內部包含緩衝區,至關於之內存做爲流操做源和目的,不會產生任何IO異常。對象中封裝了數組,其實就是用流的思想操做數組。
構造函數:
ByteArrayInputStream:在構造函數的時候,須要接受數據源,並且數據源是一個字節數據。
ByteArrayOutputStream:在構造函數的時候,不用定義數據目的,由於該對象中已經在內部封裝了可變長度的字節數組,這就是數據的目的地。
特有方法:
ByteArrayOutputStream中:
writeTo(OutputStream out); //將此 byte數組輸出流的所有內容寫入到指定的輸出流參數中,這與使用out.write(buf, 0, count)調用該輸出流的 write方法效果同樣。由於這個方法用到了字節輸出流,須要拋IO異常,也是字節數組流中惟一須要拋異常的方法。
int size(); //當前緩衝區的大小
String toString(); //使用平臺默認的字符集,經過解碼字節將緩衝區內容轉換爲字符串。
示例以下: 閉包
import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; public class ByteArrayStreamDemo { @SuppressWarnings({ "unused", "resource" }) public static void main(String[] args) throws IOException { // TODO Auto-generated method stub // 定義一個字節讀取流---數據源 ByteArrayInputStream bais = new ByteArrayInputStream( "ABCDEF".getBytes()); BufferedInputStream bufIn = new BufferedInputStream( new FileInputStream("FileWriterDemo.java")); // 字節寫入流---目的 ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len = 0; while ((len = bufIn.read()) != -1) { baos.write(len); } System.out.println(baos.size()); System.out.println(baos.toString()); } }七、字符編碼
UTF-8編碼格式:
一個字節:0開頭
兩個字節:字節一 ---> 110 位數:10 ~ 6
字節二 ---> 10 位數:5 ~ 0
三個字節:字節一 ---> 110 位數:15 ~ 12
字節二 ---> 10 位數:11 ~ 6
字節三 ---> 10 位數:5 ~ 0 app
轉換流的編碼應用:
能夠將字符以指定編碼格式存儲。能夠對文本數據指定編碼格式來解讀。指定編碼表的動做由構造函數完成。
編碼和解碼
1) 編碼:字符串變成字節數組
默認字符集: String ---> byte[] :srt.getBytes()
指定字符集:String ---> byte[] :srt.getBytes(charsetName)
2) 解碼:字節數組變成字符串
默認字符集: byte[] ---> String :new String(byte[])
指定字符集: byte[] ---> String :newString(byte[],charsetName)
對於編碼和解碼的字符集轉換注意事項
1) 若是編碼失敗,解碼就沒意義了。
2) 若是編碼成功,解碼出來的是亂碼,,則需對亂碼經過再次編碼(用解錯碼的編碼表),而後再經過正確的編碼表解碼。針對於IOS8859-1是通用的。
3) 若是用的是GBK編碼,UTF-8解碼,此時經過再次編碼後解碼的方式,就不能成功了,由於UTF-8也支持中文,在UTF-8解的時候,會將對應的字節數改變,因此不會成功。
如使用了錯誤的解碼錶: ide
4) 特別注意:對於中文的」聯通「,這兩個字比較特別,它的二進制位正好是和在UTF-8中兩個字節打頭的相同,因此在文本文件中,若是單獨寫「聯通」或者和知足UTF-8編碼格式的字符一塊兒保存時,記事本就會用UTF-8來進行解碼動做,這樣顯示的就會是亂碼。 函數
以上所述僅表明我的見解,若有出入請諒解。