//1.获取环境变量
//2.获取系统属性
java -Dpencil color=green
Properties p = Properties();  // 得到所有属性值
p.list(System.out);
//3.String Tokenizer
// 能够同时识别, 和 |
StringTokenizer st = new StringTokenizer("Hello, World|of|Java", ", |");
while (st.hasMoreElements()) {
}
// 把分隔符视为token
StringTokenizer st = new StringTokenizer("Hello, World|of|Java", ", |",  true);
//4. StringBuffer(同步)和StringBuilder(非同步)
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append("World");
new StringBuffer(a).reverse();  // 反转字符串
//5. 数字
// 数字与对象之间互相转换 - Integer转int
Integer.intValue();
// 浮点数的舍入 
// 数字格式化
NumberFormat
// 整数 -> 二进制字符串
toBinaryString()或valueOf()
// 整数 -> 八进制字符串
toOctalString()
// 整数 -> 十六进制字符串
toHexString()
// 数字格式化为罗马数字
RomanNumberFormat()
// 随机数
Random r = new Random();
//6. 日期和时间
// 查看当前日期
Date today = new Date();
// 格式化默认区域日期输出
DateFormat df = Instance();
df.format(today);
// 格式化制定区域日期输出 
DateFormat df_cn = DateInstance(DateFormat.FULL, Locale.CHINA);
String now = df_cn.format(today);
// 按要求格式打印日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
sdf.format(today);
/
/ 设置具体日期
GregorianCalendar d1 = new GregorianCalendar(2009, 05, 06);  // 6月6日
GregorianCalendar d2 = new GregorianCalendar();  // 今天
Calendar d3 = Instance();  // 今天
d3.set(Calendar.YEAR, 1999);
d3.set(Calendar.MONTH, Calendar.APRIL);
d3.set(Calendar.DAY_OF_MONTH, 12);
// 字符串转日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date now = sdf.parse(String);
/
/ 日期加减
Date now = new Date();
long t = Time();
t += 700*24*60*60*1000;
Date then = new Date(t);
Calendar now = Instance();
now.add(Calendar.YEAR, -2);
// 计算日期间隔(转换成long来计算)
// 比较日期
Date类型,就使用equals(), before(), after()来计算
long类型,就使用==, <, >来计算
// 第几日
使用Calendar的get()方法
Calendar c = Instance();
<(Calendar.YEAR);
// 记录耗时
long start = System.currentTimeMillis();
long end = System.currentTimeMillis();
long elapsed = end - start;
System.nanoTime();  //毫秒
// 长整形
转换成秒
//7. 结构化数据
// 数组拷贝
System.arrayCopy(oldArray, 0, newArray, 0, oldArray.length);
// ArrayList
add(Object o)  // 在末尾添加给定元素
add(int i, Object o)  // 在指定位置插入给定元素
clear()  // 从集合中删除全部元素
Contains(Object o)  // 如果Vector包含给定元素,返回真值
get(int i)  // 返回指定位置的对象句柄
indexOf(Object o)  // 如果到给定对象,则返回其索引值;否则,返回-1
remove(Object o)  // 根据引用删除对象
remove(int i)  // 根据位置删除对象
toArray()  // 返回包含集合对象的数组
// Iterator
List list = new ArrayList();
Iterator it = list.iterator();
while (it.hasNext())
Object o = it.next();
// 链表
LinkedList list = new LinkedList();
ListIterator it = list.listIterator();
while (it.hasNext())
Object o = it.next();
// HashMap
HashMap<String, String> hm = new HashMap<String, String>();
<(key);  // 通过key得到value
hm.put("No1", "Hexinyu");
hm.put("No2", "Sean");
// 方法1: 获取全部键值
Iterator<String> it = hm.values().iterator();
while (it.hasNext()) {
String myKey = it.next();
String myValue = hm.get(myKey);
}
// 方法2: 获取全部键值 
for (String key : hm.keySet()) {
String myKey = key;
String myValue = hm.get(myKey);
}
// Preferences - 与系统相关的用户设置,类似名-值对
Preferences prefs = Preferences.userNodeForPackage(ArrayDemo.class);
String text = ("textFontName", "lucida-bright");
String display = ("displayFontName", "lucida-balckletter");
System.out.println(text);
System.out.println(display);
// 用户设置了新值,存储回去 
prefs.put("textFontName", "new-bright");
prefs.put("displayFontName", "new-balckletter");
// Properties - 类似名-值对,key和value之间,可以用"=",":"或空格分隔,用"#"和"!"注释
InputStream in = ClassLoader().getResourceAsStream("msconfig.properties");
Properties prop = new Properties();
prop.load(in);
in.close();
prop.setProperty(key, value);
// 排序
1. 数组:Arrays.sort(strings);
2. List:Collections.sort(list);
3. 自定义类:class SubComp implements Comparator
然后使用Arrays.sort(strings, new SubComp())
// 两个接口
1. java.lang.Comparable: 提供对象的自然排序,内置于类中
int compareTo(Object o);
boolean equals(Object o2);
2. java.util.Comparator: 提供特定的比较方法
int compare(Object o1, Object o2)
// 避免重复排序,可以使用TreeMap
TreeMap sorted = new TreeMap(unsortedHashMap);
// 排除重复元素
Hashset hs - new HashSet();
// 搜索对象
binarySearch(): 快速查询 - Arrays, Collections
contains(): 线型搜索 - ArrayList, HashSet, Hashtable, linkedList, Properties, Vector
containsKey(): 检查集合对象是否包含给定 - HashM
ap, Hashtable, Properties, TreeMap
containsValue(): 主键(或给定值) - HashMap, Hashtable, Properties, TreeMap
indexOf(): 若到给定对象,返回其位置 - ArrayList, linkedList, List, Stack, Vector
search(): 线型搜素 - Stack
// 集合转数组
toArray();
// 集合总结
Collection: Set - HashSet, TreeSet
Collection: List - ArrayList, Vector, LinkedList
Map: HashMap, HashTable, TreeMap
//8. 泛型与foreach
// 泛型
List<String> myList = new ArrayList<String>();
// foreach
for (String s : myList) {
System.out.println(s);
}
//9. 面向对象
// toString()格式化
public class ToStringWith {
int x, y;
public ToStringWith(int anX, int aY) {
x = anX;
y = aY;
}
public String toString() {
return "ToStringWith[" + x + "," + y + "]";
}
public static void main(String[] args) {
System.out.println(new ToStringWith(43, 78));
}
}
// 覆盖equals方法
public boolean equals(Object o) {
if (o == this)  // 优化
return true;
if (!(o instanceof EqualsDemo))  // 可投射到这个类
return false;
EqualsDemo other = (EqualsDemo)o;  // 类型转换
if (int1 != other.int1)  // 按字段比较
return false;
if (!obj1.equals(other.obj1))
return false;
return true;
}
/
/ 覆盖hashcode方法
private volatile int hashCode = 0;  //延迟初始化
public int hashCode() {
if (hashCode == 0) {
int result = 17;
result = 37 * result + areaCode;
}
return hashCode;
}
// Clone方法
要克隆对象,必须先做两步: 1. 覆盖对象的clone()方法; 2. 实现空的Cloneable接口
public class Clone1 implements Cloneable {
public Object clone() {
return super.clone();
}
}
// Finalize方法
Object f = new Object() {
public void finalize() {
System.out.println("Running finalize()");
}
}; 
public void run() {
System.out.println("Running Shutdown Hook");
}
});
在调用it(0);的时候,这两个方法将被执行
// Singleton模式
// 实现1
public class MySingleton() {
public static final MySingleton INSTANCE = new MySingleton();
private MySingleton() {}
}
// 实现2
public class MySingleton() {
public static MySingleton instance = new MySingleton();
private MySingleton() {}
public static MySingleton getInstance() {
return instance;
}
}
// 自定义异常
Exception: 编译时检查
RuntimeException: 运行时检查
public class MyException extends RuntimeException {
public MyException() {
super();
}
public MyException(String msg) {
super(msg);
}
}
printf输出格式java//10. 输入和输出
// Stream, Reader, Writer
Stream: 处理字节流
Reader/Writer: 处理字符,通用Unicode
// 从标准输入设备读数据
1. 用System.in
的BufferedInputStream()读取字节
int b = ad();
System.out.println("Read data: " + (char)b);  // 强制转换为字符
2. BufferedReader读取文本
如果从Stream转成Reader,使用InputStreamReader类
BufferedReader is = new BufferedReader(new
InputStreamReader(System.in));
String inputLine;
while ((inputLine = is.readLine()) != null) {
System.out.println(inputLine);
int val = Integer.parseInt(inputLine);  // 如果inputLine为整数
}
is.close();
// 向标准输出设备写数据
1. 用System.out的println()打印数据
2. 用PrintWriter打印
PrintWriter pw = new PrintWriter(System.out);
pw.println("The answer is " + myAnswer + " at this time.");
/
/ Formatter类
格式化打印内容
Formatter fmtr = new Formatter();
fmtr.format("%1$04d - the year of %2$f", 1951, Math.PI);
或者System.out.printf();或者System.out.format();     
// 原始扫描
void doFile(Reader is) {
int c;
while ((c = is.read()) != -1) {
System.out.println((char)c);
}
// Scanner扫描
Scanner可以读取File, InputStream, String, Readable
try {
Scanner scan = new Scanner(new File("a.txt"));
while (scan.hasNext()) {
String s = ();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
// 读取文件
BufferedReader is = new BufferedReader(new FileReader(""));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bytes.bat"));
is.close();
bos.close();
// 复制文件
BufferedIutputStream is = new BufferedIutputStream(new FileIutputStream(""));
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(""));
int b;
while ((b = is.read()) != -1) {
os.write(b);
}
is.close();
os.close();
// 文件读入字符串
StringBuffer sb = new StringBuffer();
char[] b = new char[8192];
int n;
// 读一个块,如果有字符,加入缓冲区
while ((n = is.read(b)) > 0) {
sb.append(b, 0, n);
}
String();
// 重定向标准流
String logfile = "error.log";
System.setErr(new PrintStream(new FileOutputStream(logfile)));
// 读写不同字符集文本
BufferedReader chinese = new BufferedReader(new InputStreamReader(new FileInputStream(""), "ISO8859_1"));
PrintWriter standard = new PrintWriter(new OutputStreamWriter(new FileOutputStream(""), "UTF-8"));
// 读取二进制数据
DataOutputStream os = new DataOutputStream(new FileOutputStream("a.txt"));
os.writeInt(i);
os.writeDouble(d);
os.close();
// 从指定位置读数据
RandomAccessFile raf = new RandomAccessFile(fileName, "r");  // r表示已只读打开
raf.seek(15);  // 从15开始读
raf.radLine();
// 串行化对象
对象串行化,必须实现Serializable接口
// 保存数据到磁盘
ObjectOutputStream os = new ObjectOutput
Stream(new BufferedOutputStream(new FileOutputStream(FILENAME)));
os.writeObject(serialObject);
os.close();
// 读出数据
ObjectInputStream is = new ObjectInputStream(new FileInputStream(FILENAME));
is.close();
// 读写Jar或Zip文档
ZipFile zippy = new ZipFile("a.jar");
Enumeration all = ies();  // 枚举值列出所有文件清单
while (all.hasMoreElements()) {
ZipEntry entry = (Element();
if (entry.isFile())
println("Directory: " + Name());
// 读写文件
FileOutputStream os = new Name());
InputStream is = InputStream(entry);
int n = 0;
byte[] b = new byte[8092];
while ((n = is.read(b)) > 0) {
os.write(b, 0, n);
is.close();
os.close();
}
}
// 读写gzip文档
FileInputStream fin = new FileInputStream(FILENAME);
GZIPInputStream gzis = new GZIPInputStream(fin);
InputStreamReader xover = new InputStreamReader(gzis);
BufferedReader is = new BufferedReader(xover);
String line;
while ((line = is.readLine()) != null)
System.out.println("Read: " + line);
//11. 目录和文件操作
// 获取文件信息
exists(): 如果文件存在,返回true
getCanonicalPath(): 获取全名
getName(): 文件名
getParent(): 父目录
canRead(): 如果文件可读,返回true
canWrite(): 如果文件可写,返回true
lastModified(): 文件更新时间
length(): 文件大小
isFile(): 如果是文件,返回true
ifDirectory(): 如果是目录,返回true
要调用文件的这些方法,必须
File f = new File(fileName);
// 创建文件
File f = new File("c:\\test\\");
// 修改文件名
File f = new File("c:\\test\\");
把修改成
/
/ 删除文件
File f = new File("c:\\test\\");
f.delete();
// 临时文件
File f = new File("C:\\test");  // 指定一个文件夹
// 在test文件夹中创建foo前缀,tmp后缀的临时文件
File tmp = ateTempFile("foo", "tmp", f);
tmp.deleteOnExit();  // 在程序结束时删除该临时文件
// 更改文件属性
setReadOnly(): 设置为只读
setlastModified(): 设置最后更改时间
/
/ 列出当前文件夹的文件列表
String[] dir = new java.io.File(".").list();
java.util.Arrays.sort(dir);
for (int i = 0; i < dir.length; i++) {
System.out.println(dir[i]);
}
// 过滤文件列表
class OnlyJava implements FilenameFilter {
public boolean accept(File dir, String s) {
if (s.endsWith(".java") || s.endsWith(".class") || s.endsWith(".jar"))
return true;
}
}
// 获取根目录
File[] rootDir = File.listRoots();
for (int i = 0; i < rootDir.length; i++) {
System.out.println(rootDir[i]);
}
// 创建新目录
new File("/home/ian/bin").mkdir();  /
/ 如果"/home/ian"存在,则可以创建bin目录
new File("/home/ian/bin").mkdirs();  // 如果"/home/ian"不存在,会创建所有的目录
/
/12. 国际化和本地化
// I18N资源
ResourceBundle rb = Bundle("Menus");
String label = rb.getString("exit.label");
// ResourceBundle相当于名值对,获取Menus按钮的区域属性
Menus_cn.properties: 不同区域的属性文件
// 列出有效区域
Locale[] list = AvailableLocales();
// 指定区域
Locale cnLocale = Locale.CHINA;
// 设置默认区域
Locale.setDefault(Locale.CHINA);
// 格式化消息
public class MessageFormatDemo {
static Object[] data = {
new java.util.Date(),
"",
"could nto be opened"
};
public static void main(String[] args) {
String result = MessageFormat.format("At {0,time} on {0,date}, {1} {2}.", data);
System.out.println(result);
}
}
输出: At 10:10:08 on 2009-6-18, could nto be opened.
// 从资源文件中读消息
Widgets.properties在k.chap11下
ResourceBundle rb = Bundle("k.chap11.Widgets");
String propt = rb.getString("filedialogs.cantopen.string");
String result = MessageFormat.String("filedialogs.cantopen.format"), data);
//13. 网络客户端
// 访问服务器
Socket socket = new Socket("127.0.0.1", 8080);
/
/ todo something
socket.close();
// 查网络地址
// 连接具体异常
UnknownHostException
NoRouteToHostException
ConnectException
// Socket读写文本数据
BufferedReader in = new BufferedReader(new InputStream()));
String remoteTime = in.readline();
PrintWriter out = new OutputStream(), true);
out.print("send message to client \r\n");
out.flush();
// Socket读写二进制数据
DataInputStream in = new DataInputStream(new InputStream()));
long remoteTime = (long)(in.readUnsignedByte() << 24);
DataOutputStream out = new OutputStream(), true);
// Socket读写串行化数据
ObjectInputStream in = new ObjectInputStream(new InputStream()));
Object o = in.readObject();
if (o instanceof Date) // 验证对象类型
ObjectOutputStream out = new OutputStream(), true);
// UDP数据报
private final static int PACKET_SIZE = 1024;
String host = "EV001B389673DE";
InetAddress serverAddr = ByName(host);
DatagramSocket socket = new DatagramSocket();
byte[] buffer = new byte[PACKET_SIZE]; // 分配数据缓冲空间
DatagramPacket packet = new DatagramPacket(buffer, PACKET_SIZE, serverAddr, 8080);
packet.setLength(PACKET_SIZE-1); // 设置数据长度
sock