Java经典实例(第二版)

1. 获取环境变量

System.getenv("PATH");
System.getenv("JAVA_HOME");

 

2. 获取系统属性

System.getProperty("pencil color");  // 得到属性值
java -Dpencil color=green
System.getProperty("java.specification.version");  // 得到Java版本号
Properties p = System.getProperties();  // 得到所有属性值
p.list(System.out);

 

3. StringTokenizer

// 能够同时识别, 和 |
StringTokenizer st = new StringTokenizer("Hello, World|of|Java", ", |");
while (st.hasMoreElements()) {
    st.nextToken();
}

// 把分隔符视为token
StringTokenizer st = new StringTokenizer("Hello, World|of|Java", ", |",  true);

 

4. StringBuffer(同步)和StringBuilder(非同步)

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append("World");
sb.toString();
new StringBuffer(a).reverse();	 // 反转字符串

 

5. 数字

// 数字与对象之间互相转换 - Integer转int
Integer.intValue();

// 浮点数的舍入  
Math.round()

// 数字格式化
NumberFormat

// 整数 -> 二进制字符串
toBinaryString()或valueOf()

// 整数 -> 八进制字符串
toOctalString()

// 整数 -> 十六进制字符串
toHexString()

// 数字格式化为罗马数字
RomanNumberFormat()

// 随机数
Random r = new Random();
r.nextDouble();
r.nextInt();

 

6. 日期和时间

// 查看当前日期
Date today = new Date();
Calendar.getInstance().getTime();

// 格式化默认区域日期输出
DateFormat df = DateFormat.getInstance();
df.format(today);

// 格式化制定区域日期输出		
DateFormat df_cn = DateFormat.getDateInstance(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 = Calendar.getInstance();  // 今天
d1.getTime();  // Calendar或GregorianCalendar转成Date格式
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 = now.getTime();
t += 700*24*60*60*1000;
Date then = new Date(t);

Calendar now = Calendar.getInstance();
now.add(Calendar.YEAR, -2);

// 计算日期间隔(转换成long来计算)
today.getTime() - old.getTime();

// 比较日期
Date类型,就使用equals(), before(), after()来计算
long类型,就使用==, <, >来计算

// 第几日
使用Calendar的get()方法
Calendar c = Calendar.getInstance();
c.get(Calendar.YEAR); 

// 记录耗时
long start = System.currentTimeMillis();
long end = System.currentTimeMillis();
long elapsed = end - start;
System.nanoTime();  //毫秒

// 长整形转换成秒
Double.toString(t/1000D);

 

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>();
hm.get(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 = prefs.get("textFontName", "lucida-bright");
String display = prefs.get("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 = MediationServer.class.getClassLoader().getResourceAsStream("msconfig.properties");
Properties prop = new Properties();
prop.load(in);
in.close();
prop.setProperty(key, value);
prop.getProperty(key);

// 排序
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(): 检查集合对象是否包含给定 - HashMap, 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()");
    }
};		
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        System.out.println("Running Shutdown Hook");
    }
});
在调用System.exit(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);
    }
}

 

10. 输入和输出

// Stream, Reader, Writer
Stream: 处理字节流
Reader/Writer: 处理字符,通用Unicode

// 从标准输入设备读数据
1. 用System.in的BufferedInputStream()读取字节
    int b = System.in.read();
      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 = scan.next();
    }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

// 读取文件
BufferedReader is = new BufferedReader(new FileReader("myFile.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bytes.bat"));
is.close();
bos.close();

// 复制文件
BufferedIutputStream is = new BufferedIutputStream(new FileIutputStream("oldFile.txt"));
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream("newFile.txt"));
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);
}
return sb.toString();

// 重定向标准流
String logfile = "error.log";
System.setErr(new PrintStream(new FileOutputStream(logfile)));

// 读写不同字符集文本
BufferedReader chinese = new BufferedReader(new InputStreamReader(new FileInputStream("chinese.txt"), "ISO8859_1"));
PrintWriter standard = new PrintWriter(new OutputStreamWriter(new FileOutputStream("standard.txt"), "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.readInt();
raf.radLine();

// 串行化对象
对象串行化,必须实现Serializable接口
// 保存数据到磁盘
ObjectOutputStream os = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(FILENAME)));
os.writeObject(serialObject);
os.close();
// 读出数据
ObjectInputStream is = new ObjectInputStream(new FileInputStream(FILENAME));
is.readObject();
is.close();

// 读写Jar或Zip文档
ZipFile zippy = new ZipFile("a.jar");
Enumeration all = zippy.entries();  // 枚举值列出所有文件清单
while (all.hasMoreElements()) {
    ZipEntry entry = (ZipEntry)all.nextElement();
    if (entry.isFile())
        println("Directory: " + entry.getName());
        
    // 读写文件
    FileOutputStream os = new FileOutputStream(entry.getName());
    InputStream is = zippy.getInputStream(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\\mytest.txt");
f.createNewFile();  // 创建mytest.txt文件到test目录下

// 修改文件名
File f = new File("c:\\test\\mytest.txt");
f.renameTo(new File("c:\\test\\google.txt"));
把mytest.txt修改成google.txt

// 删除文件
File f = new File("c:\\test\\mytest.txt");
f.delete();

// 临时文件
File f = new File("C:\\test");  // 指定一个文件夹
// 在test文件夹中创建foo前缀,tmp后缀的临时文件
File tmp = File.createTempFile("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 = ResourceBundle.getBundle("Menus");
String label = rb.getString("exit.label");
// ResourceBundle相当于名值对,获取Menus按钮的区域属性
Menus_cn.properties: 不同区域的属性文件

// 列出有效区域
Locale[] list = Locale.getAvailableLocales();

// 指定区域
Locale cnLocale = Locale.CHINA;

// 设置默认区域
Locale.setDefault(Locale.CHINA);

// 格式化消息
public class MessageFormatDemo {
    static Object[] data = {
        new java.util.Date(),
        "myfile.txt",
        "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, myfile.txt could nto be opened.

// 从资源文件中读消息
Widgets.properties在com.sean.cook.chap11下
ResourceBundle rb = ResourceBundle.getBundle("com.sean.cook.chap11.Widgets");
String propt = rb.getString("filedialogs.cantopen.string");
String result = MessageFormat.format(rb.getString("filedialogs.cantopen.format"), data);

 

13. 网络客户端

// 访问服务器
Socket socket = new Socket("127.0.0.1", 8080);
// todo something
socket.close();

// 查找网络地址
InetAddress.getByName(hostName).getHostAddress()); // 根据主机名得到IP地址
InetAddress.getByName(ipAddr).getHostName()); // 根据IP地址得到主机名

// 连接具体异常
UnknownHostException
NoRouteToHostException
ConnectException

// Socket读写文本数据
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String remoteTime = in.readline();
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.print("send message to client \r\n");
out.flush();

// Socket读写二进制数据
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
long remoteTime = (long)(in.readUnsignedByte() << 24);
DataOutputStream out = new DataOutputStream(socket.getOutputStream(), true);

// Socket读写串行化数据
ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
Object o = in.readObject();
if (o instanceof Date) // 验证对象类型
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream(), true);

// UDP数据报
private final static int PACKET_SIZE = 1024;
	
String host = "EV001B389673DE";
InetAddress serverAddr = InetAddress.getByName(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); // 设置数据长度
socket.send(packet);
socket.receive(packet); // 接收数据

 

14. 服务器端: Socket 

// 创建ServerSocket
ServerSocket serverSocket;
Socket clientSocket;
		
serverSocket = new ServerSocket(9999);
while ((clientSocket = serverSocket.accept()) != null) {
    System.out.println("Accept from client " + s.getInetAddress());
    s.close();
}

// 监听内部网
public static final short PORT = 9999;
public static final String INSIDE_HOST = "acmewidgets-inside"; // 网络接口名
public static final int BACKLOG = 10; // 待发数
serverSocket = new ServerSocket(PORT, BACKLOG, InetAddress.getByName(INSIDE_HOST));

// 返回相应对象
ServerSocket serverSocket =  new ServerSocket(9999);;
Socket clientSocket;
BufferedReader in = null;
PrintWriter out = null;
while (true) {
    clientSocket = serverSocket.accept();
    in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "8859_1"));
    out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream(), "8859_1"), true);
    String echoLine;
    while ((echoLine = in.readLine()) != null) {
        System.out.println("Read " + echoLine);
        out.print(echoLine + "\r\n");
    }
}
以上例子返回字符串,如果返回二进制,则使用DataOutputStream;返回对象,使用ObjectOutputStream

// 处理多客户端
需要把接收数据的处理放入多线程中
public class EchoServerThreaded {
    public static final int ECHOPORT = 7;
    public static final int NUM_THREADS = 4;

    public static void main(String[] av) {
        new EchoServerThreaded(ECHOPORT, NUM_THREADS);
    }

    public EchoServerThreaded2(int port, int numThreads) {
        ServerSocket servSock;
        Socket clientSocket;
        try {
            servSock = new ServerSocket(ECHOPORT);
        } catch(IOException e) {
            throw new RuntimeException("Could not create ServerSocket " + e);
        }
        for (int i = 0; i < numThreads; i++) {
            new Handler(servSock, i).start();
        }
    }
}
class Handler extends Thread {
    ServerSocket servSock;
    int threadNumber;

    Handler(ServerSocket s, int i) {
        super();
        servSock = s;
        threadNumber = i;
        setName("Thread " + threadNumber);
    }

    public void run() {
        while (true) {
            try {
                System.out.println(getName() + " waiting");
                Socket clientSocket;
                synchronized (servSock) {
                    clientSocket = servSock.accept();
                }
                System.out.println(getName() + " starting, IP=" + clientSocket.getInetAddress());
                BufferedReader is = new BufferedReader(new InputStreamReader(
                    clientSocket.getInputStream()));
                PrintStream os = new PrintStream(clientSocket.getOutputStream(), true);
                String line;
                while ((line = is.readLine()) != null) {
                    os.print(line + "\r\n");
                    os.flush();
                }
                System.out.println(getName() + " ENDED ");
                clientSocket.close();
            } catch (IOException ex) {
                System.out.println(getName() + ": IO Error on socket " + ex);
                return;
            }
        }
    }
}

// 使用SSL和JSSE保护Web服务器
SSLServerSocketFactory ssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
ServerSocket serverSocket = ssf.createServerSocket(8080);

// Log4j
Level级别: DEBUG < INFO < WARN < ERROR < FATAL < OFF
Appender: 输出信息
ConsoleAppender: 输出控制台 System.out

// 找到网络接口
Enumeration list = NetworkInterface.getNetworkInterfaces();
while (list.hasMoreElements()) {
    NetworkInterface iface = (NetworkInterface)list.nextElement();
    System.out.println(iface.getDisplayName());
    Enumeration addrs = iface.getInetAddresses();
    while (addrs.hasMoreElements()) {
        InetAddress addr = (InetAddress)addrs.nextElement();
        System.out.println(addr);
    }
}

 

15. Java Mail

// 发送Mail
protected String msgRecIp = "hxydream@163.com";
protected String msgSubject = "babytree";
protected String msgCc = "nobody@erewhon.com";
protected String msgBody = "test body";
protected Session session;
protected Message msg;
	
public void doSend() {
    // 创建属性文件
    Properties props = new Properties();
    props.put("mail.smtp.host", "mailhost");
    // 创建Session对象
    session = Session.getDefaultInstance(props, null);
    session.setDebug(true);
    msg = new MimeMessage(session); // 创建邮件
    msg. setFrom(new InternetAddress("nobody@host.domain"));
    InternetAddress toAddr = new InternetAddress(msgRecIp);
    msg.addRecipient(Message.RecipientType.TO, toAddr);
    InternetAddress ccAddr = new InternetAddress(msgCc);
    msg.addRecipient(Message.RecipientType.CC, ccAddr);
    msg.setSubject(msgSubject);
    msg.setText(msgBody); 
    Transport.send(msg); 
}

// 发送MIME邮件
Multipart mp = new MimeMultipart();
BodyPart textPart = new MimeBodyPart();
textPart.setText(message_body);  // 设置类型"text/plain"
BodyPart pixPart = new MimeBodyPart();
pixPart.setContent(html_data, "text/html");
mp.addBodyPart(textPart);
mp.addBodyPart(pixPart);
mesg.setContent(mp);
Transport.send(mesg);

// 读Mail
Store store = session.getStore(protocol);
store.connect(host, user, password);
Folder rf;
rf = store.getFolder(root);
rf = store.getDefaultFolder();
rf.open(Folder.READ_WRITE);

 

16. 数据库访问 

// JDO
Properties p = new Properties();
p.load(new FileInputStream("jdo.properties"));
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(p);
PersistenceManager pm = pmf.getPersistenceManager();
// 提交数据
pm.currentTransaction().begin();
if (o instanceof Collection) {
    pm.makePersistentAll((Collection) o);
} else {
    pm.makePersistent(o);
}
pm.currentTransaction().commit();
pm.close();
// 取出数据
Object[] data = new Object[3];
pm.retrieveAll(data);
for (int i = 0; i < data.length; i++) {
    System.out.println(data[i]);
}
pm.close();

// 数据操作
Class clz = Class.forName("oracle.jdbc.driver.OracleDriver");
String dbUrl = "jdbc:oracle:thin:@192.168.0.23:1521#:nms";
Connection conn = DriverManager.getConnection(dbUrl, "su", "1234");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from pmtable");
while (rs.next()) {
    String name = rs.getString(1);
    String otherName = rs.getString("name");
}

// 使用PreparedStatement提高性能,除了查询,都使用executeUpdate执行操作 
PreparedStatement pstmt = conn.prepareStatement("select * from pmtable where name = ?");
pstmt.setString(1, "sean");
ResultSet rs = pstmt.executeQuery();

// 调用存储过程			
CallableStatement cs = conn.prepareCall("{ call ListDefunctUsers }");
ResultSet rs = cs.executeQuery();
		
// 显示数据库表信息	
DatabaseMetaData meta = conn.getMetaData();
meta.getDatabaseProductName();
meta.getDatabaseProductVersion();
meta.getDefaultTransactionIsolation();

  

17. XML

    SAX: 在读取文档提取相应的标记事件(元素起始、元素结束、文档起始)

    DOM: 在内存中构造与文档中元素相应的树,可以遍历、搜索、修改

    DTD: 验证文档是否正确

    JAXP: 用于XML处理的Java API

    Castor: 开源项目,用于Java对象与XML映射

// 从对象中生成XML
private final static String FILENAME = "serial.xml";
public static void main(String[] args) throws IOException {
    String a = "hard work and best callback";
    new SerialDemoXML().write(a);
    new SerialDemoXML().dump();
}
public void write(Object obj) throws IOException {
    XMLEncoder os = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(FILENAME)));
    os.writeObject(obj);
    os.close();
}
public void dump() throws IOException {
    XMLDecoder out = new XMLDecoder(new BufferedInputStream(new FileInputStream(FILENAME)));
    System.out.println(out.readObject());
    out.close();
}
serial.xml格式内容如下:
<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_02" class="java.beans.XMLDecoder"> 
    <string>hard work and best callback</string> 
</java>
控制台输出
hard work and best callback

// XSLT转换XML
XSLT可以用来对输出格式进行各种控制
Transformer tx = TransformerFactory.newInstance().newTransformer(new StreamSource("people.xml"));
tx.transform(new StreamSource("people.xml"), new StreamResult("people.html"));

// 用SAX解析XML - 主要用于查找关键元素,不用全文遍历
public SaxLister() throws SAXException, IOException {
    XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
    parser.setContentHandler(new PeopleHandler());
    parser.parse("C:\\StudySource\\javacooksrc2\\xml\\people.xml");
}
class PeopleHandler extends DefaultHandler {
    boolean parent = false;
    boolean kids = false;
    public void startElement(String nsURI, String localName, String rawName, Attributes attr) throws SAXException {
        System.out.println("startElement: " +  localName + "," + rawName);
        if (rawName.equalsIgnoreCase("name"))
            parent = true;
        if (rawName.equalsIgnoreCase("children"))
        kids = true;
    }
    public void characters(char[] ch, int start, int length) {
        if (parent) {
            System.out.println("Parent: " + new String(ch, start, length));
            parent = false;
        } else if (kids) {
            System.out.println("Children: " + new String(ch, start, length));
            kids = false;
        }
    }
    public PeopleHandler() throws SAXException {
        super();
    }
}

// DOM解析XML - 遍历整个树
String uri = "file:" + new File("C:\\StudySource\\javacooksrc2\\xml\\people.xml").getAbsolutePath();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(uri);
NodeList nodes = doc.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
    Node n = nodes.item(i);
    switch (n.getNodeType()) {
    case Node.ELEMENT_NODE:
        // todo
        break;
    case Node.TEXT_NODE:
        // todo
        break;
    }
}

// 使用DTD或者XSD验证
定义好DTD或XSD文件
XmlDocument doc = XmlDocument.createXmlDocument(uri, true);

// 用DOM生成XML
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = fact.newDocumentBuilder();
Document doc = parser.newDocument();
Node root = doc.createElement("Poem");
doc.appendChild(root);
Node stanza = doc.createElement("Stanza");
root.appendChild(stanza);
Node line = doc.createElement("Line");
stanza.appendChild(line);
line.appendChild(doc.createTextNode("Once, upon a midnight dreary"));
line = doc.createElement("Line");
stanza.appendChild(line);
line.appendChild(doc.createTextNode("While I pondered, weak and weary"));

  

18. RMI

a. 定义客户端与服务器之间的通信接口
public interface RemoteDate extends Remote {
    public Date getRemoteDate() throws RemoteException;
    public final static String LOOKUPNAME = "RemoteDate";
}

b. 编写RMI服务器
public class RemoteDateImpl extends UnicastRemoteObject implements RemoteDate {
    public RemoteDateImpl() throws RemoteException {
        super();
    }
    public Date getRemoteDate() throws RemoteException {
        return new Date();
    } 
}
RemoteDateImpl im = new RemoteDateImpl();
System.out.println("DateServer starting...");
Naming.rebind(RemoteDate.LOOKUPNAME, im);
System.out.println("DateServer ready.");

c. 运行rmic生成stub
javac RemoteDateImpl.java
rmic RemoteDateImpl

d. 编写客户端
netConn = (RemoteDate)Naming.lookup(RemoteDate.LOOKUPNAME);
Date today = netConn.getRemoteDate();
System.out.println(today.toString());

e. 确保RMI注册表运行
rmiregistry

f. 启动服务器
java RemoteDateImpl
    
g. 运行客户端
java DateClient

  

19. 包和包装机制

    jar cvf /tmp/test.jar .  // 当前目录压缩到test.jar中

    jar xvf /tmp/test.jar  // 把test.jar解压到当前目录

    从指定class运行jar文件

    a. Main-Class: HelloWord  // 注意中间有一个空格

    b. jar cvmf manifest.mf hello.jar HelloWorld.class

    c. java -jar hello.jar

 

20. Java线程

// 停止线程 - 不要使用stop()方法
private boolean done = false;
public void run() {
    while (!done) {
        //todo
    }
}
public void shutDown() {
    done = true;
}
可以调用shutDown()方法来结束线程

// 如果读取IO的时候出现堵塞,那么可以使用下面方法
public void shutDown() throws IOException {
    if (io != null) 
        io.close();
}

// 启动一线程,等待控制台输入,使用join()方法来暂停当前线程,直到其他线程调用
Thread t = new Thread() {
    public void run() {
        System.out.println("Reading");
        try {
            System.in.read();
        } catch (IOException e) {
            System.err.println(e);
        }
        System.out.println("Thread finished.");
    }
};
System.out.println("Starting");
t.start();
System.out.println("Joining");
try {
    t.join();
} catch (InterruptedException e) {
    System.out.println("Who dares imterrupt my sleep?");
}
System.out.println("Main finished.");

// 加锁保证同步
Lock lock = new ReentrantLock();
try {
    lock.lock();
    // todo
} finally {
    lock.unlock();   
}

线程通信wait(), notify(), notifyAll()
生产者-消费者模式
Executors

  

21. 内省或“命令类的类”

// 反射
Class c = Class.forName("java.lang.String");
Constructor[] cons = c.getConstructors();
for (int i = 0; i < cons.length; i++) {
    System.out.println(cons[i].toString());
}
Method[] meths = c.getMethods();
for (int i = 0; i < meths.length; i++) {
    System.out.println(meths[i].toString());
}

// 动态装载类
Class c = Class.forName("java.lang.String");
Object obj = c.newInstance();

// 通过反射调用类的方法
class X {
    public void master(String s) {
        System.out.println("Working on \"" + s + "\"");
    }
}
Class clx = X.class;
Class[] argTypes = {String.class};
Method worker = clx.getMethod("master", argTypes);
Object[] theData = {"Chocolate chips"};
worker.invoke(new X(), theData);
输出: Working on "Chocolate chips"

  

22. Java与其他语言的结合

// 执行CMD命令,在Eclipse控制台输出
Process p = Runtime.getRuntime().exec("C:/StudySource/ver.cmd");
p.waitFor(); // 等待命令执行完
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s;
while ((s = br.readLine()) != null)
    System.out.println(s);
    
// 调用Jython - 计算22.0/7
BSFManager manager = new BSFManager();
String[] fntypes = {".py"};
manager.registerScriptingEngine("jython", "org.apache.bsf.engines.jython.JythonEngine", fntypes);
Object r = manager.eval("jython", "testString", 0, 0, "22.0/7");
System.out.println("Result type is " + r.getClass().getName());
System.out.println("Result value is " + r);

// 调用C++,使用JNI

  

Borland传奇 第二版 作者:李维 著预计页码:296预计定价:29.00元  内容简介:   Borland公司是中国程序员最为景仰的公司之一,他们非常熟悉和热爱Borland的各种产品,但对该公司的情况知之甚少。其实Borland公司拥有十分杰出的技术大师,超群的技术产品。其企业发展也是跌宕起伏,有着十分精彩的故事。   本书披露了Borland公司各个重要产品开发中鲜为人知的内幕故事,第一次让读者了解了Borlan 阅读详情

相关推荐

《Java经典实例(第2版)》深入理解与实践指南

在Java中,类是对象的蓝图或模板。通过定义类,我们可以创建具有相同属性和方法的对象。类的定义从关键字class开始,后跟类名。类体内可以包含变量(字段)、方法、构造器以及其他类声明等元素。// 类的属性// 类的构造器// 类的方法在上述代码中,定义了一个名为Car的类。它有三个私有属性brandmodel和year,分别表示汽车的品牌、型号和生产年份。此外,还有一个构造器(Car方法),用于创建Car对象的实例,并且有一个公共方法drive()

weixin_34718952的博客 685

Java 案例大全(详细)一

一直在更新

weixin_48469177的博客 1万+

adams案例分析_案例1(麦弗逊悬架子系统创建)

本文字数3292字83图,建议阅读时间26分钟首先看下案例1的麦弗逊悬架数模结构就不细讲了,从数模上主要是获取硬点坐标(铰接点、安装点、参考点)及大部件结构(副车架、摆臂、转向节等实际运动过程中会产生变形的部件,在ADAMS Car中我们就可以用柔性体来搭建)再来回顾下上一篇讲到的模型元素1、Hardpoint——硬点(只有位置没有方向)2、Parameter Variable——参数...

weixin_39609407的博客 6476

【Java基础】实例与实例化

java中实例就是对象,是某个类的一个对象。

汤姆lazy的优快云博客 2820

新手必看:如何用R/qtl快速完成QTL定位分析(附实战代码)

本文为新手提供了使用R/qtl进行QTL定位分析的完整实战指南。内容涵盖从环境搭建、数据准备与清洗,到核心分析流程(包括遗传图谱计算、单QTL扫描、置换检验确定阈值)以及进阶结果可视化的全步骤。通过清晰的代码示例,帮助读者快速掌握这一数量遗传学关键分析技术,实现从数据到QTL峰值的完整分析闭环。

y7z8a的博客 498

python等级考试——一级知识点汇总(不包含turtle画图)

本篇文章是针对中国电子学会青少年编程等级考试的,适合初学者以及青少年编程学习者

weixin_65350557的博客 9026

java入门实例_5个JAVA入门必看的经典实例

入门必看的5个JAVA经典实例,供大家参考,具体内容如下1.一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口(抽象类)的用处package com.softeem.demo;/***@author leno*动物的接口*/interface Animal {public void eat(Food food);}/***@author leno*一种动物类:猫*/class Cat ...

weixin_39768388的博客 921

Redash离线环境部署2020.1(centos+windows)

背景 Redash是一款开源的BI系统,核心功能是添加数据源,然后进行数据的可视化展示。一般会拿出来同Supervisor和Metabase进行选型比较,这里对三者的选型不做细致分析。而是给出在Redash开发环境部署踩过的坑,很多坑是自己琢磨出来的,网上几乎找不到更新的资料。适用于没怎么用过linux,也不怎么熟悉python的,用的是最新(master)的redash的代码(上一个发布版本...

Jone_wan的专栏 2137

java——7个小案例

package com.study; import java.util.Scanner; public class Test { public static void main(String[] args) { //目标:完成飞机票的价格计算 //1、让用户输入机票原价,月份,仓位类型 Scanner sc = new Scanner(System.in); System.out.println("请您输入机票原价...

qq_45546075的博客 5567

Simulink+Simscape多体仿真:六自由度Stewart平台动力学建模全流程

本文详细介绍了使用Simulink和Simscape Multibody进行六自由度Stewart平台动力学建模的全流程,涵盖从CAD模型导入、运动学逆解计算到实时控制系统的设计。通过MATLAB/Simulink与Simscape的协同工作,实现高保真度的并联机器人仿真,适用于飞行模拟器、精密加工等高精度领域。

r2s3t4的博客 486

SystemVerilog从入门到实战

SystemVerilog复合数据类型概述 SystemVerilog增强了Verilog的数据建模能力,提供多种复合数据类型: 数组类型:包括定宽数组(固定大小)、动态数组(运行时分配)和多维数组,支持高效索引访问。 队列:结合数组和链表特性,支持两端快速插入/删除操作,提供push/pop等方法。 关联数组:键值对存储结构,支持稀疏数据存储和快速查找,提供exists/delete等方法。 结构体:组合不同类型数据成员,支持打包(packed)形式以优化存储空间。 枚举类型:为数值赋予语义名称,支持状态

2301_79143213的博客 1225

java编程实例_几个java编程的典型例子

1.模拟酒店房间管理系统,需要如下几个功能:1、1 in 房间号 客人名字 入住功能1、2 out 房间号 退房功能1、3 search 房间号 查询房间状态 如果房间号为-1 则输出所有房间状态1、4 quit 或 exit 退出提示:酒店所有的房间用二维数组来实现代码实现如下:1 import java.util.Scanner;23 public classHotelDemo {4 ...

weixin_35486456的博客 4431

2ED2410-EM的使用

2ED2410-EM的使用

让你爱上电路设计 972

C盘满了怎么办?系统自带工具与命令行深度清理实战指南

随着程序安装、更新备份与各类缓存不断沉淀,磁盘空间告急成为Windows用户的高频痛点。理解存储机制是有效清理的前提,系统文件的更新残留、休眠文件与页面文件往往占据大量空间。Windows内置的存储感知与磁盘清理工具能够安全识别并移除临时文件,而DISM命令则可对组件存储进行深度精简,配合聊天记录与开发缓存的迁移,能从根本上缓解C盘压力。这套兼顾安全与效率的方案适用于磁盘空间不足、系统运行变慢等常见场景,帮助用户用系统原生能力代替盲目优化的第三方软件,实现稳定持久的空间释放。

weixin_34242509的博客 297

基于Simulink的间接功率控制的矩阵变换器

通过上述步骤,我们成功设计并实现了基于 Simulink 的间接功率控制的矩阵变换器仿真模型。该模型能够通过控制输入电流和输出电压,实现对功率的间接控制,适用于电机驱动、可再生能源系统、电力传输等领域。通过虚拟场景仿真、参数优化和性能评估,验证了系统的稳定性和高效性,并通过调整 PI 控制器参数和优化调制算法,进一步提升了系统的性能。

MHD0815的博客 296

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java经典实例(第二版)各种工具

. 获取环境变量 Java代码  .    System.getenv("PATH");   .    System.getenv("JAVA_HOME");   . 获取系统属性 Java代码  .    System.getProperty("pencil color");  // 得到属性值   .    java -Dpencil color=gr

代码菜鸟旺仔 717

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

书籍推荐

书籍推荐:对于初学者:我认为《Core Java》即《Java核心技术I:原理》非常合适,典型的教科书标准,我就是看这本书入门的,感觉很适合初学者,看完这本书过后我认为《Thinking in Java》也是不可不看的,我就是当时有一些很模糊的概念就在上面得到很好的解释的,这本书我是买的英文版,当然也借同学的把中文版看了,候捷先生也翻译的很不错!不过,初学Java看这本书我认为不太适合初学者。还有

java电商源码分享 2472

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JAVA 开发实战经典 第二版 第五章 练习题 第一题

JAVA 开发实战经典 第二版 第五章 练习题 第一题 P157 T1 . package com.bjpowernode; class Address{ //定义一个类 private String guojia; //国家 private String shengfen; //省份 private Stri...

ccccckl的博客 406

Java 设计模式 第二版 下载仓库

Java 设计模式 第二版 下载仓库 【下载地址】Java设计模式第二版下载仓库 《Java 设计模式 第二版》是一本深入探讨Java设计模式的经典书籍,适合希望提升编程技能的开发者。本书以23种经典设计模式为核心,通过完整的Java项目实例,结合UML类图和丰富的练习题,帮助读者深入理解每种模式的应用场景与实现方式。书...

gitblog_06703的博客 378

Java 经典《Java 核心技术》上出现虚竹哥的名字,居然是因为

Java 经典《Core Java》上出现虚竹哥的名字,居然是因为

小虚竹的专栏 9105
上一篇: Java线程(第三版)
下一篇: SQL必知必会(第3版)
book_overkill
博客等级 码龄20年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值