SCJP筆記_章六_字符串、I/O、格式化與解析

第六章 字符串、I/O、格式化與解析 html

 

 

6.1 String、StringBuilder和StringBufferjava

考試目標3.1 探討String、StringBuiler、StringBuffer類之間的區別。正則表達式

 

 

6.1.1 String類數組

 

字符串是不可變的對象,可是能夠改變引用。安全

因此對String的修改實際上是在堆中新建了一個對象,而後改變原來對象的引用。app

若是將String引用重定向到新的String,則舊的String可能丟失。ui

 

 

6.1.2 關於String和內存的重要事實spa

 

JVM留出一塊特殊的內存區域,稱爲「String常量池」。.net

當JVM發現新的String字面值時,就將它添加到String常量池中,供String對象引用。線程

String類是最終類——其方法不能被重寫。

 

 

6.1.3 String類的重要方法

 

public char charAt(int index)

該方法返回位於字符串指定索引處的字符。字符串索引值從0開始計算。

 

public String concat(String s)

該方法返回一個String,其值爲將傳遞給該方法的String追加到用於調用該方法的String的尾部。(也能夠用「+」)。

 

public boolean equalsIgnoreCase(String s)

判斷兩個字符串的相等性,忽略大小寫。

 

public int length()

返回字符串中字符的個數。

 

public String replace(char old,char new)

用新字符代替指定的字符。

 

public String substring(int begin),public String substring(int begin,int end)

返回字符串的一部分。

 

public String toLowerCase()

將字符串中的大寫字符轉換成小寫字符返回。

 

public String toString()

返回字符串的值。

 

public String toUpperCase()

將字符串中的小寫字符轉換成大寫字符返回。

 

public String trim()

刪除字符串先後部的空格。

 

 

6.1.4 StringBuffer類和StringBuilder類

 

StringBuffer的API與Java5中新增的StringBuilder的API相同,可是StringBuilder的方法並未針對線程安全進行同步。

StringBuilder的方法應該運行比StringBufferBuffer的方法更快。

 

 

6.1.5 StringBuffer類和StringBuilder類的重要方法

 

public synchronized StringBuffer append(String s)

public StringBuilder delete(int start,int end)

public StringBuilder insert(int offset,String s)

public synchronized StringBuffer reverse()      顛倒字符串中字符的順序。

public String toString()

 

 

6.2 文件導航和I/O

考試目標3.2 給定一種涉及導航文件系統、讀取文件或寫入文件的場景,利用以下來自於java.io的類(有時會組合它們)設計正確的解決方案:BufferedReader、BufferedWriter、File、FileReader、FileWriter、PrintWriter和Console。 

 

File 文件和目錄路徑名的抽象表示

createNewFile()

delete()                 刪除此抽象路徑名錶示的文件或目錄。若是此路徑名錶示一個目錄,則此目錄必須爲空才能刪除。

exists()

isDirectory()

isFile()

list()                      返回由此抽象路徑名所表示的目錄中的文件和目錄的名稱所組成字符串數組

mkdir()

renameTo()

Java代碼
  1. class testFile {    
  2.     public static void main(String[] args) {    
  3.         //在內存中創建file對象,文件名爲file.txt,   
  4.         //路徑的格式爲d:\\file.txt或者d:/file.txt,路徑必須爲實際存在的路徑    
  5.         File file = new File("d:/file.txt");     
  6.         Boolean flag = false;   
  7.         try {    
  8.             //在默認路徑創建file對象的文件,創建成功flag爲true   
  9.             //若是已有同名文件什麼都不作,flag返回false   
  10.             flag = file.createNewFile();     
  11.         } catch (IOException e) {   
  12.             e.printStackTrace();      
  13.         }   
  14.         System.out.println(flag);          
  15.     }   
  16. }   

 

 

Java代碼
  1. class testFile {   
  2.     public static void main(String[] args) {   
  3.         File file = new File("d:/");   
  4.         String[] lists = file.list();   
  5.         for (String list : lists) {   
  6.             System.out.println(list.toString());   
  7.         }   
  8.     }   
  9. }   
Java代碼
  1. class testFile {    
  2.     public static void main(String[] args) throws IOException {    
  3.         File file = new File("d:/test1"); // 新建一個目錄   
  4.         file.mkdir();   
  5.     }   
  6. }   

FileWriter

下面三個方法其實都是FIleWriter繼承其父類java.io.OutputStreamWriter的

close() 關閉IO流

flush()  刷新該流的緩衝。經過該方法,能夠保證你認爲你所寫數據的最後部分確實會從文件中取出。

write()

 

FileReader

read()

 

Java代碼
  1. public class TestFileWriter {   
  2.     public static void main(String[] args) throws IOException {   
  3.         String str = "It's better to burn out,\nthan fade away.";   
  4.         int size = str.length();   
  5.         File file = new File("file.txt");   
  6.         if (file.exists()) {   
  7.             FileWriter fw = new FileWriter(file);   
  8.             fw.write(str);   
  9.             fw.flush();   
  10.             fw.close();   
  11.             FileReader fr = new FileReader(file);   
  12.             char[] in = new char[size];   
  13.             fr.read(in);   
  14.             for (char c : in) {   
  15.                 System.out.print(c);   
  16.             }   
  17.         }   
  18.     }   
  19. }   

 

如上代碼,當把數據寫入文件時,咱們要手工地將行分隔符(\n)插入到數據中。當讀數據時,咱們將它放入一個字符數組中,必須事先聲明其大小,而後再用read()方法來讀這個數組。

因爲這些限制,咱們一般將高級I/O類與FileWriter或FileReader組合使用,如 BufferedWriter 和 BufferedReader 。  

 

PrintWriter 構造器的變元能夠是文件名(String類型),能夠是File對象,能夠是OutputStream對象,能夠是Writer對象。 

close()

flush()

format()

printf()

print()

println()

write()

 

 

Java代碼

  1. public class TestPrintWriter {   
  2.     public static void main(String[] args) throws IOException{   

 

 

  1.            
  2.         //m1:   
  3.         //File file = new File("file.txt");   
  4.         //FileWriter fw = new FileWriter(file);   
  5.         //PrintWriter pw = new PrintWriter(fw);   
  6.                
  7.         //m2:   
  8.         //File file = new File("file.txt");   
  9.         //PrintWriter pw = new PrintWriter(file);   
  10.            
  11.         //m3:   
  12.         PrintWriter pw = new PrintWriter("file.txt");   
  13.            
  14.         pw.println("It's better to burn out,");   
  15.         pw.write("than fade away.");   
  16.         pw.flush();   
  17.         pw.close();   
  18.        
  19.     }   
  20. }  

BufferedWriter 構造器的變元只能是Writer對象。

close()

flush()

newLine()

write()

 

BufferedReader

read()

readLine()

Java代碼
  1. public class TestBufferedWriter {   
  2.     public static void main(String[] args) throws IOException{   
  3.         File file = new File("file.txt");   
  4.         FileWriter fw = new FileWriter(file);   
  5.         BufferedWriter bw = new BufferedWriter(fw);   
  6.         bw.write("It's better to burn out,");   
  7.         bw.newLine();   
  8.         bw.write("than fade away.");   
  9.         bw.flush();   
  10.         bw.close();   
  11.            
  12.         FileReader fr = new FileReader(file);   
  13.         BufferedReader br = new BufferedReader(fr);   
  14.         System.out.println(br.readLine());   
  15.         System.out.println(br.readLine());   
  16.         br.close();   
  17.     }   
  18. }  

  

Console 操做控制檯的IO

Console對象的得到

Console c = System.console();

 

6.3 序列化

考試目標3.3 編寫代碼,利用來自於java.io的下列API序列化和/或反序列化對象:DataInputStream、

DataOutputStream、FileInputStream、FileOutputStream、ObjectInputStream、ObjectOutputStream以及Serializable。

 

對象的序列化是指把對象寫到一個輸出流中,對象的反序列化是指從一個輸入流中讀取一個對象。

只有實現了java.io.Serializable接口的類的對象才能被序列化或反序列化。

序列化不適用於靜態變量

 

 

6.4 日期、數字和貨幣

考試目標3.4 使用java.text包中的標準J2SE API,爲特定的地區正確地格式化或解析日期、數字和貨幣值。給定一個場景,若是但願使用默認的地區或特定的地區,肯定要採用的合適方法。描述java.util.Locale類的目的和用法。

 

6.4.1 處理日期、數字和貨幣

 

協同使用與日期和數字相關的類

 

Date類

java.util.Date類實質上就是個long型毫秒數,從1970年1月1日00:00:00到如今的毫秒數,一般Date對象被用做Calendar類和DateFormat類之間的橋樑。

public class TestDate {
	public static void main(String[] args){
		Date date = new Date();		//得到當前時間的Date對象
		System.out.println(date.toString());
		//結果相似:Wed Jul 29 12:02:02 CST 2009
		
		
		Date date2 = new Date(1000000);      //得到指定毫秒數的Date對象
		System.out.println(date2.getTime());
	}
}

  

 

Calendar類

java.util.Calendar類提供了大量方法,用以幫助轉換和操做日期或時間。

Calendar ca = Calendar.getInstance();
Calendar ca2 = Calendar.getInstance(Locale.CANADA_FRENCH);
Calendar ca3 = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));

  

DateFormat類

java.text.DateFormat類用於格式化日期。

public class TestDateFormat {

	public static void main(String[] args) {
		Date d1 = new Date();
		DateFormat[] dfa = new DateFormat[6];
		dfa[0] = DateFormat.getInstance();
		dfa[1] = DateFormat.getDateInstance();
		dfa[2] = DateFormat.getDateInstance(DateFormat.SHORT);
		dfa[3] = DateFormat.getDateInstance(DateFormat.MEDIUM);
		dfa[4] = DateFormat.getDateInstance(DateFormat.LONG);
		dfa[5] = DateFormat.getDateInstance(DateFormat.FULL);
		
		for(DateFormat df:dfa){
			System.out.println(df.format(d1));
		}		
	}
}

//運行結果:
//09-7-29 下午2:33
//2009-7-29
//09-7-29
//2009-7-29
//2009年7月29日
//2009年7月29日 星期三

 

NumberFormat類

java.text.NumberFormat類用於格式化全世界各個地區的數字和貨幣。

public class TestNumberFormat {
	public static void main(String[] args){
		float f1 = 123.4567f;
		Locale locFR = new Locale("fr");
		NumberFormat[] nfa = new NumberFormat[4];
		nfa[0] = NumberFormat.getInstance();
		nfa[1] = NumberFormat.getInstance(locFR);
		nfa[2] = NumberFormat.getCurrencyInstance();
		nfa[3] = NumberFormat.getCurrencyInstance(locFR);
		
		for(NumberFormat nf : nfa){
			System.out.println(nf.format(f1));
		}
	}
}
//運行結果:
//123.457
//123,457
//¥123.46
//123,46 ¤

 

Locale類

java.util.Locale類與DateFormat和NumberFormat結合,用於格式化特定地區的日期,數字和貨幣。

 Locale(String lang)

 Locale(String lang, String country)

 

6.5 解析、分解和格式化

考試目標3.5 編寫代碼,利用位於java.util包和java.util.regex包中的標準J2SE API,格式化或解析字符串或流。對於字符串,編寫利用Pattern類、Matcher類以及String.split方法的代碼。識別並使用正則表達式模式用於匹配,模式限於. * + ? \d \s \w []以及()。* + 和?的使用僅限於貪婪量詞,圓括號運算符只用做一種分組機制,不用於在匹配期間捕獲內容。對於流,編寫利用Formatter類、Scanner類以及PrintWriter.format()/printf()方法的代碼。識別並使用格式字符串中的格式化參數,限於%b、%c、%d、%f 以及 %s 。

 

6.5.1 查找指南

 

簡單查找

public static void main(String[] args) {
	Pattern p = Pattern.compile("ab");
	Matcher m = p.matcher("abaaaba");
	while(m.find()){
		System.out.print(m.start() + " ");
	}
}

 

使用元字符查找

\d  數字

\s  空格符

\w 字字符(字母、數字或下劃線)

[abc] 只查找字符abc

[a-f]  只查找字符abcdef

[a-fA-F]查找abcdef和ABCDEF

 

使用量詞查找(後綴)

*  0次或屢次匹配

?  0次或1次匹配

+ 1次或屢次匹配

^ 除了。。。

 

預約義的點

.  表示這裏能夠是任意字符

 

貪婪量詞

貪婪(greedy)和勉強(reluctant)的工做方式不一樣

貪婪是先整個吃掉,比對,不匹配,而後從右邊一個一個往出吐,再比對

勉強是從左邊一個一個吃,吃一個比對一次,不匹配,再吃一個再比對

見:http://blog.csdn.net/zidasine/archive/2008/11/05/3229848.aspx

 

字符與字符串發生衝突時

Stirng pattern = " \ \d ";

考試中還會出現\n 換行符

 

 

6.5.2 經過模式匹配定位數據

 

使用Scanner類執行查找

Scanner類:一個能夠使用正則表達式來分析基本類型和字符串的簡單文本掃描器

 

6.5.3 分解  

 

標記和定界符

標記(token)是實際的數據部分,定界符(delimiter)是將標記相互隔離開的表達式。

 

利用String.split()進行分解

public class SplitTest {

	public static void main(String[] args) {
		String source = "as f23 fa 313";
		String regex = "\\s";
		String[] tokens = source.split(regex);
		for(String token : tokens){
			System.out.println(">"+token+"<");
		}
	}
}
//result:
//>as<
//>f23<
//>fa<
//>313<

 

利用Scanner進行分解

Scanner類是執行分解操做的首選類

除了String.split()提供的基本分解能力外,Scanner類還提供:

  • 能夠將文件、流或字符串用做源來構造Scanner。默認由空格來作定界符,能夠用useDelimiter(Pattern pattern) 方法來指定定界符。
  • 分解操做在循環內執行,使得能夠隨時退出這一過程。
  • 能夠將標記自動轉換爲相應的基本類型。
boolean b2,b;
int i;
String s,hits = " ";
String source = "1 true 34 hi";

Scanner s1 = new Scanner(source);
Scanner s2 = new Scanner(source);
while(b = s1.hasNext()){
	s = s1.next();  
	hits+="s";
}
while(b = s2.hasNext()){
	if(s2.hasNextInt()){
		i = s2.nextInt();
		hits+="i";
	}else if(s2.hasNextBoolean()){
		b2 = s2.nextBoolean();
		hits+="b";
	}else{
		s2.next();
		hits+="s2";
	}
}
System.out.println("hits "+hits);

 

 

6.5.4 利用printf()和format()進行格式化

能夠參考java.util.Formatter API

System.out.printf("format string",argument(s));

 

"format string"格式字符串一般爲形如「%2$d + %1$d」,它的構造爲:

%[arg_index$][flags][width][.precision]conversion char

方括號的值是可選的,只有%和轉換字符是必須的。

 

arg_index

一個整數,後面跟一個$,表示這個位置輸出第幾個變元。

 

flags標誌(能夠同時用多個)

-   左對齊變元(默認右對齊)

+  讓變元包含符號(+或-)

0  用0填充變元

,   用特定於地區的分組分隔符(好比「123,456」中的逗號)

(   將負數包含在括號內

 

width

這個值指定要輸出的最少字符數。

 

precision

精度。指定了要在小數點後輸出的位數。前面有一個"."不要忘記。

 

conversion

將進行格式化的變元的類型

b  布爾型

c  字符型

d  整數型

f  浮點型

s  字符串

 

public class TestPrintf {
	public static void main(String[] args) {
		int i1 = -123;
		int i2 = 12345;
		float f = -322.23f;
		System.out.printf(">%d< \n",i1);//最簡
		System.out.printf(">%1$+15.2f< \n",f);//完整
		System.out.printf(">%1$(7d< \n", i1);
		System.out.printf(">%0,7d< \n", i2);
		System.out.format(">%+-7d< \n", i2);
		System.out.printf(">%2$b + %1$5d< \n", i1,false);
	}
}
//result:
//>-123< 
//>        -322.23< 
//>  (123)< 
//>012,345< 
//>+12345 < 
//>false +  -123<
相關文章
相關標籤/搜索