diff --git a/Basic-java/Basic-java.iml b/Basic-java/Basic-java.iml
deleted file mode 100644
index c90834f..0000000
--- a/Basic-java/Basic-java.iml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/BasicJava.iml b/BasicJava.iml
new file mode 100644
index 0000000..dadae47
--- /dev/null
+++ b/BasicJava.iml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Enumeration/Enumeration.iml b/Enumeration/Enumeration.iml
new file mode 100644
index 0000000..b1562b6
--- /dev/null
+++ b/Enumeration/Enumeration.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Enumeration/pom.xml b/Enumeration/pom.xml
new file mode 100644
index 0000000..b7b044a
--- /dev/null
+++ b/Enumeration/pom.xml
@@ -0,0 +1,28 @@
+
+
+ Basic-Java
+ com.crow
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ Enumeration
+ jar
+
+ Enumeration
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/Basic-java/src/com/crow/Enumeration/EnumCoin.java b/Enumeration/src/main/java/com/crow/EnumCoin.java
similarity index 96%
rename from Basic-java/src/com/crow/Enumeration/EnumCoin.java
rename to Enumeration/src/main/java/com/crow/EnumCoin.java
index f855855..1d4b300 100644
--- a/Basic-java/src/com/crow/Enumeration/EnumCoin.java
+++ b/Enumeration/src/main/java/com/crow/EnumCoin.java
@@ -1,4 +1,4 @@
-package com.crow.Enumeration;
+package com.crow;
/**
* Created by CrowHawk on 17/2/12.
diff --git a/Basic-java/src/com/crow/Enumeration/EnumTest.java b/Enumeration/src/main/java/com/crow/EnumTest.java
similarity index 89%
rename from Basic-java/src/com/crow/Enumeration/EnumTest.java
rename to Enumeration/src/main/java/com/crow/EnumTest.java
index b7fa4ce..5f3cbd9 100644
--- a/Basic-java/src/com/crow/Enumeration/EnumTest.java
+++ b/Enumeration/src/main/java/com/crow/EnumTest.java
@@ -1,4 +1,4 @@
-package com.crow.Enumeration;
+package com.crow;
/**
* Created by CrowHawk on 17/2/12.
diff --git a/Enumeration/target/classes/com/crow/EnumCoin$1.class b/Enumeration/target/classes/com/crow/EnumCoin$1.class
new file mode 100644
index 0000000..1ad9916
Binary files /dev/null and b/Enumeration/target/classes/com/crow/EnumCoin$1.class differ
diff --git a/Enumeration/target/classes/com/crow/EnumCoin$2.class b/Enumeration/target/classes/com/crow/EnumCoin$2.class
new file mode 100644
index 0000000..a7d491d
Binary files /dev/null and b/Enumeration/target/classes/com/crow/EnumCoin$2.class differ
diff --git a/Enumeration/target/classes/com/crow/EnumCoin.class b/Enumeration/target/classes/com/crow/EnumCoin.class
new file mode 100644
index 0000000..afd13bf
Binary files /dev/null and b/Enumeration/target/classes/com/crow/EnumCoin.class differ
diff --git a/Enumeration/target/test-classes/com/crow/EnumTest.class b/Enumeration/target/test-classes/com/crow/EnumTest.class
new file mode 100644
index 0000000..27ec5e0
Binary files /dev/null and b/Enumeration/target/test-classes/com/crow/EnumTest.class differ
diff --git a/Generic/Generic.iml b/Generic/Generic.iml
new file mode 100644
index 0000000..b1562b6
--- /dev/null
+++ b/Generic/Generic.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Generic/pom.xml b/Generic/pom.xml
new file mode 100644
index 0000000..5c9204e
--- /dev/null
+++ b/Generic/pom.xml
@@ -0,0 +1,28 @@
+
+
+ Basic-Java
+ com.crow
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ Generic
+ jar
+
+ Generic
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/Basic-java/src/com/crow/Generic/GenericTest.java b/Generic/src/main/java/com/crow/GenericTest.java
similarity index 85%
rename from Basic-java/src/com/crow/Generic/GenericTest.java
rename to Generic/src/main/java/com/crow/GenericTest.java
index 5fbab0c..3f1812f 100644
--- a/Basic-java/src/com/crow/Generic/GenericTest.java
+++ b/Generic/src/main/java/com/crow/GenericTest.java
@@ -1,16 +1,21 @@
-package com.crow.Generic;
+package com.crow;
/**
* Created by CrowHawk on 17/2/16.
*/
-import java.lang.reflect.*;
-import java.util.*;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
public class GenericTest {
public static void main(String[] args) throws Exception{
- HashMap hashMap = new HashMap<>();
+ HashMap hashMap = new HashMap();
hashMap.put("Tom", 1);
hashMap.put("Jerry", 2);
hashMap.put("Nick", 3);
diff --git a/NIO/NIO.iml b/NIO/NIO.iml
new file mode 100644
index 0000000..b1562b6
--- /dev/null
+++ b/NIO/NIO.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/NIO/pom.xml b/NIO/pom.xml
new file mode 100644
index 0000000..32ca5da
--- /dev/null
+++ b/NIO/pom.xml
@@ -0,0 +1,28 @@
+
+
+ Basic-Java
+ com.crow
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ NIO
+ jar
+
+ NIO
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/NIO/src/main/java/com/crow/CopyFile.java b/NIO/src/main/java/com/crow/CopyFile.java
new file mode 100644
index 0000000..f6f8266
--- /dev/null
+++ b/NIO/src/main/java/com/crow/CopyFile.java
@@ -0,0 +1,43 @@
+package com.crow;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+/**
+ * Created by CrowHawk on 17/9/4.
+ */
+public class CopyFile {
+ public static void main(String[] args) throws Exception {
+ if (args.length<2) {
+ System.err.println( "Usage: java CopyFile infile outfile" );
+ System.exit( 1 );
+ }
+
+ String infile = args[0];
+ String outfile = args[1];
+
+ FileInputStream fin = new FileInputStream( infile );
+ FileOutputStream fout = new FileOutputStream( outfile );
+
+ FileChannel fcin = fin.getChannel();
+ FileChannel fcout = fout.getChannel();
+
+ ByteBuffer buffer = ByteBuffer.allocate( 1024 );
+
+ while (true) {
+ buffer.clear();
+
+ int r = fcin.read(buffer);
+
+ if (r == -1) {
+ break;
+ }
+
+ buffer.flip();
+
+ fcout.write(buffer);
+ }
+ }
+}
diff --git a/NIO/src/main/java/com/crow/CreateArrayBuffer.java b/NIO/src/main/java/com/crow/CreateArrayBuffer.java
new file mode 100644
index 0000000..886e3e6
--- /dev/null
+++ b/NIO/src/main/java/com/crow/CreateArrayBuffer.java
@@ -0,0 +1,24 @@
+package com.crow;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Created by CrowHawk on 17/9/4.
+ */
+public class CreateArrayBuffer {
+ static public void main( String args[] ) throws Exception {
+ byte array[] = new byte[1024];
+
+ ByteBuffer buffer = ByteBuffer.wrap( array );
+
+ buffer.put( (byte)'a' );
+ buffer.put( (byte)'b' );
+ buffer.put( (byte)'c' );
+
+ buffer.flip();
+
+ System.out.println( (char)buffer.get() );
+ System.out.println( (char)buffer.get() );
+ System.out.println( (char)buffer.get() );
+ }
+}
diff --git a/NIO/src/main/java/com/crow/CreateBuffer.java b/NIO/src/main/java/com/crow/CreateBuffer.java
new file mode 100644
index 0000000..0fe8def
--- /dev/null
+++ b/NIO/src/main/java/com/crow/CreateBuffer.java
@@ -0,0 +1,22 @@
+package com.crow;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Created by CrowHawk on 17/9/4.
+ */
+public class CreateBuffer {
+ public static void main( String args[] ) throws Exception {
+ ByteBuffer buffer = ByteBuffer.allocate( 1024 );
+
+ buffer.put( (byte)'a' );
+ buffer.put( (byte)'b' );
+ buffer.put( (byte)'c' );
+
+ buffer.flip();
+
+ System.out.println( (char)buffer.get() );
+ System.out.println( (char)buffer.get() );
+ System.out.println( (char)buffer.get() );
+ }
+}
diff --git a/NIO/src/main/java/com/crow/MultiPortEcho.java b/NIO/src/main/java/com/crow/MultiPortEcho.java
new file mode 100644
index 0000000..81479ee
--- /dev/null
+++ b/NIO/src/main/java/com/crow/MultiPortEcho.java
@@ -0,0 +1,108 @@
+package com.crow;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.nio.ByteBuffer;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * Created by CrowHawk on 17/9/4.
+ */
+public class MultiPortEcho {
+ private int ports[];
+ private ByteBuffer echoBuffer = ByteBuffer.allocate( 1024 );
+
+ public MultiPortEcho( int ports[] ) throws IOException {
+ this.ports = ports;
+
+ go();
+ }
+
+ private void go() throws IOException {
+
+ Selector selector = Selector.open();
+
+ // Open a listener on each port, and register each one
+ // with the selector
+ for (int i=0; i < ports.length; i++) {
+ ServerSocketChannel ssc = ServerSocketChannel.open();
+ ssc.configureBlocking(false);
+ ServerSocket ss = ssc.socket();
+ InetSocketAddress address = new InetSocketAddress(ports[i]);
+ ss.bind(address);
+
+ //将新打开的 ServerSocketChannels 注册到 Selector上,指定监听accept事件
+ SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT);
+ System.out.println("Going to listen on " + ports[i]);
+ }
+
+ while (true) {
+ int num = selector.select();//返回该选择器中对I/O事件准备就绪的channel对应的key的数量
+ Set selectedKeys = selector.selectedKeys();//返回key的集合
+ Iterator it = selectedKeys.iterator();
+ while (it.hasNext()) {//遍历key集合,集合中的元素为SelectionKey类型
+ SelectionKey key = (SelectionKey) it.next();
+ if ((key.readyOps() & SelectionKey.OP_ACCEPT)
+ == SelectionKey.OP_ACCEPT) {//检查发生了什么类型的事件
+ // Accept the new connection
+ ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
+ SocketChannel sc = ssc.accept();
+ sc.configureBlocking( false );
+
+ // Add the new connection to the selector
+ SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ );//监听read事件
+ //Selector不会自己从已选择键集中移除SelectionKey实例。必须在处理完通道时自己移除。下次该通道变成就绪时,Selector会再次将其放入已选择键集中。
+ it.remove();
+
+ System.out.println( "Got connection from "+sc );
+ }else if ((key.readyOps() & SelectionKey.OP_READ)
+ == SelectionKey.OP_READ) {
+ // Read the data
+ SocketChannel sc = (SocketChannel)key.channel();
+
+ // Echo data
+ int bytesEchoed = 0;
+ while (true) {
+ echoBuffer.clear();
+ int r = sc.read( echoBuffer );
+
+ if (r<=0) {
+ break;
+ }
+ echoBuffer.flip();
+
+ sc.write( echoBuffer );
+ bytesEchoed += r;
+ }
+
+ System.out.println( "Echoed "+bytesEchoed+" from "+sc );
+
+ it.remove();
+ }
+ }
+ }
+ }
+
+ public static void main( String args[] ) throws Exception {
+ if (args.length<=0) {
+ System.err.println( "Usage: java MultiPortEcho port [port port ...]" );
+ System.exit( 1 );
+ }
+
+ int ports[] = new int[args.length];
+
+ for (int i=0; i 0; i++) {
+ System.out.println("Character" + i + ": " + (char)buffer.get());
+ }
+ fin.close();
+ }
+}
diff --git a/NIO/src/main/java/com/crow/ScatterGather.java b/NIO/src/main/java/com/crow/ScatterGather.java
new file mode 100644
index 0000000..a911dd6
--- /dev/null
+++ b/NIO/src/main/java/com/crow/ScatterGather.java
@@ -0,0 +1,77 @@
+package com.crow;
+
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+
+/**
+ * Created by CrowHawk on 17/9/4.
+ */
+public class ScatterGather {
+ static private final int firstHeaderLength = 2;
+ static private final int secondHeaderLength = 4;
+ static private final int bodyLength = 6;
+
+ static public void main( String args[] ) throws Exception {
+ if (args.length!=1) {
+ System.err.println( "Usage: java UseScatterGather port" );
+ System.exit( 1 );
+ }
+
+ int port = Integer.parseInt( args[0] );
+
+ ServerSocketChannel ssc = ServerSocketChannel.open();
+ InetSocketAddress address = new InetSocketAddress( port );
+ ssc.socket().bind( address );
+
+ int messageLength =
+ firstHeaderLength + secondHeaderLength + bodyLength;
+
+ ByteBuffer buffers[] = new ByteBuffer[3];
+ buffers[0] = ByteBuffer.allocate( firstHeaderLength );
+ buffers[1] = ByteBuffer.allocate( secondHeaderLength );
+ buffers[2] = ByteBuffer.allocate( bodyLength );
+
+ SocketChannel sc = ssc.accept();
+
+ while (true) {
+
+ // Scatter-read into buffers
+ int bytesRead = 0;
+ while (bytesRead < messageLength) {
+ long r = sc.read( buffers );
+ bytesRead += r;
+
+ System.out.println( "r "+r );
+ for (int i=0; i < buffers.length; ++i) {
+ ByteBuffer bb = buffers[i];
+ System.out.println( "b " + i + " " + bb.position() + " " + bb.limit() );
+ }
+ }
+
+ // Process message here
+
+ // Flip buffers
+ for (int i=0; i
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Proxy/pom.xml b/Proxy/pom.xml
new file mode 100644
index 0000000..5073b11
--- /dev/null
+++ b/Proxy/pom.xml
@@ -0,0 +1,28 @@
+
+
+ Basic-Java
+ com.crow
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ Proxy
+ jar
+
+ Proxy
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/Basic-java/src/com/crow/Proxy/Advice.java b/Proxy/src/main/java/com/crow/Advice.java
similarity index 74%
rename from Basic-java/src/com/crow/Proxy/Advice.java
rename to Proxy/src/main/java/com/crow/Advice.java
index 915827f..4383bbe 100644
--- a/Basic-java/src/com/crow/Proxy/Advice.java
+++ b/Proxy/src/main/java/com/crow/Advice.java
@@ -1,6 +1,6 @@
-package com.crow.Proxy;
+package com.crow;
-import java.lang.reflect.*;
+import java.lang.reflect.Method;
/**
* Created by CrowHawk on 17/2/20.
diff --git a/Basic-java/src/com/crow/Proxy/ImpAdvice.java b/Proxy/src/main/java/com/crow/ImpAdvice.java
similarity index 95%
rename from Basic-java/src/com/crow/Proxy/ImpAdvice.java
rename to Proxy/src/main/java/com/crow/ImpAdvice.java
index 380062e..7027aac 100644
--- a/Basic-java/src/com/crow/Proxy/ImpAdvice.java
+++ b/Proxy/src/main/java/com/crow/ImpAdvice.java
@@ -1,4 +1,4 @@
-package com.crow.Proxy;
+package com.crow;
import java.lang.reflect.Method;
diff --git a/Basic-java/src/com/crow/Proxy/ProxyTest.java b/Proxy/src/main/java/com/crow/ProxyTest.java
similarity index 88%
rename from Basic-java/src/com/crow/Proxy/ProxyTest.java
rename to Proxy/src/main/java/com/crow/ProxyTest.java
index 562d3c7..d69bdf1 100644
--- a/Basic-java/src/com/crow/Proxy/ProxyTest.java
+++ b/Proxy/src/main/java/com/crow/ProxyTest.java
@@ -1,7 +1,9 @@
-package com.crow.Proxy;
+package com.crow;
-import java.lang.reflect.*;
-import java.util.*;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.ArrayList;
import java.util.Collection;
/**
diff --git a/README.md b/README.md
index 957a279..70fa8a3 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,32 @@
# JavaLearning
-本仓库记录了我的Java进阶之路,旨在提供一个Java在线共享学习平台,帮助更多的Java学习者入门进阶
+本仓库记录了我的Java学习进阶之路,涵盖了Java基础、JDK源码、JVM中的重要知识,附有代码和博客讲解,旨在提供一个Java在线共享学习平台,帮助更多的Java学习者入门进阶。
## 代码目录
+ [Java基础](https://github.com/CrowHawk/JavaLearning/tree/master/Basic-java):包括枚举、范型、反射、动态代理的用法;
+ [JNA](https://github.com/CrowHawk/JavaLearning/tree/master/JNAPointer):演示了JNA的基本用法,使用Java调用C++代码。
## 博客目录
+### Java基础
+ [Java基础学习(1)——反射](https://crowhawk.github.io/2017/02/12/basic-java-reflect/)
+ [Java基础学习(2)——注解](https://crowhawk.github.io/2017/02/13/basic-java-annotation/)
+ [Java基础学习(3)——泛型](https://crowhawk.github.io/2017/02/21/basic-java-generic/)
+ [Java基础学习(4)——动态代理](https://crowhawk.github.io/2017/02/21/basic-java-proxy/)
+ [《Java多线程核心技术》读书笔记](https://crowhawk.github.io/2017/07/06/MultiThread/)
+### JDK源码
++ [Java集合框架源码解读(1)——ArrayList、LinkedList和Vector](https://crowhawk.github.io/2017/08/26/collections_1/)
++ [Java集合框架源码解读(2)——HashMap](https://crowhawk.github.io/2017/08/27/collections_2/)
++ [Java集合框架源码解读(3)——LinkedHashMap](https://crowhawk.github.io/2017/08/28/collctions_3/)
++ [Java集合框架源码解读(4)——WeakHashMap](https://crowhawk.github.io/2017/08/29/collection_4/)
++ [Java集合框架源码解读(5)——TreeMap](https://crowhawk.github.io/2017/08/31/collection_5/)
+
+### JVM
++ [深入理解JVM(1)——Java内存区域与Java对象](https://crowhawk.github.io/2017/08/09/jvm_1/)
++ [深入理解JVM(2)——GC算法与内存分配策略](https://crowhawk.github.io/2017/08/10/jvm_2/)
++ [深入理解JVM(3)——7种垃圾收集器](https://crowhawk.github.io/2017/08/15/jvm_3/)
++ [深入理解JVM(4)——如何优化Java GC「译」](https://crowhawk.github.io/2017/08/21/jvm_4/)
++ [深入理解JVM(5)——虚拟机类加载机制](https://crowhawk.github.io/2017/08/21/jvm_5/)
++ [深入理解JVM(6)——类加载器](https://crowhawk.github.io/2017/08/21/jvm_6/)
+
## 联系作者
[Personal Website:Crow Home](https://crowhawk.github.io/)
diff --git a/ReadAndShow.txt b/ReadAndShow.txt
new file mode 100644
index 0000000..023431f
--- /dev/null
+++ b/ReadAndShow.txt
@@ -0,0 +1 @@
+Read And Show.
\ No newline at end of file
diff --git a/Reflect/Reflect.iml b/Reflect/Reflect.iml
new file mode 100644
index 0000000..b1562b6
--- /dev/null
+++ b/Reflect/Reflect.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Reflect/pom.xml b/Reflect/pom.xml
new file mode 100644
index 0000000..40d57c3
--- /dev/null
+++ b/Reflect/pom.xml
@@ -0,0 +1,28 @@
+
+
+ Basic-Java
+ com.crow
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ Reflect
+ jar
+
+ Reflect
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/Basic-java/src/com/crow/Reflect/FieldReflect.java b/Reflect/src/main/java/com/crow/FieldReflect.java
similarity index 94%
rename from Basic-java/src/com/crow/Reflect/FieldReflect.java
rename to Reflect/src/main/java/com/crow/FieldReflect.java
index a01edd1..25263e9 100644
--- a/Basic-java/src/com/crow/Reflect/FieldReflect.java
+++ b/Reflect/src/main/java/com/crow/FieldReflect.java
@@ -1,4 +1,4 @@
-package com.crow.Reflect;
+package com.crow;
/**
diff --git a/Basic-java/src/com/crow/Reflect/ReflectTest.java b/Reflect/src/main/java/com/crow/ReflectTest.java
similarity index 94%
rename from Basic-java/src/com/crow/Reflect/ReflectTest.java
rename to Reflect/src/main/java/com/crow/ReflectTest.java
index d960b36..cb51a44 100644
--- a/Basic-java/src/com/crow/Reflect/ReflectTest.java
+++ b/Reflect/src/main/java/com/crow/ReflectTest.java
@@ -1,7 +1,8 @@
-package com.crow.Reflect;
+package com.crow;
import java.io.IOException;
-import java.lang.reflect.*;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
/**
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..d8fff45
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+
+ com.crow
+ Basic-Java
+ 1.0-SNAPSHOT
+
+ Enumeration
+ Generic
+ Proxy
+ Reflect
+ JNA
+ NIO
+
+ pom
+
+ Basic-Java
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+