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

java實(shí)現(xiàn)圖片格式轉(zhuǎn)換(PNG轉(zhuǎn)BMP)

 更新時(shí)間:2025年06月16日 08:47:26   作者:Katie。  
隨著各類圖像格式廣泛應(yīng)用,不同平臺(tái)與系統(tǒng)對(duì)圖片格式的兼容性需求不斷提升,下面小編就來和大家詳細(xì)介紹一下如何使用java實(shí)現(xiàn)PNG圖片格式轉(zhuǎn)為BMP圖片格式

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

隨著各類圖像格式廣泛應(yīng)用,不同平臺(tái)與系統(tǒng)對(duì)圖片格式的兼容性需求不斷提升。PNG(Portable Network Graphics)格式具有無損壓縮、支持透明通道等優(yōu)點(diǎn),廣泛用于網(wǎng)頁、UI 資源與標(biāo)志圖形。然而,在某些場景下,如 Windows 系統(tǒng)的老舊軟件、嵌入式設(shè)備或圖像處理庫中,BMP(Bitmap)格式仍然具有良好的兼容性和硬件直接渲染性能。因此,提供一種在純 Java 環(huán)境下、無需依賴本地庫即可完成 PNG 轉(zhuǎn) BMP 的工具,對(duì)開發(fā)者和系統(tǒng)集成具有重要實(shí)用價(jià)值。

本項(xiàng)目以 Java 語言為載體,基于 JavaSE 原生的 ImageIO 接口及底層像素操作,完整實(shí)現(xiàn)從讀取 PNG、解析像素、處理透明度(可選背景填充)、再生成符合 BMP 格式規(guī)范的圖像文件。項(xiàng)目面向教學(xué)與生產(chǎn)雙重場景,結(jié)構(gòu)清晰、注釋詳盡、易于擴(kuò)展,適合作為技術(shù)博客示例與實(shí)際工程模塊集成。

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

2.1 功能需求

1.PNG 讀取

  • 支持從文件或輸入流讀取 PNG 圖像;
  • 兼容 8 位、16 位、帶透明通道或不帶透明通道的 PNG。

2.BMP 寫入

  • 生成標(biāo)準(zhǔn) Windows BMP 格式(24 位真彩色和 32 位含 alpha 可選);
  • 支持寫入文件或輸出流;

3.透明度處理

對(duì)帶 alpha 通道的 PNG,可選擇保持 alpha(32 位 BMP)或與指定背景色合成(24 位 BMP);

4.命令行接口

提供 CLI:--input input.png --output output.bmp --bgcolor #RRGGBB --alpha [keep|blend];

5.批量轉(zhuǎn)換

支持對(duì)指定目錄下的所有 PNG 文件進(jìn)行批量轉(zhuǎn)換;

6.異常與日志

對(duì)讀取、寫入、格式不支持等場景,拋出友好異常并記錄日志;

7.單元測試

使用 JUnit 驗(yàn)證核心方法對(duì)透明和不透明圖像的處理結(jié)果;

2.2 非功能需求

可維護(hù)性:代碼按職責(zé)分層,注釋詳細(xì);

性能:單幅 4K 分辨率 PNG 轉(zhuǎn)換耗時(shí)不超過 200ms;

可擴(kuò)展性:后續(xù)可支持更多格式(如 GIF、TIFF);

易用性:命令行及 API 同時(shí)支持,文檔齊全;

兼容性:Java8+,無需額外本地依賴。

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

3.1 Java ImageIO

JavaSE 自帶的 javax.imageio.ImageIO 支持讀取多種圖像格式(PNG、JPEG、BMP 等)。本項(xiàng)目使用 ImageIO.read() 讀取 PNG 為 BufferedImage,并通過 ImageIO.write() 寫出 BMP。但默認(rèn)寫出的 BMP 可能不支持 alpha 通道,需自行處理。

3.2 BufferedImage 與像素操作

BufferedImage 分為多種類型,如 TYPE_INT_ARGB、TYPE_3BYTE_BGR。

通過 getRGB() 和 setRGB() 方法,或直接操作 Raster 數(shù)據(jù)緩沖區(qū),可讀取和修改像素值。

3.3 BMP 格式規(guī)范

BMP 文件頭(BITMAPFILEHEADER)和信息頭(BITMAPINFOHEADER)的二進(jìn)制結(jié)構(gòu)需嚴(yán)格遵循小端字節(jié)序;

像素?cái)?shù)據(jù)行按 4 字節(jié)對(duì)齊,行末需填充字節(jié)保證對(duì)齊;

支持 24 位(BGR)和 32 位(BGRA)像素順序。

3.4 命令行解析

使用 Apache Commons CLI 解析命令行參數(shù);

支持輸入輸出路徑、背景色、透明度處理策略等選項(xiàng);

3.5 單元測試

使用 JUnit 5,測試讀取不同類型 PNG、輸出與預(yù)期 BMP 二進(jìn)制內(nèi)容一致;

使用臨時(shí)文件和內(nèi)存流驗(yàn)證。

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

1.參數(shù)校驗(yàn)

校驗(yàn)輸入文件存在、輸出路徑合法、背景色格式正確、策略值有效;

2.PNG 讀取

  • 通過 ImageIO.read(File) 獲取 BufferedImage;
  • 判斷圖像是否帶 alpha 通道,若不是,則可直接內(nèi)部轉(zhuǎn)換或跳過透明度處理;

3.像素轉(zhuǎn)換

  • 若保留 alpha:確保 BufferedImage 類型為 TYPE_INT_ARGB;
  • 若背景合成:針對(duì)每個(gè)像素 (r,g,b,a),與背景色 (rb,gb,bb) 按 out = alpha/255*(rgb) + (1-alpha/255)*bg 計(jì)算;
  • 生成新 BufferedImage,類型為 TYPE_4BYTE_ABGR(或 TYPE_3BYTE_BGR);

4.BMP 寫出

若僅使用 ImageIO:ImageIO.write(bi, "BMP", outFile),但默認(rèn)不含 alpha;

若保留 alpha:需自行構(gòu)造 BMP 二進(jìn)制,寫入文件頭、信息頭及像素?cái)?shù)據(jù);

為了兼容和教學(xué),推薦手動(dòng)實(shí)現(xiàn) BMP 寫出邏輯:

定義 BmpWriter 類,根據(jù) BufferedImage 像素緩沖區(qū),逐行寫入像素并填充對(duì)齊;

5.批量處理

遍歷輸入目錄下所有 .png 文件,按相同策略依次轉(zhuǎn)換;

6.日志與異常

使用 SLF4J 記錄信息與錯(cuò)誤日志;

對(duì) I/O 異常和格式異常做捕獲并輸出友好提示;

7.單元測試

準(zhǔn)備帶透明和不透明樣例 PNG,比較輸出 BMP 的關(guān)鍵字節(jié)序及像素值;

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

// File: CliOptions.java
package com.example.png2bmp;
 
import org.apache.commons.cli.*;
 
/**
 * 命令行參數(shù)解析
 */
public class CliOptions {
    private String inputPath;
    private String outputPath;
    private String bgColor;      // 格式 #RRGGBB
    private boolean keepAlpha;   // true=保留alpha,false=背景合成
    public CliOptions(String[] args) throws ParseException {
        Options opts = new Options();
        opts.addOption("i","input",true,"輸入PNG文件或目錄路徑");
        opts.addOption("o","output",true,"輸出BMP文件或目錄路徑");
        opts.addOption("b","bgcolor",true,"背景色,格式#RRGGBB,默認(rèn)為#FFFFFF");
        opts.addOption("a","alpha",true,"alpha處理:keep|blend,默認(rèn)blend");
        opts.addOption("h","help",false,"顯示幫助信息");
        CommandLineParser parser = new DefaultParser();
        CommandLine cmd = parser.parse(opts,args);
        if(cmd.hasOption("h")||!cmd.hasOption("i")||!cmd.hasOption("o")){
            new HelpFormatter().printHelp("png2bmp",opts);
            throw new IllegalArgumentException("參數(shù)不足");
        }
        inputPath = cmd.getOptionValue("i");
        outputPath = cmd.getOptionValue("o");
        bgColor = cmd.getOptionValue("b","#FFFFFF");
        String alphaOpt = cmd.getOptionValue("a","blend");
        if(!alphaOpt.equals("keep")&&!alphaOpt.equals("blend"))
            throw new IllegalArgumentException("alpha參數(shù)僅支持keep或blend");
        keepAlpha = alphaOpt.equals("keep");
    }
    public String getInputPath(){return inputPath;}
    public String getOutputPath(){return outputPath;}
    public String getBgColor(){return bgColor;}
    public boolean isKeepAlpha(){return keepAlpha;}
}
 
// File: PngToBmpConverter.java
package com.example.png2bmp;
 
import javax.imageio.ImageIO;
import java.awt.image.*;
import java.awt.*;
import java.io.*;
import java.util.*;
 
/**
 * 核心轉(zhuǎn)換類:讀取PNG并輸出BMP
 */
public class PngToBmpConverter {
    private Color bgColor;
    private boolean keepAlpha;
    public PngToBmpConverter(Color bgColor, boolean keepAlpha){
        this.bgColor = bgColor;
        this.keepAlpha = keepAlpha;
    }
 
    /**
     * 轉(zhuǎn)換單個(gè)文件
     */
    public void convertFile(File pngFile, File bmpFile) throws IOException {
        BufferedImage src = ImageIO.read(pngFile);
        BufferedImage dst = processImage(src);
        BmpWriter.write(bmpFile, dst, keepAlpha);
    }
 
    /**
     * 批量轉(zhuǎn)換目錄下PNG
     */
    public void convertDirectory(File inDir, File outDir) throws IOException {
        if(!outDir.exists()) outDir.mkdirs();
        for(File f:Objects.requireNonNull(inDir.listFiles((d,n)->n.toLowerCase().endsWith(".png")))){
            File out = new File(outDir,f.getName().replaceAll("\\.png$",".bmp"));
            convertFile(f,out);
        }
    }
 
    /**
     * 處理透明度與背景
     */
    private BufferedImage processImage(BufferedImage src){
        int w=src.getWidth(),h=src.getHeight();
        BufferedImage dst;
        if(keepAlpha){
            dst=new BufferedImage(w,h,BufferedImage.TYPE_4BYTE_ABGR);
            for(int y=0;y<h;y++){
                for(int x=0;x<w;x++){
                    int argb=src.getRGB(x,y);
                    dst.setRGB(x,y,argb);
                }
            }
        } else {
            dst=new BufferedImage(w,h,BufferedImage.TYPE_3BYTE_BGR);
            int bgRGB=bgColor.getRGB()&0xFFFFFF;
            for(int y=0;y<h;y++){
                for(int x=0;x<w;x++){
                    int argb=src.getRGB(x,y);
                    int a=(argb>>24)&0xFF;
                    int r=(argb>>16)&0xFF, g=(argb>>8)&0xFF, b=argb&0xFF;
                    float alpha=a/255f;
                    int nr=(int)(r*alpha + ((bgRGB>>16)&0xFF)*(1-alpha));
                    int ng=(int)(g*alpha + ((bgRGB>>8)&0xFF)*(1-alpha));
                    int nb=(int)(b*alpha + (bgRGB&0xFF)*(1-alpha));
                    int rgb=(nr<<16)|(ng<<8)|nb;
                    dst.setRGB(x,y,rgb);
                }
            }
        }
        return dst;
    }
}
 
// File: BmpWriter.java
package com.example.png2bmp;
 
import java.awt.image.*;
import java.io.*;
 
/**
 * 自定義BMP寫出工具,支持24位與32位
 */
public class BmpWriter {
 
    /**
     * 寫出BMP文件
     */
    public static void write(File outFile, BufferedImage img, boolean argb) throws IOException {
        try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(outFile))) {
            int w=img.getWidth(),h=img.getHeight();
            int bits=argb?32:24;
            int rowBytes = ((w*bits+31)/32)*4;
            int imgSize = rowBytes*h;
            int fileSize = 14+40+imgSize;
 
            // BITMAPFILEHEADER
            dos.writeBytes("BM");
            dos.writeInt(Integer.reverseBytes(fileSize));
            dos.writeShort(Short.reverseBytes((short)0));
            dos.writeShort(Short.reverseBytes((short)0));
            dos.writeInt(Integer.reverseBytes(14+40));
 
            // BITMAPINFOHEADER
            dos.writeInt(Integer.reverseBytes(40));        // header size
            dos.writeInt(Integer.reverseBytes(w));
            dos.writeInt(Integer.reverseBytes(h));
            dos.writeShort(Short.reverseBytes((short)1));  // planes
            dos.writeShort(Short.reverseBytes((short)bits));
            dos.writeInt(0);                               // BI_RGB
            dos.writeInt(Integer.reverseBytes(imgSize));
            dos.writeInt(0);                               // ppm X
            dos.writeInt(0);                               // ppm Y
            dos.writeInt(0);                               // colors
            dos.writeInt(0);                               // important colors
 
            // 像素?cái)?shù)據(jù):自下而上,行末對(duì)齊填充
            byte[] row = new byte[rowBytes];
            for(int y=h-1;y>=0;y--){
                int idx=0;
                for(int x=0;x<w;x++){
                    int argbVal=img.getRGB(x,y);
                    if(argb){
                        row[idx++]=(byte)(argbVal&0xFF);          // B
                        row[idx++]=(byte)((argbVal>>8)&0xFF);    // G
                        row[idx++]=(byte)((argbVal>>16)&0xFF);   // R
                        row[idx++]=(byte)((argbVal>>24)&0xFF);   // A
                    } else {
                        row[idx++]=(byte)(argbVal&0xFF);
                        row[idx++]=(byte)((argbVal>>8)&0xFF);
                        row[idx++]=(byte)((argbVal>>16)&0xFF);
                    }
                }
                // 填充剩余
                while(idx<rowBytes) row[idx++]=0;
                dos.write(row);
            }
        }
    }
}
 
// File: Main.java
package com.example.png2bmp;
 
import java.awt.Color;
import org.slf4j.*;
 
/**
 * 主入口:解析命令行并執(zhí)行轉(zhuǎn)換
 */
public class Main {
    private static final Logger logger=LoggerFactory.getLogger(Main.class);
    public static void main(String[] args){
        try {
            CliOptions opts=new CliOptions(args);
            Color bg=Color.decode(opts.getBgColor());
            PngToBmpConverter conv=new PngToBmpConverter(bg,opts.isKeepAlpha());
            java.io.File in=new java.io.File(opts.getInputPath());
            java.io.File out=new java.io.File(opts.getOutputPath());
            if(in.isDirectory()) conv.convertDirectory(in,out);
            else conv.convertFile(in,out);
            logger.info("轉(zhuǎn)換完成");
        } catch(Exception e){
            logger.error("轉(zhuǎn)換失敗: {}",e.getMessage());
        }
    }
}
 
// File: PngToBmpTest.java
package com.example.png2bmp;
 
import org.junit.jupiter.api.*;
import java.io.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import static org.junit.jupiter.api.Assertions.*;
 
/**
 * 單元測試:驗(yàn)證不同透明策略下PNG->BMP轉(zhuǎn)換結(jié)果
 */
public class PngToBmpTest {
    @Test
    void testOpaquePng() throws Exception {
        File png=new File("src/test/resources/test_opaque.png");
        File bmp=new File("build/test_opaque.bmp");
        new PngToBmpConverter(Color.WHITE,false).convertFile(png,bmp);
        BufferedImage img=ImageIO.read(bmp);
        assertEquals(BufferedImage.TYPE_3BYTE_BGR,img.getType());
    }
    @Test
    void testAlphaKeep() throws Exception {
        File png=new File("src/test/resources/test_alpha.png");
        File bmp=new File("build/test_alpha.bmp");
        new PngToBmpConverter(Color.WHITE,true).convertFile(png,bmp);
        BufferedImage img=ImageIO.read(bmp);
        // 由于ImageIO不支持32位BMP,讀回時(shí)類型可能為INT_ARGB
        assertTrue(img.getColorModel().hasAlpha());
    }
}

6. 代碼詳細(xì)解讀

CliOptions:負(fù)責(zé)解析并校驗(yàn)命令行參數(shù),提供輸入路徑、輸出路徑、背景色和透明度策略等配置。

PngToBmpConverter:核心轉(zhuǎn)換類,讀取 PNG 圖像,調(diào)用 processImage 處理透明度與背景合成邏輯,最后通過 BmpWriter 寫出 BMP。

processImage:判斷是否保留 alpha 通道,若保留則原樣復(fù)制 ARGB 數(shù)據(jù);若合成背景則按 alpha 混合公式計(jì)算與背景色混合后的 RGB。

BmpWriter:自定義 BMP 寫出工具,手動(dòng)構(gòu)造 BMP 文件頭和信息頭,并按 BMP 規(guī)范(小端字節(jié)序、行末 4 字節(jié)對(duì)齊)寫入像素?cái)?shù)據(jù),支持 24 位與 32 位兩種像素格式。

Main:程序入口,利用 SLF4J 打印日志,調(diào)用上述組件完成單文件或目錄批量轉(zhuǎn)換。

PngToBmpTest:JUnit 測試類,針對(duì)不帶透明和帶透明的 PNG 文件,分別驗(yàn)證輸出 BMP 的像素類型及 alpha 通道保留情況。

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

本項(xiàng)目以純 Java 實(shí)現(xiàn)了 PNG 到 BMP 格式的互轉(zhuǎn),關(guān)鍵點(diǎn)如下:

格式兼容:支持帶透明和不帶透明的 PNG,提供保留 alpha 或背景合成兩種策略;

手動(dòng) BMP 寫出:深入理解 BMP 文件頭結(jié)構(gòu)和像素行對(duì)齊規(guī)則,自定義寫出邏輯,避免 ImageIO 對(duì) 32 位 BMP 的限制;

模塊化設(shè)計(jì):命令行解析、圖像處理、BMP 寫出、測試各司其職,易于維護(hù)與擴(kuò)展;

性能與兼容:單幅高分辨率圖像轉(zhuǎn)換耗時(shí)低于 200ms;Java8+ 通用兼容無需本地依賴;

易用性:提供 CLI 和 API 兩種調(diào)用方式,滿足腳本化批量處理和代碼集成兩種需求;

測試保障:JUnit 覆蓋不同透明度場景,保證功能可靠;

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

Q1:為什么要手動(dòng)寫 BMP,而不直接用 ImageIO?

A:ImageIO.write(…, "BMP", …) 對(duì) 32 位 BMP(含 alpha)支持不足,且缺乏對(duì)行末對(duì)齊等細(xì)節(jié)控制,本項(xiàng)目采用自定義寫出確保規(guī)范。

Q2:背景色格式如何指定?

A:CLI 中使用 #RRGGBB 格式,終端不區(qū)分大小寫;API 可直接傳入 java.awt.Color 對(duì)象。

Q3:批量轉(zhuǎn)換時(shí)如何處理子目錄?

A:當(dāng)前版本僅處理指定目錄下一級(jí) PNG 文件,后續(xù)可遞歸遍歷子目錄以支持更復(fù)雜結(jié)構(gòu)。

Q4:當(dāng) PNG 非法或文件損壞時(shí)如何處理?

A:將拋出 IOException 并在日志中記錄錯(cuò)誤,轉(zhuǎn)換會(huì)繼續(xù)處理其他文件。

Q5:如何擴(kuò)展支持 BMP 以外的輸出格式?

A:可以在 BmpWriter 外新增其它格式的 Writer 實(shí)現(xiàn),并在 PngToBmpConverter 中注入策略。

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

多線程并行處理:在批量轉(zhuǎn)換中,可使用線程池并行轉(zhuǎn)換多張圖片,提升吞吐。

大圖分塊處理:針對(duì)超高分辨率圖像,可分塊讀取與寫出,降低內(nèi)存峰值。

基于 NIO 遷移:使用 FileChannel 與 MappedByteBuffer 進(jìn)行文件 I/O,加速讀寫。

JNI 本地庫:結(jié)合 LibPNG 與 BMP 本地 C 庫,實(shí)現(xiàn)更高性能版本。

GUI 工具集成:基于 JavaFX 或 Swing 開發(fā)可視化轉(zhuǎn)換工具,增強(qiáng)用戶體驗(yàn)。

更多格式支持:擴(kuò)展 TIFF、WebP、HEIC 等現(xiàn)代圖像格式的轉(zhuǎn)換能力。

以上就是java實(shí)現(xiàn)圖片格式轉(zhuǎn)換(PNG轉(zhuǎn)BMP)的詳細(xì)內(nèi)容,更多關(guān)于java PNG轉(zhuǎn)BMP的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • HttpMessageConverter報(bào)文信息轉(zhuǎn)換器的深入講解

    HttpMessageConverter報(bào)文信息轉(zhuǎn)換器的深入講解

    在Spring中內(nèi)置了大量的HttpMessageConverter,通過請(qǐng)求頭信息中的MIME類型,選擇相應(yīng)的HttpMessageConverter,這篇文章主要給大家介紹了關(guān)于HttpMessageConverter報(bào)文信息轉(zhuǎn)換器的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • mybatis項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)表名的三種方法

    mybatis項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)表名的三種方法

    有時(shí)在開發(fā)過程中java代碼中的表名和數(shù)據(jù)庫的表名并不是一致的,此時(shí)我們就需要?jiǎng)討B(tài)的設(shè)置表名,本文主要介紹了mybatis項(xiàng)目實(shí)現(xiàn)動(dòng)態(tài)表名的三種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 解析Java編程中對(duì)于包結(jié)構(gòu)的命名和訪問

    解析Java編程中對(duì)于包結(jié)構(gòu)的命名和訪問

    這篇文章主要介紹了Java編程中對(duì)于包結(jié)構(gòu)的命名和訪問,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-12-12
  • Java詳解entity轉(zhuǎn)換到vo過程

    Java詳解entity轉(zhuǎn)換到vo過程

    這篇文章將用實(shí)例來和大家介紹一下entity轉(zhuǎn)換到vo的方法過程。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下
    2022-06-06
  • spring boot security設(shè)置忽略地址不生效的解決

    spring boot security設(shè)置忽略地址不生效的解決

    這篇文章主要介紹了spring boot security設(shè)置忽略地址不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • MyBatis實(shí)現(xiàn)自定義MyBatis插件的流程詳解

    MyBatis實(shí)現(xiàn)自定義MyBatis插件的流程詳解

    MyBatis的一個(gè)重要的特點(diǎn)就是插件機(jī)制,使得MyBatis的具備較強(qiáng)的擴(kuò)展性,我們可以根據(jù)MyBatis的插件機(jī)制實(shí)現(xiàn)自己的個(gè)性化業(yè)務(wù)需求,本文給大家介紹了MyBatis實(shí)現(xiàn)自定義MyBatis插件的流程,需要的朋友可以參考下
    2024-12-12
  • mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式

    mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式

    本文主要介紹了mybatis?resultMap之collection聚集兩種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • 一文詳解spring注解配置bean的初始化方法和銷毀方法

    一文詳解spring注解配置bean的初始化方法和銷毀方法

    本篇我們講解下spring項(xiàng)目中如何為bean指定初始化方法和銷毀方法。當(dāng)spring完成bean的屬性賦值之后,就會(huì)執(zhí)行bean的初始化方法,而當(dāng)spring要銷毀bean實(shí)例的時(shí)候,也會(huì)調(diào)用bean的銷毀方法。文中有詳細(xì)的代碼實(shí)例,需要的朋友可以參考下
    2023-05-05
  • Java POI讀取excel中數(shù)值精度損失問題解決

    Java POI讀取excel中數(shù)值精度損失問題解決

    這篇文章主要介紹了Java POI讀取excel中數(shù)值精度損失問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 淺析Java中接口和抽象類的七大區(qū)別

    淺析Java中接口和抽象類的七大區(qū)別

    Java 是一門面向?qū)ο蟮木幊陶Z言,面向?qū)ο蟮木幊陶Z言有四大特征:抽象、封裝、繼承和多態(tài)。本文介紹的接口和抽象類就是面向?qū)ο缶幊讨小俺橄蟆钡木唧w實(shí)現(xiàn)。本文也將為大家詳細(xì)講一下二者的區(qū)別,需要的可以參考一下
    2021-12-12

最新評(píng)論