標籤:多線程 位元組/字元緩衝流 記憶體操作流/標準輸入輸出資料流 合并流/列印流/資料流/屬性集合類 序列化/還原序列化流
一、電腦在Eclipse中儲存中文方式
(1)平台預設編碼集:GBK,一個中文對應兩個位元組。
(2)第一個位元組:一定是負數;第二個位元組:一般是負數,可能也會是正數,不影響結果。
(3)例如:
public class Demo { public static void main(String[] args) { //定義一個字串 String str = "大腦袋" ; //轉成位元組數組 byte[] bys = str.getBytes() ; System.out.println(Arrays.toString(bys)); }}
結果:
二、解碼/編碼
1、編碼和解碼時前後編碼格式必須一致。
2、編碼
(1)轉換過程:字串→位元組→位元據
(2)編碼方法:
A、public byte[] getBytes() :平台預設編碼集編碼(預設的是Gbk)。
B、public byte[] getBytes(Charset charset) ;指定格式編碼。
3、解碼
(1)轉換過程:位元據→十進位資料→位元組→字串
(2)解碼方法:
A、public String(byte[] bytes)使用平台預設編碼集解碼(gbk)。
B、public String(byte[] bytes,Charset charset):用指定的編碼格式解碼。
三、位元組緩衝流(高效位元組流)
1、位元組緩衝輸入資料流BufferedInputStream
(1)構造方法
A、public BufferedInputStream(InputStream in):預設緩衝區大小構造緩衝輸入資料流對象。
B、public BufferedInputStream(InputStream in,int size):指定緩衝區大小構造緩衝輸入資料流對象。
(2)讀取方式
A、public int read()一次讀取一個位元組。
B、public int read(byte[] b,int off,int len)一次讀取位元組數組的一部分。
(3)例如一次讀取一個位元組數組:
public class BufferedInputStreamDemo { public static void main(String[] args) throws FileNotFoundException,IOException{ //建立字元緩衝輸入資料流對象 BufferedInputStream bis=new BufferedInputStream( new FileInputStream("a.txt")); //一次讀取一個位元組數組 byte[] bys=new byte[1024]; int len=0; while((len=bis.read(bys))!=-1) { //建立一個String對象,將讀取到的位元組數群組轉換為String類型輸出 System.out.println(new String(bys,0,len)); } //關閉流,釋放資源 bis.close(); }}
2、字元緩衝輸出資料流
(1)構造方式
A、public BufferedOutputStream(OutputStream out)採用預設緩衝區大小構造一個位元組緩衝輸出資料流對象。
B、public BufferedOutputStream(OutputStream out,int size)指定size緩衝區大小構造緩衝輸出資料流對象。
(2)寫資料方式
A、public int write(int by)一次寫一個位元組。
B、public int read(byte[] b,int off,int len)一次寫位元組數組的一部分。
(3)重新整理功能:void flush() 重新整理緩衝區的流。
(4)例如一次寫位元組數組的一部分:
public class BufferedOutputStreamDemo { public static void main(String[] args) throws FileNotFoundException,IOException{ //建立字元緩衝輸出資料流對象 BufferedOutputStream bos=new BufferedOutputStream( new FileOutputStream("a.txt")); //一次寫位元組數組的一部分 bos.write("大腦袋".getBytes()); //關閉流,釋放資源 bos.close(); }}
3、字元緩衝流複製檔案(以一次複製一個位元組數組為例)
public class BufferedCopy { public static void main(String[] args) throws Exception{ //封裝 BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt")); BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("b.txt")); //一次複製一個位元組數組 byte[] bys=new byte[1024]; int len=0; while((len=bis.read(bys))!=-1) {//讀取資料 //寫資料 bos.write(bys,0,len); //重新整理 bos.flush(); } //關閉資源 bos.close(); bis.close(); }}
5、(面試題)位元組緩衝流的構造方法為什麼不能直接傳遞路徑/檔案?
解:緩衝流只是在底層內部提供一個緩衝區的數組,底層實現檔案的複製/讀取/寫入這些操作都依賴於基本流對象。
6、常見異常:IllegalArgumentException指定緩衝區大小越界異常。
四、字元流(解決中文亂碼問題)
1、字元輸入資料流Reader
(1)抽象類別,建立對象時使用其子類。
(2)子類:
A、字元轉換輸入流:InputStreamReader
B、便捷類:FileReader
(3)字元轉換輸入流構造方法
A、public InputStreamReader(InputStream in) :預設編碼方式構造字元轉換輸入流。
B、public InputStreamReader(InputStream in,Charset cs)指定編碼方式構造字元轉換輸入流。
(4)字元輸入資料流讀取資料方式
A、int read(char[] chs)一次讀取一個字元數組。
B、int read()一次讀取單個字元。
3、字元輸出資料流Writer
(1)抽象類別,建立對象時使用其子類。
(2)子類:
A、字元轉換輸出流:OutputStreamWriter
B、便捷類:FileWriter
(3)字元轉換輸入流構造方法
A、public OutputStreamWriter(OutputStream out):使用預設的編碼格式構造一個字元轉換輸出流對象。
B、public OutputStreamWriter(OutputStream out, Charset cs):使用指定編碼格式構造一個字元轉換輸出流對象。
(4)字元輸出資料流寫資料方式
A、public void write(int c)一次寫單個字元 。
B、public void write(char[] cbuf)一次寫字元數組。
C、public abstract void write(char[] cbuf, int off, int len)一次寫字元數組的一部分。
D、public void write(String str)一次寫一個字串。
E、public void write(String str,int off, int len)一次寫字串的一部分。
4、(面試題)flush和close方法的區別:
(1)close關閉該流,關閉該流對象以及和它關聯的資源檔,關閉之後,不能再對流對象進行操作了,否則會有異常。
(2)flush重新整理該流,為了防止一些檔案(圖片檔案/音頻檔案)缺失或者沒有載入到流對象中。重新整理了該流,還是可以流對象進行操作。
5、採用字元流複製檔案(一次複製一個字元數組)
public class Copy { public static void main(String[] args) throws Exception{ //封裝 FileReader fr=new FileReader("e:\\BR蘇蘇不酥\\大腦袋.txt"); FileWriter fw=new FileWriter("e:\\BR蘇蘇不酥\\Bighead.txt"); //一次複製一個字元數組 char[] chs=new char[1024]; int len=0; while((len=fr.read(chs))!=0) { fw.write(chs,0,len); //重新整理流 fw.flush(); } //關閉資源 fw.close(); fr.close(); }}
五、字元緩衝流(更高效)
1、字元緩衝輸入資料流BufferedReader
(1)構造方法
A、public BufferedReader(Reader in)使用預設大小輸入緩衝區建立一個緩衝字元輸入資料流。
B、public BufferedReader(Reader in, int sz)使用指定大小輸入緩衝區建立一個緩衝字元輸入資料流。
(2)特有功能:public String readLine()一次讀取一行。
2、字元緩衝輸出資料流BufferedWrier
(1)文本寫入字元輸出資料流,緩衝各個字元,從而提供單個字元、數組和字串的高效寫入。
(2)構造方法
A、public BufferedWriter(Writer out) 預設緩衝區大小構造字元緩衝輸出資料流對象。
B、public BufferedWriter(Writer out,int size):指定緩衝區大小構造字元緩衝輸出資料流對象。
(3)特有功能:public void newLine()寫入一個行的分隔字元號(換行)。
3、使用字元緩衝流複製檔案(以一次複製一行為例)
public class CopyTeyou { public static void main(String[] args) throws Exception{ //封裝檔案 BufferedReader br=new BufferedReader(new FileReader("e:\\BR蘇蘇不酥\\大腦袋.txt")); BufferedWriter bw=new BufferedWriter(new FileWriter("e:\\BR蘇蘇不酥\\Bighead.txt")); //一次複製一行 String line=null; while((line=br.readLine())!=null) { bw.write(line); //寫入一個行的分隔字元號 bw.newLine(); //重新整理流 bw.flush(); } //關閉流,釋放資源 br.close(); bw.close(); }}
4、將集合中的內容儲存到文字檔中
public class ArrayListToTxt { public static void main(String[] args) throws Exception{ //建立集合對象 ArrayList<String> al=new ArrayList<String>(); //添加元素 al.add("Bighead"); al.add("0829"); //建立字元緩衝輸出資料流對象 BufferedWriter bw=new BufferedWriter(new FileWriter("e:\\BR蘇蘇不酥\\Bighead.txt")); //遍曆集合 for(String s:al) { //將遍曆到的元素寫入文字檔中 bw.write(s); bw.newLine(); //重新整理 bw.flush(); } //釋放資源 bw.close(); }}
5、將文字檔中的內容添加到集合中
public class TxtToArrayList { public static void main(String[] args) throws Exception{ //建立字元緩衝輸入資料流對象 BufferedReader br=new BufferedReader (new FileReader ("e:\\BR蘇蘇不酥\\Bighead.txt")); //建立集合對象 ArrayList<String> al=new ArrayList<String>(); //讀取文字檔中的內容,一次讀取一行 String line=null; while((line=br.readLine())!=null) { //將讀取到的內容添加集合中 al.add(line); } //遍曆集合,輸出元素 for(String s:al) { System.out.println(s); } }}
六、記憶體操作流
1、概述:適用於臨時隱藏檔。一個程式結束後,這些程式的變數會從記憶體消失記憶體操作流就是對馬上消失的這些資料進行讀取寫入。
2、記憶體操作輸入資料流byteArrayInputStream
構造方法:ByteArrayInputStream(byte[] buf)
3、記憶體操作輸出資料流byteArrayOutputStream
構造方法:ByteArrayOutputStream()
七、資料流
1、概述:針對Java基本類型的資料進行讀寫操作。
2、資料輸入流DataInputStream
3、資料輸出資料流DataOutputStream
八、列印流
1、概述:PrintWriter,列印流,屬於輸出資料流。
2、特點:
(1)只能寫資料(只能針對目的地檔案進行操作),不能讀資料(不能針對源檔案進行操作)。
(2)可以針對檔案直接進行操作。若一個類中的構造方法裡面有File對象或者String類型資料,則這個類可以對文字檔直接操作。
(3)自動重新整理功能:PrintWriter(OutputStream out/Writer out,boolean autoflush),第二個參數如果是true ,表示啟動自動重新整理功能。
(4)列印的方法print(XXX x)/println(XXX xx)
3、分類:
(1)字元列印流(針對文本進行操作PrintWriter)
(2)位元組列印流(printStream 和標準輸出資料流有關係 System.out;)
九、合并流
1、概述:SequenceInputStream 表示其他輸入資料流的邏輯串聯(合并流)。
2、構造方法 :
(1)public SequenceInputStream(InputStream s1, InputStream s2)
(2)public SequenceInputStream(Enumeration e)
十、標準輸入/輸出流
1、標準輸入資料流:InputStream in = System.in;
2、標準輸出資料流:PrintStream out = Syste.out;使用BufferedWriter 去封裝System.out。功能:public void println(String x)
3、鍵盤錄入
(1)Scanner(JDK5以後用)
(2)BufferedReader封裝字元轉換輸入流,封裝System.in(流方式鍵盤錄入,java的裝飾者模式)
十一、Serializable
1、概述:Serializable標記介面,沒有構造方法,沒有欄位,也沒有方法。
2、常見異常
(1)java.io.InvalidClassException:該類的序列版本號碼與從流中讀取的類描述符的版本號碼不匹配。
(2)java.io.NotSerializableException:當前類未實現序列化功能的異常。
3、解決需要多次序列化的問題:讓當前實作類別序列化功能的這個類產生一個固定ID,點擊程式中的×××警告線,即可產生固定ID。
4、某些屬性不想被序列化解決方案:transient 屬性類型 屬性
5、手動修改標記類的屬性/成員變數時,會改變序列化版本ID。
十二、序列化流/還原序列化流
1、序列化流ObjectOutputStream。
(1)序列化:將對象按照流的方式儲存到文字檔中或者在網路中傳輸,對象→流資料。
(2)構造方法:public ObjectOutputStream(OutputStream out)
(3)寫功能:public final void writeObject(Object obj)
2、還原序列化流ObjectInputStream。
(1)還原序列化:將文字檔中的流對象或者網路傳輸中的流對象還原成對象,流資料→對象。
(2)構造方法:public ObjectInputStream(InputStream in)
(2)讀功能:public final Object readObject()
3、使用序列化/還原序列化功能,自訂類需實現Serializable介面,並重寫toString()方法。自訂類實現標記介面,意味著成標記類。
十三、Properties
1、概述:Properties,表示了一個持久的屬性集(簡稱:屬性集合類) extends Hashtable<K,V> Map集合。可儲存在流中或從流中載入,屬性列表中每個鍵及其對應值都是一個字串。
2、無參構造:public Properties()
3、特有功能:
(1)public Object setProperty(String key, String value):給屬性列表中添加鍵和值,並且強制都使用String。
(2)public Set<String> stringPropertyNames():遍曆
(3)public String getProperty(String key)用指定的鍵在此屬性列表中搜尋屬性。
4、可儲存在流中或從流中載入,只能使用屬性集合類:
(1)public void store(Writer writer,String comments):把集合中的資料儲存文字檔中(屬性集合)。
(2)public void load(Reader reader):將文字檔中的資料載入到屬性集合中。
十四、多線程
1、基本概念
(1)單線程:程式的執行路徑只有一條。
(2)多線程:程式的執行路徑有多條。線程之間在搶佔CPU的執行權(搶佔資源),多線程的執行具有隨機性。
(3)進程:系統間進行獨立調配並且不可分割的獨立單元。線程依賴於進程存在。
(4)線程:進程的一個獨立單元。一個進程中有多個任務,把每個任務看成一個線程。
(5)synchronized:同步(同步鎖)。
2、Thread類(Java提供)
(1)實現多線程程式的步驟:
方式一:
A、將類聲明為 Thread 的子類;
B、該子類應重寫 Thread 類的 run 方法;
C、在主線程進行該自訂的線程類的對象的建立。
方式二:
A、自訂一個類,實現Runnable介面;
B、實現介面中的run方法,對耗時的代碼進行操作;
C、然後在主線程中建立該了對象,將該類對象做為一個資源類,建立Threadd類的對象,將剛才的資源類作為參數進行傳遞。
(2)常用方法:
A、public final void setName(String name):給線程命名。
B、public final String getName():擷取線程名稱。
C、public static Thread currentThread():返回當前正在執行的線程對象的引用。
(3)線程優先順序相關方法:
A、public final int getPriority():返回線程的優先順序。
B、public final void setPriority(int newPriority):更改線程的優先順序。
C、線程預設優先順序
A、public static final int MAX_PRIORITY 10 最大優先順序
B、public static final int MIN_PRIORITY 1 最小優先順序
C、public static final int NORM_PRIORITY 5 預設優先順序
(4)其他方法:
A、public final void setDaemon(boolean on):參數為true時,表示為守護線程。將該線程標記為守護線程或使用者線程。當正在啟動並執行線程都是守護線程時,JAVA 虛擬機器退出。(守護線程不會立即結束,它會執行一段時間在結束),
該方法必須在啟動線程前調用。
B、public final void join():等待該線程終止。interruputedException 中斷異常。
C、public static void sleep(long millis)線程睡眠,指定是時間毫秒值。
D、public final void stop():強迫線程停止執行,不會再執行了。(該方法已淘汰,但仍然可以使用)。
E、public static void yield():暫停當前正在執行的線程對象,並執行其他線程。
3、相關面試題
(1)JVM是多線程程式嗎?至少有幾條線程?
解:JVM,Java虛擬機器,識別main(主線程)。 jvm是多線程的,至少有2條線程。
(2)如何?多線程程式?
解:A、方法一:要實現多線程程式,需要開啟進程,開啟進程,需要建立系統資源,但是Java語言不能建立系統資源,只有C/C++可以建立系統資源, 利用c語言建立好的系統資源實現。
B、方法二:a、自訂一個類,實現Runnable介面;b、實現介面中的run方法,對耗時的代碼進行操作;c、然後在主線程中建立該了對象,將該類對象做為一個資源類,建立Threadd類的對象,將剛才的資源類作為參數進行傳遞。
(3)stop()與interrupt()區別:
stop():強迫線程停止執行,程式不會再執行了(此方法已淘汰,但仍可使用)。
interrupt():中斷線程,表示中斷線程的一種狀態。
(4)wait()與sleep()區別:
wait():wait()調用時,立即釋放鎖 (同步鎖/Lock鎖)。
sleep():線程睡眠,調用時不會釋放鎖。
Java基礎知識(九)