欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)UTF-8轉(zhuǎn)Unicode的代碼詳解

 更新時(shí)間:2025年06月18日 10:43:25   作者:Katie。  
在現(xiàn)代計(jì)算機(jī)處理中,字符編碼問題始終是一個(gè)基礎(chǔ)而又重要的環(huán)節(jié),隨著國際化進(jìn)程不斷加快,UTF-8已成為互聯(lián)網(wǎng)傳輸中最常見的字符編碼之一,然而,在某些場景下需要將UTF-8編碼格式的字符串轉(zhuǎn)換為Unicode轉(zhuǎn)義序列,所以本文介紹了Java實(shí)現(xiàn)UTF-8轉(zhuǎn)Unicode的方法

項(xiàng)目背景詳細(xì)介紹

在現(xiàn)代計(jì)算機(jī)處理中,字符編碼問題始終是一個(gè)基礎(chǔ)而又重要的環(huán)節(jié)。隨著國際化進(jìn)程不斷加快,UTF-8 已成為互聯(lián)網(wǎng)傳輸中最常見的字符編碼之一。然而,在某些場景下(例如老舊系統(tǒng)集成、本地化診斷報(bào)告、日志分析、學(xué)習(xí)資料展示等),需要將 UTF-8 編碼格式的字符串轉(zhuǎn)換為 Unicode 轉(zhuǎn)義序列(形如 \uXXXX),以便于與其他系統(tǒng)兼容或方便人工閱讀與排查。

為什么需要 UTF-8 轉(zhuǎn) Unicode:

  • 兼容性需求:某些老舊系統(tǒng)或設(shè)備僅支持 \uXXXX 形式的 Unicode 轉(zhuǎn)義,需要將 UTF-8 轉(zhuǎn)換為 Unicode 表示。
  • 日志及調(diào)試:當(dāng)日志包含多語言字符時(shí),直接輸出 UTF-8 可能在某些控制臺(tái)或平臺(tái)上亂碼,將其轉(zhuǎn)為 \uXXXX 有助于統(tǒng)一格式并便于定位問題。
  • 前端展示:一些前端框架或模板引擎在處理字符串常量時(shí),需要將中文等非 ASCII 字符使用 Unicode 轉(zhuǎn)義,以避免編碼不一致導(dǎo)致的問題。
  • 教學(xué)與學(xué)習(xí):深入理解字符編碼原理,掌握從 UTF-8 字節(jié)流到 Unicode 碼點(diǎn)再到轉(zhuǎn)義形式的完整流程,具有很高的學(xué)習(xí)價(jià)值。

本項(xiàng)目旨在實(shí)現(xiàn)一個(gè)小而全的 Java 工具,能夠接收任意 UTF-8 編碼格式的字符串(包括文件內(nèi)容、網(wǎng)絡(luò)流、控制臺(tái)輸入等多種來源),并將其轉(zhuǎn)換為對應(yīng)的 Unicode 轉(zhuǎn)義字符串。項(xiàng)目兼顧性能與可讀性,適合在教育、工具集成、命令行腳本和后端服務(wù)中使用。

項(xiàng)目需求詳細(xì)介紹

為了滿足不同場景的使用需求,項(xiàng)目需要具備以下功能與特性:

核心轉(zhuǎn)換功能

  • 支持將任意 UTF-8 編碼的文本轉(zhuǎn)換為 \uXXXX 形式的 Unicode 轉(zhuǎn)義字符串。
  • 對 ASCII 可打印字符(0x20~0x7E)保持原樣輸出,不做轉(zhuǎn)義;對其他字符進(jìn)行四位或六位(對于 Supplementary Plane)轉(zhuǎn)義。

多種輸入輸出方式

  • 命令行參數(shù):接受待轉(zhuǎn)換字符串或文件路徑,通過命令行啟動(dòng)即可完成一次轉(zhuǎn)換。
  • 文件流操作:讀取指定文件(大文件需支持流式讀取,避免一次性加載導(dǎo)致內(nèi)存溢出),并將轉(zhuǎn)換后的結(jié)果輸出到目標(biāo)文件。
  • 網(wǎng)絡(luò)流支持(可選拓展):支持讀取 HTTP 響應(yīng)體或 Socket 流進(jìn)行轉(zhuǎn)換。

高性能與低內(nèi)存占用

  • 對大文件轉(zhuǎn)換時(shí),采用緩沖區(qū)分段處理,支持并發(fā)多線程轉(zhuǎn)換模式(可配置線程數(shù))。
  • 盡量避免中間字符串頻繁拼接或重復(fù)創(chuàng)建,使用 StringBuilder、字節(jié)緩存等高效手段。

友好易用的 API

  • 提供核心靜態(tài)方法 Utf8ToUnicodeConverter.convert(String input)。
  • 支持批量轉(zhuǎn)換、流式轉(zhuǎn)換、異步回調(diào)等多種方式。
  • 支持設(shè)置轉(zhuǎn)義前綴、是否保留可打印字符等可選參數(shù)。

完整文檔與測試

  • 完整代碼注釋,涵蓋方法、參數(shù)、異常等說明。
  • 單元測試覆蓋率應(yīng)達(dá)到 80% 以上。
  • README 文檔示例詳盡,包含用法示例、常見問題解答。

可擴(kuò)展與性能優(yōu)化支持

  • 代碼結(jié)構(gòu)清晰,方便之后增加對其他編碼格式(如 GBK、ISO-8859-1)與反向轉(zhuǎn)換(Unicode 轉(zhuǎn) UTF-8)功能。
  • 提供性能測試腳本,快速評估不同實(shí)現(xiàn)方案的性能差異。

相關(guān)技術(shù)詳細(xì)介紹

本項(xiàng)目主要涉及以下技術(shù)與概念:

字符編碼基礎(chǔ)

  • Unicode 標(biāo)準(zhǔn):碼點(diǎn)、平面、BMP(基本多文種平面)與 Supplementary Plane;如何表示 \uXXXX、\UXXXXXXXX。
  • UTF-8 編碼:1~4 字節(jié)可變長度編碼方案,字節(jié)格式與編碼規(guī)則(單字節(jié) 0xxx xxxx,多字節(jié) 110x xxxx 10xx xxxx,……)。
  • Java 字符串內(nèi)部表示:JVM 采用 UTF-16 存儲(chǔ)字符串,如何在 Java 中處理字節(jié)與字符之間的轉(zhuǎn)換。

Java IO/NIO

  • 經(jīng)典 IO:InputStreamReader、BufferedReader、FileInputStream、FileOutputStream 等。
  • NIO:FileChannel、ByteBuffer、MappedByteBuffer、異步 IO 等,適用于大文件高性能讀取與寫入。

多線程與并發(fā)

  • 線程池:ExecutorService、ForkJoinPool。
  • 并發(fā)安全:ConcurrentLinkedQueue、分段鎖與無鎖編程。
  • 任務(wù)劃分:如何將大文件分片,并行處理后合并結(jié)果。

工具類與開源庫

  • Apache Commons IO:提供簡便的文件拷貝、流轉(zhuǎn)換方法。
  • Guava:CharStreams、ByteStreams、ListenableFuture 等。
  • JUnit/Mockito:編寫單元測試與模擬外部依賴。

編碼性能優(yōu)化

  • 減少對象創(chuàng)建:重用 StringBuilder、緩沖區(qū)數(shù)組。
  • 零拷貝:NIO MappedByteBuffer。
  • 批量處理:減少系統(tǒng)調(diào)用次數(shù),使用大塊讀取與寫入。

實(shí)現(xiàn)思路詳細(xì)介紹

核心模塊劃分

  • Utf8ToUnicodeConverter:提供靜態(tài)方法 convert(String)、convert(Reader, Writer)、convert(Path in, Path out, Charset cs, int bufferSize, boolean preserveAscii)。
  • ChunkProcessor:多線程分片處理單元,接收一段字節(jié)區(qū)間,轉(zhuǎn)換后寫入臨時(shí)結(jié)果隊(duì)列。
  • IOUtils:對文件/網(wǎng)絡(luò)流進(jìn)行流式讀取、關(guān)閉、異常處理等。
  • PerformanceTester:性能對比工具,支持對不同 bufferSize、線程數(shù)進(jìn)行測試。

單線程轉(zhuǎn)換流程

  • 使用 InputStreamReader 將輸入字節(jié)流以 UTF-8 解碼為字符流。
  • 逐字符讀取,并判斷:
    • 若字符在 ASCII 可打印范圍,則直接寫出;
    • 否則獲取代碼點(diǎn),通過 String.format("\\u%04X", codePoint) 生成轉(zhuǎn)義;
    • 對 Supplementary Plane(codePoint > 0xFFFF),拆分成兩個(gè) UTF-16 代理對,再分別轉(zhuǎn)義。
  • 將結(jié)果寫入 BufferedWriter 并最終 flush。

多線程分片處理思路

  • 獲取文件總長度,按照 bufferSize * threadCount 劃分 N 段,每段由一個(gè)線程處理。
  • 各線程使用 FileChannel.position(start).read(ByteBuffer) 讀取指定區(qū)間,轉(zhuǎn)換后寫入 ConcurrentLinkedQueue<String>。
  • 主線程按段順序從隊(duì)列中取出結(jié)果,寫入目標(biāo)文件。

流式 API 封裝

  • 支持 convert(Reader reader, Writer writer):任何字符流輸入都可使用,無需關(guān)心底層字節(jié)來源。
  • 支持回調(diào)方式 convertAsync(String input, Consumer<String> callback):適合 Web 服務(wù)異步場景。

單元測試設(shè)計(jì)

  • 針對 ASCII、中文、Emoji、特殊符號(hào)、Supplementary Plane 進(jìn)行測試。
  • 邊界測試:空串、超長字符串、非法 UTF-8(可選忽略或拋異常)。

完整實(shí)現(xiàn)代碼

// File: src/main/java/com/example/Utf8ToUnicodeConverter.java
package com.example;
 
import java.io.*;
import java.nio.*;
import java.nio.channels.FileChannel;
import java.nio.charset.*;
import java.nio.file.*;
import java.util.concurrent.*;
import java.util.function.Consumer;
 
/**
 * Utf8ToUnicodeConverter
 * 提供將 UTF-8 編碼的文本轉(zhuǎn)換為 Unicode 轉(zhuǎn)義字符串的靜態(tài)方法。
 */
public class Utf8ToUnicodeConverter {
 
    // 默認(rèn)緩沖區(qū)大小 (8KB)
    private static final int DEFAULT_BUFFER_SIZE = 8192;
    // 默認(rèn)線程數(shù) (可根據(jù) CPU 核心數(shù)調(diào)整)
    private static final int DEFAULT_THREAD_COUNT = Runtime.getRuntime().availableProcessors();
 
    /**
     * 單一字符串轉(zhuǎn)換,返回轉(zhuǎn)換結(jié)果
     * @param input 原始 UTF-8 文本
     * @return 轉(zhuǎn)換后的 Unicode 轉(zhuǎn)義文本
     */
    public static String convert(String input) {
        if (input == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder(input.length() * 2);
        for (int i = 0; i < input.length(); i++) {
            int codePoint = input.codePointAt(i);
            if (Character.isSupplementaryCodePoint(codePoint)) {
                // 對 Supplementary Plane 拆分代理對
                char[] surrogates = Character.toChars(codePoint);
                for (char ch : surrogates) {
                    sb.append(toUnicodeEscaped(ch));
                }
                i++; // 跳過低位代理
            } else {
                char ch = input.charAt(i);
                if (ch >= 0x20 && ch <= 0x7E) {
                    sb.append(ch);
                } else {
                    sb.append(toUnicodeEscaped(ch));
                }
            }
        }
        return sb.toString();
    }
 
    /**
     * 流式轉(zhuǎn)換 API
     * @param reader 任意字符讀取器
     * @param writer 任意字符寫出器
     * @param preserveAscii 是否保留 ASCII 可打印字符
     * @throws IOException IO 異常
     */
    public static void convert(Reader reader, Writer writer, boolean preserveAscii) throws IOException {
        BufferedReader br = new BufferedReader(reader);
        BufferedWriter bw = new BufferedWriter(writer);
        int ch;
        while ((ch = br.read()) != -1) {
            char c = (char) ch;
            if (preserveAscii && c >= 0x20 && c <= 0x7E) {
                bw.write(c);
            } else {
                bw.write(toUnicodeEscaped(c));
            }
        }
        bw.flush();
    }
 
    /**
     * 文件轉(zhuǎn)換,支持多線程
     * @param in 輸入文件路徑
     * @param out 輸出文件路徑
     * @param bufferSize 緩沖區(qū)大小
     * @param threadCount 線程數(shù)量
     * @param preserveAscii 是否保留 ASCII 可打印字符
     * @throws Exception 拋出異常
     */
    public static void convert(Path in, Path out, int bufferSize, int threadCount, boolean preserveAscii) throws Exception {
        long fileSize = Files.size(in);
        long chunkSize = fileSize / threadCount;
        ExecutorService executor = Executors.newFixedThreadPool(threadCount);
        ConcurrentMap<Integer, String> results = new ConcurrentHashMap<>();
        // 分片處理
        for (int i = 0; i < threadCount; i++) {
            final int index = i;
            final long start = index * chunkSize;
            final long end = (index == threadCount - 1) ? fileSize : (start + chunkSize);
            executor.submit(() -> {
                try (FileChannel fc = FileChannel.open(in, StandardOpenOption.READ)) {
                    ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
                    fc.position(start);
                    StringBuilder partSb = new StringBuilder((int) (end - start) * 2);
                    while (fc.position() < end) {
                        buffer.clear();
                        fc.read(buffer);
                        buffer.flip();
                        CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
                        CharBuffer cb = decoder.decode(buffer);
                        for (int i1 = 0; i1 < cb.length(); i1++) {
                            char c = cb.get(i1);
                            if (preserveAscii && c >= 0x20 && c <= 0x7E) {
                                partSb.append(c);
                            } else {
                                partSb.append(toUnicodeEscaped(c));
                            }
                        }
                    }
                    results.put(index, partSb.toString());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
        }
        executor.shutdown();
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        // 按順序?qū)懭?
        try (BufferedWriter bw = Files.newBufferedWriter(out, StandardCharsets.UTF_8)) {
            for (int i = 0; i < threadCount; i++) {
                bw.write(results.get(i));
            }
        }
    }
 
    /**
     * 異步回調(diào)轉(zhuǎn)換
     * @param input 原始文本
     * @param callback 轉(zhuǎn)換完成后的回調(diào)
     */
    public static void convertAsync(String input, Consumer<String> callback) {
        CompletableFuture.supplyAsync(() -> convert(input))
                .thenAccept(callback);
    }
 
    /**
     * 將單個(gè)字符轉(zhuǎn)為 Unicode 轉(zhuǎn)義形式
     * @param ch 字符
     * @return 對應(yīng)的 \\uXXXX 格式字符串
     */
    private static String toUnicodeEscaped(char ch) {
        return String.format("\\u%04X", (int) ch);
    }
}
 
// File: src/test/java/com/example/Utf8ToUnicodeConverterTest.java
package com.example;
 
import org.junit.jupiter.api.*;
import java.nio.file.*;
import static org.junit.jupiter.api.Assertions.*;
 
/**
 * Utf8ToUnicodeConverterTest
 * 單元測試,覆蓋 ASCII、中文、Supplementary Plane、空串等場景
 */
public class Utf8ToUnicodeConverterTest {
 
    @Test
    public void testAscii() {
        String input = "Hello, World!";
        String expected = "Hello, World!";
        assertEquals(expected, Utf8ToUnicodeConverter.convert(input));
    }
    
    @Test
    public void testChinese() {
        String input = "中文測試";
        String expected = "\\u4E2D\\u6587\\u6D4B\\u8BD5";
        assertEquals(expected, Utf8ToUnicodeConverter.convert(input));
    }
 
    @Test
    public void testSupplementaryPlane() {
        String input = "??"; // U+1F60A
        String result = Utf8ToUnicodeConverter.convert(input);
        assertTrue(result.contains("\\uD83D") && result.contains("\\uDE0A"));
    }
 
    @Test
    public void testEmpty() {
        assertNull(Utf8ToUnicodeConverter.convert((String) null));
        assertEquals("", Utf8ToUnicodeConverter.convert(""));
    }
}

代碼詳細(xì)解讀

  • convert(String input)
    方法作用:將單個(gè) Java 字符串按字符遍歷,轉(zhuǎn)換為 Unicode 轉(zhuǎn)義形式的字符串。
  • convert(Reader reader, Writer writer, boolean preserveAscii)
    方法作用:對任意字符流進(jìn)行逐字符讀取與寫出,并根據(jù) preserveAscii 參數(shù)決定是否保留可打印 ASCII。
  • convert(Path in, Path out, int bufferSize, int threadCount, boolean preserveAscii)
    方法作用:基于 NIO FileChannel 和多線程將大文件分段并行轉(zhuǎn)換,最終按段序?qū)懗龅侥繕?biāo)文件。
  • convertAsync(String input, Consumer<String> callback)
    方法作用:異步執(zhí)行轉(zhuǎn)換,并在完成后通過回調(diào)返回結(jié)果,適合 Web 異步場景。
  • toUnicodeEscaped(char ch)
    方法作用:將單個(gè)字符格式化為標(biāo)準(zhǔn)的 \uXXXX 轉(zhuǎn)義字符串。

項(xiàng)目詳細(xì)總結(jié)

本項(xiàng)目通過 Java 原生 IO/NIO、線程池、Lambda 異步等技術(shù)手段,實(shí)現(xiàn)了功能完備、性能可控的 UTF-8 到 Unicode 轉(zhuǎn)義字符串轉(zhuǎn)換工具。項(xiàng)目具有以下亮點(diǎn):

  • 全面支持:從簡單字符串到大文件、多線程并行處理、異步回調(diào),全場景覆蓋。
  • 高性能:流式 IO、NIO 零拷貝、多線程分片。
  • 易用 API:靜態(tài)方法一行調(diào)用即可完成不同場景轉(zhuǎn)換。
  • 良好可擴(kuò)展性:清晰模塊劃分,后續(xù)可便捷添加其他編碼格式或反向轉(zhuǎn)換功能。
  • 測試驅(qū)動(dòng):詳盡單元測試保證功能正確性。

同時(shí),項(xiàng)目也暴露了一些可改進(jìn)點(diǎn),例如對網(wǎng)絡(luò)流的更完善支持、基于 Reactor/Netty 的異步全套實(shí)現(xiàn)、對多種字符集全面覆蓋等。后續(xù)可結(jié)合項(xiàng)目需求進(jìn)行深度優(yōu)化。

項(xiàng)目常見問題及解答

Q:ASCII 可打印字符為什么保留原樣?
A:為了保證可讀性與簡潔性,減少不必要的轉(zhuǎn)義,使結(jié)果更加直觀。

Q:如何處理非法 UTF-8 序列?
A:當(dāng)前實(shí)現(xiàn)中依賴 Java 解碼器,非法字節(jié)會(huì)拋出 MalformedInputException,可通過捕獲異常并根據(jù)需求忽略或替換。

Q:大文件轉(zhuǎn)換為何要多線程?
A:分段并行可以充分利用多核 CPU,提高轉(zhuǎn)換速度,并減少單線程瓶頸。

Q:為何代碼中使用 ConcurrentHashMap 而非 List?
A:保證并發(fā)寫入安全,且按索引順序輸出時(shí)可隨機(jī)訪問。

Q:Emoji 等 Supplementary Plane 字符為何要拆分代理對?
A:Java 內(nèi)部使用 UTF-16 存儲(chǔ),Supplementary Plane 字符由高低代理對組成,需分別轉(zhuǎn)義。

擴(kuò)展方向與性能優(yōu)化

  • 支持更多編碼:可增加 GBK、ISO-8859-1 等編碼與反向轉(zhuǎn)換功能,統(tǒng)一封裝至 CharsetConverter 通用接口。
  • 異步非阻塞 IO:基于 Netty 或 Reactor Netty,實(shí)現(xiàn)網(wǎng)絡(luò)流的全異步無阻塞轉(zhuǎn)換服務(wù)。
  • Native 方法加速:借助 JNI 調(diào)用 C/C++ 底層庫實(shí)現(xiàn)高性能轉(zhuǎn)換。
  • GPU 加速:針對海量文本轉(zhuǎn)換,可嘗試 CUDA/OpenCL 等 GPU 方案。
  • 內(nèi)存復(fù)用:對 ByteBuffer、CharBuffer 池化重用,減少垃圾回收開銷。
  • 批量 API 優(yōu)化:提供批量數(shù)組轉(zhuǎn)換、批量流轉(zhuǎn)換接口,減少方法調(diào)用開銷。
  • 字符轉(zhuǎn)義策略擴(kuò)展:支持自定義轉(zhuǎn)義前綴(如 &#xXXXX;)或 HTML 實(shí)體(&#20013;)等。
  • 監(jiān)控與指標(biāo):集成 Micrometer/Prometheus,實(shí)時(shí)監(jiān)控轉(zhuǎn)換速率、延遲、內(nèi)存使用等指標(biāo),動(dòng)態(tài)調(diào)整參數(shù)。

以上就是Java實(shí)現(xiàn)UTF-8轉(zhuǎn)Unicode的代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于Java UTF-8轉(zhuǎn)Unicode的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java多線程編程中的并發(fā)安全問題及解決方法

    Java多線程編程中的并發(fā)安全問題及解決方法

    保障多線程并發(fā)安全,解決線程同步與鎖競爭問題,提高應(yīng)用性能與可靠性。多線程編程需要考慮線程安全性,使用同步機(jī)制保證共享變量的一致性,避免線程競爭導(dǎo)致的數(shù)據(jù)不一致與死鎖等問題。常用的同步機(jī)制包括synchronized、ReentrantLock、volatile等
    2023-04-04
  • SpringBoot接收參數(shù)使用的注解實(shí)例講解

    SpringBoot接收參數(shù)使用的注解實(shí)例講解

    這篇文章主要介紹了詳解SpringBoot接收參數(shù)使用的幾種常用注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java項(xiàng)目中常用指標(biāo)UV?PV?QPS?TPS含義以及統(tǒng)計(jì)方法

    java項(xiàng)目中常用指標(biāo)UV?PV?QPS?TPS含義以及統(tǒng)計(jì)方法

    文章介紹了現(xiàn)代Web應(yīng)用中性能監(jiān)控和分析的重要性,涵蓋了UV、PV、QPS、TPS等關(guān)鍵指標(biāo)的統(tǒng)計(jì)方法,并提供了示例代碼,同時(shí),文章還討論了性能優(yōu)化和瓶頸分析的策略,以及使用Grafana等可視化工具進(jìn)行監(jiān)控與告警的重要性
    2025-01-01
  • spring schedule任務(wù)調(diào)度方式

    spring schedule任務(wù)調(diào)度方式

    這篇文章主要介紹了spring schedule任務(wù)調(diào)度方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • IDEA使用JDBC導(dǎo)入配置jar包連接MySQL數(shù)據(jù)庫

    IDEA使用JDBC導(dǎo)入配置jar包連接MySQL數(shù)據(jù)庫

    這篇文章介紹了IDEA使用JDBC安裝配置jar包連接MySQL數(shù)據(jù)庫的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-12-12
  • Java中Map與對象之間互相轉(zhuǎn)換的幾種常用方式

    Java中Map與對象之間互相轉(zhuǎn)換的幾種常用方式

    在Java中將對象和Map相互轉(zhuǎn)換是常見的操作,可以通過不同的方式實(shí)現(xiàn)這種轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Java中Map與對象之間互相轉(zhuǎn)換的幾種常用方式,需要的朋友可以參考下
    2024-01-01
  • Java8 Optional的詳細(xì)使用教程

    Java8 Optional的詳細(xì)使用教程

    這篇文章主要給大家介紹了關(guān)于Java8 Optional的詳細(xì)使用教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • IDEA搭建配置Java?Web項(xiàng)目的詳細(xì)步驟

    IDEA搭建配置Java?Web項(xiàng)目的詳細(xì)步驟

    這篇文章詳細(xì)介紹了如何使用IDEA創(chuàng)建和配置JavaWeb項(xiàng)目,包括項(xiàng)目結(jié)構(gòu)設(shè)置、WEB-INF目錄和jsp文件的創(chuàng)建,以及Tomcat的配置,是Java初學(xué)者的實(shí)用指南,需要的朋友可以參考下
    2024-10-10
  • Spring中的@ConfigurationProperties在方法上的使用詳解

    Spring中的@ConfigurationProperties在方法上的使用詳解

    這篇文章主要介紹了Spring中的@ConfigurationProperties在方法上的使用詳解,@ConfigurationProperties應(yīng)該經(jīng)常被使用到,作用在類上的時(shí)候,將該類的屬性取值?與配置文件綁定,并生成配置bean對象,放入spring容器中,提供給其他地方使用,需要的朋友可以參考下
    2024-01-01
  • SpringSecurity集成圖片驗(yàn)證碼的詳細(xì)過程

    SpringSecurity集成圖片驗(yàn)證碼的詳細(xì)過程

    SpringSecurity是通過過濾器鏈來完成的,接下來的驗(yàn)證碼,可以嘗試創(chuàng)建一個(gè)過濾器放到Security的過濾器鏈中,在自定義的過濾器中比較驗(yàn)證碼,本文通過實(shí)例代碼介紹SpringSecurity集成圖片驗(yàn)證碼的詳細(xì)過程,感興趣的朋友一起看看吧
    2023-12-12

最新評論