来自: https://segmentfault.com/a/1190000004417830
java语言特性系列
Java5的新特性
Java6的新特性
Java7的新特性
[Java8的新特性]()
[Java9的新特性]()
序
本文主要讲Java7的新特性,相对于Java6而言,Java7增加了一些重要的特性,比如NIO2,不像Java6那么鸡肋,也算是一个重要的版本。
特性列表
suppress异常( 新语法 )
捕获多个异常(新语法)
try-with-resources(新语法)
JSR341-Expression Language Specification(新规范)
JSR203-More New I/O APIs for the Java Platform(新规范)
JSR292与InvokeDynamic
支持JDBC4.1规范
Path接口、DirectoryStream、Files、WatchService
jcmd
fork/join framework
Java Mission Control
1、suppress异常( 新语法 )
- /**
- * 记录异常,不被淹没
- * addSuppressed
- */
- class ReadFile {
- public void read(String filename) throws BaseException {
- FileInputStream input = null;
- IOException readException = null;
- try {
- input = new FileInputStream(filename);
- } catch (IOException ex) {
- readException = ex;
- } finally {
- if (input != null) {
- try {
- input.close();
- } catch (IOException ex) {
- if (readException == null) {
- readException = ex;
- }else{
- //使用java7的
- readException.addSuppressed(ex);
- }
- }
- }
- if (readException != null) {
- throw new BaseException(readException);
- }
- }
- }
- }
复制代码
2、捕获多个异常( 新语法 )
- public void handle() {
- ExceptionThrower thrower = new ExceptionThrower();
- try {
- thrower.manyExceptions();
- } catch (ExceptionA | ExceptionB ab) {
- System.out.println(ab.getClass());
- } catch (ExceptionC c) {
- }
- }
复制代码
3、try-with-resources( 新语法 )
- /**
- * try-with-resource
- * 不需要使用finally来保证打开的流被正确关闭
- * 这是自动完成的。
- * @author patterncat
- * [url=home.php?mod=space&uid=19302]@CREATED[/url] 2014-07-21
- */
- public class ResourceBasicUsage {
- public String readFile(String path) throws IOException {
- try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
- StringBuilder builder = new StringBuilder();
- String line = null;
- while ((line = reader.readLine()) != null) {
- builder.append(line);
- builder.append(String.format("%n"));
- }
- return builder.toString();
- }
- }
- }
复制代码
实现AutoCloseable
- /**
- * @author patterncat
- * @created 2014-07-21
- */
- public class CustomResource implements AutoCloseable {
- public void close() throws Exception {
- System.out.println("进行资源释放。");
- }
- public void useCustomResource() throws Exception {
- try (CustomResource resource = new CustomResource()) {
- System.out.println("使用资源。");
- }
- }
- public static void main(String[] args) {
- try {
- new CustomResource().useCustomResource();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- }
复制代码
4、JSR341-Expression Language Specification( 新规范 )
- public static void main(String[] args){
- ELProcessor el = new ELProcessor();
- assert (el.eval("Math.random()") instanceof Double);
- }
复制代码
5、JSR203-More New I/O APIs for the Java Platform( 新规范 )
bytebuffer
- public class ByteBufferUsage {
- public void useByteBuffer() {
- ByteBuffer buffer = ByteBuffer.allocate(32);
- buffer.put((byte)1);
- buffer.put(new byte[3]);
- buffer.putChar('A');
- buffer.putFloat(0.0f);
- buffer.putLong(10, 100L);
- System.out.println(buffer.getChar(4));
- System.out.println(buffer.remaining());
- }
- public void byteOrder() {
- ByteBuffer buffer = ByteBuffer.allocate(4);
- buffer.putInt(1);
- buffer.order(ByteOrder.LITTLE_ENDIAN);
- buffer.getInt(0); //值为16777216
- }
- public void compact() {
- ByteBuffer buffer = ByteBuffer.allocate(32);
- buffer.put(new byte[16]);
- buffer.flip();
- buffer.getInt();
- buffer.compact();
- int pos = buffer.position();
- }
- public void viewBuffer() {
- ByteBuffer buffer = ByteBuffer.allocate(32);
- buffer.putInt(1);
- IntBuffer intBuffer = buffer.asIntBuffer();
- intBuffer.put(2);
- int value = buffer.getInt(); //值为2
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- ByteBufferUsage bbu = new ByteBufferUsage();
- bbu.useByteBuffer();
- bbu.byteOrder();
- bbu.compact();
- bbu.viewBuffer();
- }
- }
复制代码
filechannel
- public class FileChannelUsage {
- public void openAndWrite() throws IOException {
- FileChannel channel = FileChannel.open(Paths.get("my.txt"), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
- ByteBuffer buffer = ByteBuffer.allocate(64);
- buffer.putChar('A').flip();
- channel.write(buffer);
- }
- public void readWriteAbsolute() throws IOException {
- FileChannel channel = FileChannel.open(Paths.get("absolute.txt"), StandardOpenOption.READ, StandardOpenOption.CREATE, StandardOpenOption.WRITE);
- ByteBuffer writeBuffer = ByteBuffer.allocate(4).putChar('A').putChar('B');
- writeBuffer.flip();
- channel.write(writeBuffer, 1024);
- ByteBuffer readBuffer = ByteBuffer.allocate(2);
- channel.read(readBuffer, 1026);
- readBuffer.flip();
- char result = readBuffer.getChar(); //值为'B'
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) throws IOException {
- FileChannelUsage fcu = new FileChannelUsage();
- fcu.openAndWrite();
- fcu.readWriteAbsolute();
- }
- }
复制代码
6、JSR292与InvokeDynamic
JSR 292: Supporting Dynamically Typed Languages on the JavaTM Platform,支持在JVM上运行动态类型语言。在字节码层面支持了InvokeDynamic。
方法句柄MethodHandle
- public class ThreadPoolManager {
- private final ScheduledExecutorService stpe = Executors
- .newScheduledThreadPool(2);
- private final BlockingQueue<WorkUnit<String>> lbq;
- public ThreadPoolManager(BlockingQueue<WorkUnit<String>> lbq_) {
- lbq = lbq_;
- }
- public ScheduledFuture<?> run(QueueReaderTask msgReader) {
- msgReader.setQueue(lbq);
- return stpe.scheduleAtFixedRate(msgReader, 10, 10, TimeUnit.MILLISECONDS);
- }
- private void cancel(final ScheduledFuture<?> hndl) {
- stpe.schedule(new Runnable() {
- public void run() {
- hndl.cancel(true);
- }
- }, 10, TimeUnit.MILLISECONDS);
- }
- /**
- * 使用传统的反射api
- */
- public Method makeReflective() {
- Method meth = null;
- try {
- Class<?>[] argTypes = new Class[]{ScheduledFuture.class};
- meth = ThreadPoolManager.class.getDeclaredMethod("cancel", argTypes);
- meth.setAccessible(true);
- } catch (IllegalArgumentException | NoSuchMethodException
- | SecurityException e) {
- e.printStackTrace();
- }
- return meth;
- }
- /**
- * 使用代理类
- * @return
- */
- public CancelProxy makeProxy() {
- return new CancelProxy();
- }
- /**
- * 使用Java7的新api,MethodHandle
- * invoke virtual 动态绑定后调用 obj.xxx
- * invoke special 静态绑定后调用 super.xxx
- * @return
- */
- public MethodHandle makeMh() {
- MethodHandle mh;
- MethodType desc = MethodType.methodType(void.class, ScheduledFuture.class);
- try {
- mh = MethodHandles.lookup().findVirtual(ThreadPoolManager.class,
- "cancel", desc);
- } catch (NoSuchMethodException | IllegalAccessException e) {
- throw (AssertionError) new AssertionError().initCause(e);
- }
- return mh;
- }
- public static class CancelProxy {
- private CancelProxy() {
- }
- public void invoke(ThreadPoolManager mae_, ScheduledFuture<?> hndl_) {
- mae_.cancel(hndl_);
- }
- }
- }
复制代码
调用
- public class ThreadPoolMain {
- /**
- * 如果被继承,还能在静态上下文寻找正确的class
- */
- private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
- private ThreadPoolManager manager;
- public static void main(String[] args) {
- ThreadPoolMain main = new ThreadPoolMain();
- main.run();
- }
- private void cancelUsingReflection(ScheduledFuture<?> hndl) {
- Method meth = manager.makeReflective();
- try {
- System.out.println("With Reflection");
- meth.invoke(hndl);
- } catch (IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- private void cancelUsingProxy(ScheduledFuture<?> hndl) {
- CancelProxy proxy = manager.makeProxy();
- System.out.println("With Proxy");
- proxy.invoke(manager, hndl);
- }
- private void cancelUsingMH(ScheduledFuture<?> hndl) {
- MethodHandle mh = manager.makeMh();
- try {
- System.out.println("With Method Handle");
- mh.invokeExact(manager, hndl);
- } catch (Throwable e) {
- e.printStackTrace();
- }
- }
- private void run() {
- BlockingQueue<WorkUnit<String>> lbq = new LinkedBlockingQueue<>();
- manager = new ThreadPoolManager(lbq);
- final QueueReaderTask msgReader = new QueueReaderTask(100) {
- @Override
- public void doAction(String msg_) {
- if (msg_ != null)
- System.out.println("Msg recvd: " + msg_);
- }
- };
- ScheduledFuture<?> hndl = manager.run(msgReader);
- cancelUsingMH(hndl);
- // cancelUsingProxy(hndl);
- // cancelUsingReflection(hndl);
- }
- }
复制代码
7、支持JDBC4.1规范
abort方法
- public class AbortConnection {
- public void abortConnection() throws SQLException {
- Connection connection = DriverManager
- .getConnection("jdbc:derby://localhost/java7book");
- ThreadPoolExecutor executor = new DebugExecutorService(2, 10, 60,
- TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
- connection.abort(executor);
- executor.shutdown();
- try {
- executor.awaitTermination(5, TimeUnit.MINUTES);
- System.out.println(executor.getCompletedTaskCount());
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- private static class DebugExecutorService extends ThreadPoolExecutor {
- public DebugExecutorService(int corePoolSize, int maximumPoolSize,
- long keepAliveTime, TimeUnit unit,
- BlockingQueue<Runnable> workQueue) {
- super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
- }
- public void beforeExecute(Thread t, Runnable r) {
- System.out.println("清理任务:" + r.getClass());
- super.beforeExecute(t, r);
- }
- }
- public static void main(String[] args) {
- AbortConnection ca = new AbortConnection();
- try {
- ca.abortConnection();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
复制代码
自动关闭
- public class SetSchema {
- public void setSchema() throws SQLException {
- try (Connection connection = DriverManager
- .getConnection("jdbc:derby://localhost/java7book")) {
- connection.setSchema("DEMO_SCHEMA");
- try (Statement stmt = connection.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT * FROM author")) {
- while (rs.next()) {
- System.out.println(rs.getString("name"));
- }
- }
- }
- }
- public static void main(String[] args) {
- SetSchema ss = new SetSchema();
- try {
- ss.setSchema();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
复制代码
自动映射
- public class UseSQLData {
-
- public void useSQLData() throws SQLException {
- try (Connection connection = DriverManager
- .getConnection("jdbc:derby://localhost/java7book")) {
- Map<String,Class<?>> typeMap = new HashMap<String,Class<?>>();
- typeMap.put("java7book.Book", Book.class);
- try (Statement stmt = connection.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT * FROM book")) {
- while (rs.next()) {
- System.out.println(rs.getObject(1, Book.class));
- }
- }
- }
- }
-
- public static void main(String[] args) {
- UseSQLData usd = new UseSQLData();
- try {
- usd.useSQLData();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
复制代码
8、Path接口( 重要接口更新 )
- public class PathUsage {
- public void usePath() {
- Path path1 = Paths.get("folder1", "sub1");
- Path path2 = Paths.get("folder2", "sub2");
- path1.resolve(path2); //folder1sub1folder2sub2
- path1.resolveSibling(path2); //folder1folder2sub2
- path1.relativize(path2); //....folder2sub2
- path1.subpath(0, 1); //folder1
- path1.startsWith(path2); //false
- path1.endsWith(path2); //false
- Paths.get("folder1/./../folder2/my.text").normalize(); //folder2my.text
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- PathUsage usage = new PathUsage();
- usage.usePath();
- }
- }
复制代码
9、DirectoryStream
- public class ListFile {
- public void listFiles() throws IOException {
- Path path = Paths.get("");
- try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, "*.*")) {
- for (Path entry: stream) {
- //使用entry
- System.out.println(entry);
- }
- }
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) throws IOException {
- ListFile listFile = new ListFile();
- listFile.listFiles();
- }
- }
复制代码
10、Files
- public class FilesUtils {
- public void manipulateFiles() throws IOException {
- Path newFile = Files.createFile(Paths.get("new.txt").toAbsolutePath());
- List<String> content = new ArrayList<String>();
- content.add("Hello");
- content.add("World");
- Files.write(newFile, content, Charset.forName("UTF-8"));
- Files.size(newFile);
- byte[] bytes = Files.readAllBytes(newFile);
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- Files.copy(newFile, output);
- Files.delete(newFile);
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) throws IOException {
- FilesUtils fu = new FilesUtils();
- fu.manipulateFiles();
- }
- }
复制代码
11、WatchService
- public class WatchAndCalculate {
- public void calculate() throws IOException, InterruptedException {
- WatchService service = FileSystems.getDefault().newWatchService();
- Path path = Paths.get("").toAbsolutePath();
- path.register(service, StandardWatchEventKinds.ENTRY_CREATE);
- while (true) {
- WatchKey key = service.take();
- for (WatchEvent<?> event : key.pollEvents()) {
- Path createdPath = (Path) event.context();
- createdPath = path.resolve(createdPath);
- long size = Files.size(createdPath);
- System.out.println(createdPath + " ==> " + size);
- }
- key.reset();
- }
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) throws Throwable {
- WatchAndCalculate wc = new WatchAndCalculate();
- wc.calculate();
- }
- }
复制代码
12、jcmd utility
jcmd是为了替代jps出现了,包含了jps的大部分功能并新增了一些新的功能。
jcmd -l列出所有的Java虚拟机,针对每一个虚拟机可以使用help列出它们支持的命令。
- jcmd -l
- 15308 org.eclipse.jetty.xml.XmlConfiguration /tmp/start4070493346048555702.properties /opt/educat/apps/conf/jetty8.xml
- 5624 sun.tools.jcmd.JCmd -l
- 20967 org.apache.flume.node.Application --no-reload-conf -f /opt/educat/flume_agent/conf/flume.conf -n log_agent
复制代码
jcmd pid help
- jcmd 15308 help
- 15308:
- The following commands are available:
- VM.commercial_features
- ManagementAgent.stop
- ManagementAgent.start_local
- ManagementAgent.start
- Thread.print
- GC.class_histogram
- GC.heap_dump
- GC.run_finalization
- GC.run
- VM.uptime
- VM.flags
- VM.system_properties
- VM.command_line
- VM.version
- help
- For more information about a specific command use 'help <command>'.
复制代码
jcmd pid VM.flags查看启动参数
- jcmd 15308 VM.flags
- 15308:
- -XX:+DisableExplicitGC
- -XX:ErrorFile=/var/patterncat/logs/catapp.vmerr.log.201505071655
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=/var/patterncat/logs/catapp.heaperr.log.201505071655 -XX:InitialHeapSize=5368709120
- -XX:+ManagementServer
- -XX:MaxGCPauseMillis=100
- -XX:MaxHeapSize=5368709120
- -XX:MaxPermSize=268435456
- -XX:+PrintAdaptiveSizePolicy
- -XX:+PrintCommandLineFlags
- -XX:+PrintGC
- -XX:+PrintGCApplicationStoppedTime
- -XX:+PrintGCDateStamps
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
- -XX:+PrintHeapAtGC
- -XX:+PrintTenuringDistribution
- -XX:StringTableSize=49999
- -XX:+UnlockExperimentalVMOptions
- -XX:+UseCompressedOops
- -XX:+UseG1GC
复制代码
jcmd pid GC.heap_dump D:d.dump 导出堆信息
jcmd pid GC.class_histogram查看系统中类的统计信息
jcmd pid VM.system_properties查看系统属性内容
jcmd pid Thread.print 打印线程栈
jcmd pid VM.uptime 查看虚拟机启动时间
jcmd pid PerfCounter.print 查看性能统计
13、fork/join
Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
14、Java Mission Control
在JDK7u40里头提供了Java Mission Control,这个是从JRockit虚拟机里头迁移过来的类似JVisualVm的东东。
15、其他
Binary Literals支持
Numeric Literals的下划线支持
Strings in switch Statements
参考
Java SE 7 Features and Enhancements |