从此
📄文章 #️⃣专题 🌐上网 📺 🛒 📱

Java编程开发技术


Java综合

Java/JDK下载地址 - https://oracle.com/javadownload/

新特性有:结构化并发(JEP 453)、外部函数和内存API(JEP 424)等。

JDK20+: URI.create("https://congci.com").toURL(); 取代了过时的 new URL("https://congci.com");

Java开发工具IDE - IntelliJ IDEANetBeansEclipse


Java基础


JDK21+(JEP445)新版main函数最简写法:
void main() { System.out.println("Hello, World!"); }

Linux创建Java主函数文件: dd of=/tmp/hi.java << EOF void main() { System.out.println(System.getProperty("java.version")); } EOF 启动单文件源码命令: java --enable-preview --source 21 /tmp/hi.java 孵化特性还需要添加模块儿 --add-modules jdk.incubator.concurrent 单jar包启动: java -jar ./app.jar com.jpkg.App 或MANIFEST.MF用Class-Path: other.jar指定额外*.jar 多jar包启动: java -cp ./app.jar;./guava-31.1-jre.jar com.jpkg.App
JDK21以前版本主函数完整写法:
// 若为Linux Shebang脚本(如java.sh)则起行必须写上#!....

#!/usr/bin/java --source 11
class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!"); 
    }
}

chmod +x java.sh
./java.sh
[或] java --release 11 java.sh  传参...

标准编译:
  javac hi.java
  [指定字节码版本/JDK9前用单横杠的-source]:javac --help输出最低支持为Java8(JDK9+为Java6)
  javac --release 11 hi.java
  java hi
  带包名则 java pkg/hi

  或 JDK11+支持同时编译加执行:java hi.java


Windows PowerShell执行Java程序:
  & (gcm java.exe).Path --version

  Java打开命令行控制台并切换至指定目录:
        String[] cmd = {"cmd", "/c", "start", "powershell.exe", "-NoExit", "-Command", "Set-location", "D:\\"};
        new ProcessBuilder(cmd).start();



Java语法简写

  var arrays = {"a","b"}; // or new String[]{"a","b"};


特殊备忘

获取Java版本 - System.getProperty("java.version");
获取系统临时目录 - System.getProperty("java.io.tmpdir"); // C:\Users\x\AppData\Local\Temp\
路径不存在的方法 - Files.notExists(dirPath);


JDK Foreign Function(取代JNA和JNI)系统调用C库实例:
  var nl = Linker.nativeLinker();
  var mh = nl.downcallHandle(nl.defaultLookup().find("_getpid").get(),
    FunctionDescriptor.of(JAVA_INT)); //or FunctionDescriptor.ofVoid(...)
  // mh.invokeExact(Arena.openConfined().allocateUtf8String("x"));
  var r = (int) mh.invokeExact(); System.out.println(r);

  纯Java获取Process ID (PID):ProcessHandle.current().pid();




虚拟线程(Virtual Threads)/协程:

Thread.startVirtualThread(() -> { Thread.currentThread().isVirtual(); });
Thread.ofVirtual().name("可传递自定义数据").start(() -> System.out.println());

结构化并发(Structured Concurrency)

  多任务并发时,只要其中之一完成,就关闭所有任务线程:
        try (var sts = new StructuredTaskScope.ShutdownOnSuccess()) {
            sts.fork(() -> findUser()); sts.fork(() -> fetchOrder());
            sts.joinUntil(Instant.now().plusSeconds(60)).result();
        } catch (InterruptedException | TimeoutException | ExecutionException ex) {
            System.err.println(ex);
        }

    老版本方式:Executors.newCachedThreadPool().invokeAny(List.of(() -> UUID.randomUUID()));

Java兼容性

JDK 19(ClassVersion 63); JDK 20(ClassVersion 64)

Apache NetBeans 18首选JDK 20,若用JDK 21+则警告“Unsupported Java Runtime”,但不影响使用; 该IDE配置的Gradle,若不支持高版本JDK则报错; 注意 - 版本发布日总会延误20天!
gradle.properties可指定IDE所用JDK之外的版本:netbeans.hint.jdkPlatform=JDK_20

Gradle 8.1 最高兼容 JDK 20;Gradle 8.0 最高兼容 JDK 19

Android Studio Dolphin 2021.3.1 项目 最高兼容 JDK 11


jpackage - 打包java程序为系统安装包("app-image", "exe", "msi", "rpm", "deb", "pkg", "dmg")

Java程序打包




GraalVM Native Image

Java原生应用专题



Java语法

Java语言关键词、保留词列表


综合

HTML转义 - guava 库
com.google.common.html.HtmlEscapers.htmlEscaper().escape(s)
  EQ 就是 EQUAL等于 
  NE 就是 NOT EQUAL不等于 
  GT 就是 GREATER THAN大于  
  LT 就是 LESS THAN小于 
  GE 就是 GREATER THAN OR EQUAL 大于等于 
  LE 就是 LESS THAN OR EQUAL 小于等于


Java Web App | 网站应用

Java Servlet、Spring等网页开发专题


Java Web Server | HTTP网站服务监听

java -m jdk.httpserver -p 8000
或 C:\Progra~1\Java\jdk-21\bin\jwebserver.exe -p 8000
可选参数:默认为当前目录,可指定其他目录 -d D:\

Java Socket

Java Socket 网络编程详解


Java Swing | 桌面GUI程序

JOptionPane.showMessageDialog(null, "对话框文字");

关闭所有extends WindowAdapter覆写了windowClosing方法的窗口:
        var we = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(we);

JDBC

  JDBC(Java Database Connectivity) - 关系型数据库管理技术入门

        // 若用了mariadb-java-client,则必须修改URL协议为 jdbc:mariadb://...
        String url = "jdbc:mysql://127.0.0.1:3306/db-name";
        String user = "root", password = "1";
        try (var conn = DriverManager.getConnection(url, user, password);
                Statement sta = conn.createStatement()) {
            // 或 参数化 var ps = conn.prepareStatement(sql);
            // ps.setString(1, name); // index从1数起
            ResultSet rs = sta.executeQuery("select 'Hi'"); // ps.executeUpdate(); 
            if(rs.next()){ System.out.println(rs.getObject(1)); } // Statement关闭时会连带关闭ResultSet
        } catch (SQLException ex) { System.err.println(ex); }

        // 今日统计 - select COUNT(ID) AS count FROM article WHERE TO_DAYS(AccessTime)=TO_DAYS(NOW())
Java Optional类:参考文章
    对象嵌对象判null传统写法:
    if (p!= null && p.getLocation() != null && p.getLocation().getCity() != null) {
        return p.getLocation().getCity().toLowerCase();
    }
    简写:
    Optional.ofNullable(p).map(Person::getLocation)
    .map(Location::getCity).map(String::toLowerCase);
    

 

Gradle & Maven

        repositories {
            mavenLocal()
            mavenCentral()
            //google()
            maven {
                url "https://x.com/x/maven-public-snapshot/"
                content {
                    includeGroup "com.x.module"
                    //includeGroup "com.x.our"
                }
            }
            maven {
                url "https://x.com/x/maven-private-snapshot/"
                content { includeGroup "com.x.our" }
                authentication {
                    digest(BasicAuthentication)
                }
                credentials {
                    username 'our'
                    password '[password]'
                }
            }
        }