Apache?Commons?Imaging處理圖像實(shí)例深究
第1章:引言
今天來聊聊圖像處理。在這個(gè)數(shù)字化日益增長(zhǎng)的時(shí)代,圖像處理已經(jīng)成為了一個(gè)不可或缺的技能。不論是社交媒體上的照片編輯,還是專業(yè)領(lǐng)域的圖像分析,圖像處理無處不在。而作為一名Java開發(fā)者,自然也對(duì)這一領(lǐng)域充滿了興趣。
為什么要選擇Apache Commons Imaging(原名Sanselan)來進(jìn)行圖像處理呢?原因很簡(jiǎn)單:它是一個(gè)純Java的庫,不僅功能強(qiáng)大,而且使用起來非常方便。這個(gè)庫支持廣泛的圖像格式,從常見的JPEG、PNG到專業(yè)的TIFF、PSD等,都能輕松處理。最重要的是,它的開源特性讓咱們可以深入了解其內(nèi)部工作機(jī)制,更好地掌握?qǐng)D像處理的精髓。
第2章:Apache Commons Imaging簡(jiǎn)介
Apache Commons Imaging,之前被稱為Sanselan,是一個(gè)開源的Java圖像庫,主要用于讀取、寫入和操作圖像數(shù)據(jù)。這個(gè)庫的強(qiáng)大之處在于它對(duì)多種格式的圖像文件都有很好的支持,比如JPEG、PNG、GIF、BMP,甚至還包括一些不太常見的格式,比如TIFF、PSD等。
為了讓咱們更好地理解這個(gè)庫的使用,在本篇博客中通過一系列的實(shí)際案例來展示它的功能。這樣不僅能讓咱們更加直觀地了解Apache Commons Imaging,還能幫助咱們?cè)趯?shí)際項(xiàng)目中快速應(yīng)用這些技巧。
咱們來看看如何在Java項(xiàng)目中添加Apache Commons Imaging。一般來說,如果咱們使用的是Maven來管理項(xiàng)目,只需在pom.xml
文件中添加以下依賴:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-imaging</artifactId> <version>1.0-alpha2</version> </dependency>
接下來,會(huì)展示一個(gè)簡(jiǎn)單的示例,讓咱們看看如何使用Apache Commons Imaging來讀取一個(gè)圖像文件。假設(shè)咱們有一個(gè)名為“測(cè)試圖片.jpg”的圖像文件,想要讀取它并獲取一些基本信息,可以使用以下代碼:
import org.apache.commons.imaging.Imaging; import org.apache.commons.imaging.ImageFormats; import org.apache.commons.imaging.ImagingException; import java.io.File; import java.io.IOException; import java.awt.image.BufferedImage; public class ImageReaderExample { public static void main(String[] args) { try { File imageFile = new File("測(cè)試圖片.jpg"); BufferedImage image = Imaging.getBufferedImage(imageFile); // 輸出基本信息 System.out.println("圖像格式: " + Imaging.guessFormat(imageFile)); System.out.println("寬度: " + image.getWidth()); System.out.println("高度: " + image.getHeight()); } catch (ImagingException | IOException e) { e.printStackTrace(); } } }
在這段代碼中,咱們首先讀取了一個(gè)名為“測(cè)試圖片.jpg”的文件,然后使用Imaging.getBufferedImage
方法將其轉(zhuǎn)換為BufferedImage
對(duì)象。之后,咱們打印出了這個(gè)圖像的格式、寬度和高度等信息。
第3章:依賴配置
對(duì)于使用Maven作為項(xiàng)目管理工具的情況,只需要在項(xiàng)目的pom.xml
文件中添加相應(yīng)的依賴。這里的依賴版本可能會(huì)隨著時(shí)間更新,所以建議到Apache Commons Imaging的官方網(wǎng)站查看最新版本。下面是一個(gè)示例的依賴配置:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-imaging</artifactId> <version>1.0-alpha2</version> <!-- 這里的版本號(hào)需要根據(jù)最新版本進(jìn)行調(diào)整 --> </dependency>
加入這段依賴后,Maven會(huì)自動(dòng)處理所需庫的下載和管理。接下來,咱們來看看如何使用這個(gè)庫來進(jìn)行一些基本的圖像操作。比如說,讀取一張圖像并顯示其基本信息,這是圖像處理中最基礎(chǔ)的一步。
import org.apache.commons.imaging.Imaging; import org.apache.commons.imaging.common.ImageMetadata; import org.apache.commons.imaging.common.ImageMetadata.ImageMetadataItem; import java.io.File; import java.util.List; public class BasicImageInfo { public static void main(String[] args) { try { File imageFile = new File("測(cè)試圖片.jpg"); // 圖像文件路徑 List<ImageMetadataItem> metadata = Imaging.getMetadata(imageFile).getItems(); for (ImageMetadataItem item : metadata) { System.out.println(item.toString()); // 打印圖像的元數(shù)據(jù) } } catch (Exception e) { e.printStackTrace(); } } }
在這個(gè)例子中,使用了Imaging.getMetadata
方法來獲取圖像文件的元數(shù)據(jù),并逐個(gè)打印出來。這種操作對(duì)于理解圖像的屬性,比如相機(jī)設(shè)置、拍攝時(shí)間等信息非常有用。
圖像處理不僅僅是關(guān)于讀取信息,還包括修改、轉(zhuǎn)換等多種操作。為了進(jìn)行這些操作,咱們需要確保環(huán)境搭建正確無誤。在實(shí)際開發(fā)中,可能會(huì)遇到各種問題,比如依賴沖突、版本不兼容等。這時(shí)候,查看官方文檔、搜索相關(guān)問題解決方案或者在社區(qū)尋求幫助是非常必要的。
通過以上步驟,咱們就能夠在Java項(xiàng)目中成功集成Apache Commons Imaging,并進(jìn)行基礎(chǔ)的圖像處理操作了。
第4章:讀取和寫入圖像
讀取圖像
讀取圖像是開始任何圖像處理任務(wù)的第一步。在Apache Commons Imaging中,這個(gè)過程非常直觀。咱們可以使用Imaging.getBufferedImage
方法來讀取圖像文件。讓來展示一下這個(gè)過程:
import org.apache.commons.imaging.Imaging; import org.apache.commons.imaging.ImageFormats; import org.apache.commons.imaging.ImagingException; import java.io.File; import java.awt.image.BufferedImage; public class ReadImageExample { public static void main(String[] args) { try { File imageFile = new File("測(cè)試圖片.jpg"); // 圖像文件路徑 BufferedImage image = Imaging.getBufferedImage(imageFile); System.out.println("圖像寬度: " + image.getWidth()); System.out.println("圖像高度: " + image.getHeight()); // 這里可以添加更多的操作,比如分析圖像內(nèi)容等 } catch (ImagingException | IOException e) { e.printStackTrace(); } } }
在這個(gè)例子中,首先創(chuàng)建了一個(gè)指向圖像文件的File
對(duì)象。然后,使用Imaging.getBufferedImage
方法讀取這個(gè)文件,并將其轉(zhuǎn)換為一個(gè)BufferedImage
對(duì)象。這樣就可以獲取到圖像的寬度、高度等基本信息了。
寫入圖像
讀取圖像之后,通常咱們可能會(huì)對(duì)圖像進(jìn)行一系列處理,如調(diào)整大小、應(yīng)用濾鏡等。處理完成后,接下來的任務(wù)就是將修改后的圖像保存回文件。下面是一個(gè)簡(jiǎn)單的示例,展示如何將處理后的圖像寫入文件:
import org.apache.commons.imaging.Imaging; import org.apache.commons.imaging.ImageFormats; import org.apache.commons.imaging.ImagingException; import java.io.File; import java.awt.image.BufferedImage; public class WriteImageExample { public static void main(String[] args) { try { File inputFile = new File("原始圖片.jpg"); BufferedImage image = Imaging.getBufferedImage(inputFile); // 在這里可以對(duì)image進(jìn)行各種處理... File outputFile = new File("處理后的圖片.jpg"); Imaging.writeImage(image, outputFile, ImageFormats.JPEG, null); System.out.println("圖像保存成功!"); } catch (ImagingException | IOException e) { e.printStackTrace(); } } }
在這個(gè)例子中,先讀取了一個(gè)名為“原始圖片.jpg”的文件,進(jìn)行了一些假設(shè)的處理(比如調(diào)整大小、應(yīng)用濾鏡等),然后將處理后的圖像保存為“處理后的圖片.jpg”。這里使用了Imaging.writeImage
方法,它允許咱們指定圖像格式和一些寫入?yún)?shù)。
第5章:圖像轉(zhuǎn)換和處理
圖像格式轉(zhuǎn)換
在日常工作中,咱們經(jīng)常需要將圖像從一種格式轉(zhuǎn)換成另一種格式。比如,可能需要把PNG格式的圖片轉(zhuǎn)換成JPEG格式,以便于網(wǎng)絡(luò)傳輸或者兼容性更好。這就來展示一個(gè)簡(jiǎn)單的格式轉(zhuǎn)換過程:
import org.apache.commons.imaging.Imaging; import org.apache.commons.imaging.ImageFormats; import org.apache.commons.imaging.ImagingException; import java.io.File; import java.awt.image.BufferedImage; public class ImageFormatConversion { public static void main(String[] args) { try { File inputFile = new File("原始圖片.png"); BufferedImage image = Imaging.getBufferedImage(inputFile); File outputFile = new File("轉(zhuǎn)換后的圖片.jpg"); Imaging.writeImage(image, outputFile, ImageFormats.JPEG, null); System.out.println("格式轉(zhuǎn)換完成!"); } catch (ImagingException | IOException e) { e.printStackTrace(); } } }
在這個(gè)例子中,首先讀取了一個(gè)PNG格式的圖像文件“原始圖片.png”,然后使用Imaging.writeImage
方法將其保存為JPEG格式的文件“轉(zhuǎn)換后的圖片.jpg”。這個(gè)過程非常簡(jiǎn)單,但在實(shí)際應(yīng)用中卻非常有用。
基本圖像處理
除了格式轉(zhuǎn)換,咱們還可以進(jìn)行一些基本的圖像處理操作,比如調(diào)整圖像大小、裁剪、旋轉(zhuǎn)等。下面是一個(gè)調(diào)整圖像大小的示例:
import org.apache.commons.imaging.Imaging; import org.apache.commons.imaging.ImageFormats; import org.apache.commons.imaging.ImagingException; import java.io.File; import java.awt.image.BufferedImage; public class ResizeImage { public static void main(String[] args) { try { File inputFile = new File("原始圖片.jpg"); BufferedImage image = Imaging.getBufferedImage(inputFile); BufferedImage resizedImage = resizeImage(image, 200, 200); // 調(diào)整為200x200像素 File outputFile = new File("調(diào)整大小后的圖片.jpg"); Imaging.writeImage(resizedImage, outputFile, ImageFormats.JPEG, null); System.out.println("圖像大小調(diào)整完成!"); } catch (ImagingException | IOException e) { e.printStackTrace(); } } private static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) throws IOException { BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = resizedImage.createGraphics(); graphics2D.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null); graphics2D.dispose(); return resizedImage; } }
在這個(gè)例子中,創(chuàng)建了一個(gè)名為resizeImage
的方法,它接受一個(gè)BufferedImage
對(duì)象和目標(biāo)寬高,返回一個(gè)調(diào)整大小后的新圖像。這種操作在處理用戶上傳的圖片或者為網(wǎng)頁準(zhǔn)備縮略圖時(shí)非常有用。
第6章:元數(shù)據(jù)處理
讀取元數(shù)據(jù)
在Apache Commons Imaging中,讀取圖像元數(shù)據(jù)是一個(gè)簡(jiǎn)單而強(qiáng)大的過程。咱們可以獲取到很多有關(guān)圖像的詳細(xì)信息。下面是一個(gè)讀取JPEG圖像元數(shù)據(jù)的示例:
import org.apache.commons.imaging.Imaging; import org.apache.commons.imaging.common.ImageMetadata; import org.apache.commons.imaging.common.ImageMetadata.ImageMetadataItem; import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata; import org.apache.commons.imaging.formats.tiff.constants.TiffTagConstants; import java.io.File; import java.util.List; public class ReadMetadataExample { public static void main(String[] args) { try { File jpegImageFile = new File("測(cè)試圖片.jpg"); final ImageMetadata metadata = Imaging.getMetadata(jpegImageFile); final JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata; if (jpegMetadata != null) { // 打印所有元數(shù)據(jù)項(xiàng) List<ImageMetadataItem> items = jpegMetadata.getItems(); for (ImageMetadataItem item : items) { System.out.println(item); } // 獲取特定的元數(shù)據(jù)項(xiàng),例如拍攝時(shí)間 String shootingTime = jpegMetadata.findEXIFValueWithExactMatch(TiffTagConstants.TIFF_TAG_DATE_TIME).toString(); System.out.println("拍攝時(shí)間: " + shootingTime); } } catch (Exception e) { e.printStackTrace(); } } }
在這個(gè)示例中,讀取了一個(gè)JPEG圖像文件的元數(shù)據(jù),并打印出了所有的元數(shù)據(jù)項(xiàng)。此外,還特別獲取了拍攝時(shí)間這一具體的元數(shù)據(jù)信息。這對(duì)于管理大量圖像,尤其是對(duì)于攝影師來說,是非常有用的。
修改和添加元數(shù)據(jù)
除了讀取元數(shù)據(jù),Apache Commons Imaging還允許咱們修改或添加新的元數(shù)據(jù)信息。這對(duì)于個(gè)性化圖像處理、版權(quán)信息添加等場(chǎng)景非常有用。不過,需要注意的是,修改元數(shù)據(jù)是一個(gè)相對(duì)復(fù)雜的過程,涉及到圖像格式和元數(shù)據(jù)標(biāo)準(zhǔn)的深入理解。
由于修改元數(shù)據(jù)是一個(gè)相對(duì)復(fù)雜的過程,涉及到直接操作圖像的底層數(shù)據(jù),所以這個(gè)例子將會(huì)相對(duì)復(fù)雜一些。不過別擔(dān)心,會(huì)盡量用清晰的注釋來說明每一步的作用。
import org.apache.commons.imaging.ImageReadException; import org.apache.commons.imaging.ImageWriteException; import org.apache.commons.imaging.Imaging; import org.apache.commons.imaging.common.ImageMetadata; import org.apache.commons.imaging.common.RationalNumber; import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata; import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter; import org.apache.commons.imaging.formats.tiff.TiffImageMetadata; import org.apache.commons.imaging.formats.tiff.TiffOutputDirectory; import org.apache.commons.imaging.formats.tiff.TiffOutputField; import org.apache.commons.imaging.formats.tiff.TiffOutputSet; import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants; import org.apache.commons.imaging.formats.tiff.constants.TiffTagConstants; import org.apache.commons.imaging.formats.tiff.write.TiffOutputDirectory; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class ModifyMetadataExample { public static void main(String[] args) { try { File jpegImageFile = new File("測(cè)試圖片.jpg"); File outputFile = new File("修改元數(shù)據(jù)后的圖片.jpg"); OutputStream os = null; try { TiffOutputSet outputSet = null; // 嘗試讀取圖像的元數(shù)據(jù) final ImageMetadata metadata = Imaging.getMetadata(jpegImageFile); final JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata; if (jpegMetadata != null) { final TiffImageMetadata exif = jpegMetadata.getExif(); if (exif != null) { outputSet = exif.getOutputSet(); } } // 如果JPEG圖像沒有Exif元數(shù)據(jù),則創(chuàng)建一個(gè)新的輸出集 if (outputSet == null) { outputSet = new TiffOutputSet(); } // 添加自定義注釋 final TiffOutputDirectory exifDirectory = outputSet.getOrCreateExifDirectory(); exifDirectory.add(TiffOutputField.create(TiffTagConstants.TIFF_TAG_IMAGE_DESCRIPTION, outputSet.byteOrder, "自定義注釋")); // 修改現(xiàn)有元數(shù)據(jù),例如修改拍攝時(shí)間 exifDirectory.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL); exifDirectory.add(TiffOutputField.create(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL, outputSet.byteOrder, "2023:01:01 00:00:00")); os = new FileOutputStream(outputFile); new ExifRewriter().updateExifMetadataLossless(jpegImageFile, os, outputSet); } finally { if (os != null) { try { os.close(); } catch (IOException e) { // 忽略關(guān)閉異常 } } } System.out.println("元數(shù)據(jù)修改完成!"); } catch (ImageReadException | ImageWriteException | IOException e) { e.printStackTrace(); } } }
在這個(gè)代碼中,首先嘗試從原始JPEG圖像中讀取元數(shù)據(jù)。如果圖像包含Exif元數(shù)據(jù),將使用這些元數(shù)據(jù)來創(chuàng)建一個(gè)TiffOutputSet
對(duì)象。接著,在Exif目錄中添加了一個(gè)自定義的注釋字段,并修改了拍攝時(shí)間字段。最后,使用ExifRewriter
類的updateExifMetadataLossless
方法將修改后的元數(shù)據(jù)寫回到一個(gè)新的JPEG文件中。
這個(gè)過程顯示了如何在不損失圖像質(zhì)量的情況下,修改JPEG圖像的Exif元數(shù)據(jù)。這對(duì)于添加版權(quán)信息、個(gè)性化標(biāo)簽或其他重要信息到圖像中非常有用。不過,需要注意的是,操作元數(shù)據(jù)時(shí)要格外小心,因?yàn)殄e(cuò)誤的操作可能會(huì)損壞圖像文件。
第7章:錯(cuò)誤處理和性能優(yōu)化
錯(cuò)誤處理
在進(jìn)行圖像處理時(shí),常常會(huì)遇到各種錯(cuò)誤,比如文件格式不支持、文件損壞、內(nèi)存不足等。正確地處理這些錯(cuò)誤可以提高程序的健壯性和用戶體驗(yàn)。來展示一個(gè)基本的錯(cuò)誤處理示例:
import org.apache.commons.imaging.Imaging; import org.apache.commons.imaging.ImagingException; import java.io.File; import java.awt.image.BufferedImage; public class ErrorHandlingExample { public static void main(String[] args) { try { File imageFile = new File("可能不存在的圖片.jpg"); BufferedImage image = Imaging.getBufferedImage(imageFile); // 進(jìn)行一些圖像處理操作... } catch (ImagingException e) { System.err.println("圖像處理錯(cuò)誤: " + e.getMessage()); // 這里可以記錄日志或者通知用戶錯(cuò)誤信息 } catch (IOException e) { System.err.println("文件讀寫錯(cuò)誤: " + e.getMessage()); // 處理文件讀寫異常 } catch (Exception e) { System.err.println("未知錯(cuò)誤: " + e.getMessage()); // 處理其他未預(yù)見的異常 } } }
在這個(gè)例子中,嘗試讀取一個(gè)圖像文件,并在此過程中捕獲可能出現(xiàn)的異常。根據(jù)不同類型的異常,程序會(huì)輸出相應(yīng)的錯(cuò)誤信息。這種做法可以幫助調(diào)試程序,并在出現(xiàn)問題時(shí)提供更清晰的指示。
性能優(yōu)化
在圖像處理中,性能優(yōu)化同樣至關(guān)重要。尤其是處理大量或高分辨率的圖像時(shí),效率成為一個(gè)不容忽視的問題。下面會(huì)介紹一些基本的性能優(yōu)化技巧。
- 合理管理內(nèi)存: 圖像處理通常是內(nèi)存密集型的操作。對(duì)于大圖像,盡量使用縮放或分塊處理的方式來減少內(nèi)存占用。
- 避免不必要的重復(fù)讀寫: 讀取和寫入圖像是耗時(shí)操作。如果需要對(duì)同一圖像執(zhí)行多個(gè)操作,考慮先將圖像讀入內(nèi)存,完成所有處理后再統(tǒng)一寫回。
- 利用多線程: 當(dāng)處理多個(gè)圖像時(shí),可以考慮使用多線程來并行處理,以提高效率。
- 調(diào)整緩存和IO策略: 根據(jù)實(shí)際需要調(diào)整緩存策略和IO操作,避免頻繁的磁盤訪問。
這些只是一些基礎(chǔ)的性能優(yōu)化建議。在實(shí)際應(yīng)用中,根據(jù)具體的需求和環(huán)境,還可以采取更多的優(yōu)化措施。
第8章:總結(jié)
實(shí)際應(yīng)用案例
- 社交媒體自動(dòng)化工具: 假設(shè)你在開發(fā)一個(gè)社交媒體管理工具,需要自動(dòng)調(diào)整上傳圖片的大小和格式。使用Apache Commons Imaging,你可以輕松實(shí)現(xiàn)這一功能,確保每張圖片都符合社交媒體平臺(tái)的要求。
- 數(shù)字圖像存檔系統(tǒng): 在數(shù)字圖像存檔系統(tǒng)中,保留圖像的元數(shù)據(jù)信息非常重要。Apache Commons Imaging可以幫助你讀取和編輯這些信息,確保每張圖像都有正確的描述、版權(quán)信息和拍攝日期。
- 個(gè)性化圖像生成器: 想象一下,你在為一個(gè)廣告公司工作,需要生成大量包含特定文本和圖案的圖像。利用Apache Commons Imaging,你可以自動(dòng)化這一過程,為每個(gè)客戶快速定制個(gè)性化圖像。
通過這些實(shí)際應(yīng)用案例,我們可以看到Apache Commons Imaging在不同場(chǎng)景下的靈活性和實(shí)用性。無論你是在處理個(gè)人項(xiàng)目,還是開發(fā)復(fù)雜的商業(yè)應(yīng)用,這個(gè)庫都能提供強(qiáng)大的支持。
希望你已經(jīng)對(duì)Apache Commons Imaging有了全面的了解。通過這系列文章,我們一起深入探索了它的主要功能和應(yīng)用場(chǎng)景。圖像處理是一個(gè)既有趣又充滿挑戰(zhàn)的領(lǐng)域,而Apache Commons Imaging則是一把強(qiáng)大的工具,幫助你在這個(gè)領(lǐng)域里游刃有余。
以上就是Apache Commons Imaging處理圖像的詳細(xì)內(nèi)容,更多關(guān)于Apache Commons Imaging處理圖像的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Apache?Commons?Config管理配置文件核心功能使用
- Apache?Commons?BeanUtils:?JavaBean操作方法
- Apache?Commons?CLI構(gòu)建命令行應(yīng)用利器教程
- 使用Apache commons-cli包進(jìn)行命令行參數(shù)解析的示例代碼
- java利用Apache commons codec進(jìn)行MD5加密,BASE64加密解密,執(zhí)行系統(tǒng)命令
- Apache Commons Math3探索之多項(xiàng)式曲線擬合實(shí)現(xiàn)代碼
- Apache Commons DbUtils工具包使用介紹
相關(guān)文章
JDBC 實(shí)現(xiàn)通用的增刪改查基礎(chǔ)類方法
下面小編就為大家分享一篇JDBC 實(shí)現(xiàn)通用的增刪改查基礎(chǔ)類方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01關(guān)于HashMap的put方法執(zhí)行全過程
這篇文章主要介紹了關(guān)于HashMap的put方法執(zhí)行全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06如何在mybatis中向BLOB字段批量插入數(shù)據(jù)
這篇文章主要介紹了如何在mybatis中向BLOB字段批量插入數(shù)據(jù)的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-10-10電腦上安裝多個(gè)JDK版本時(shí)該如何自由切換(詳細(xì)圖文)
我們?cè)趯W(xué)習(xí)的過程中經(jīng)常用到不同的jdk版本,那么如何在一臺(tái)電腦上同時(shí)安裝多個(gè)jdk版本并進(jìn)行切換呢,這篇文章主要給大家介紹了關(guān)于電腦上安裝多個(gè)JDK版本時(shí)該如何自由切換的相關(guān)資料,需要的朋友可以參考下2023-10-10Jmeter關(guān)聯(lián)實(shí)現(xiàn)及參數(shù)化使用解析
這篇文章主要介紹了Jmeter關(guān)聯(lián)實(shí)現(xiàn)及參數(shù)化使用解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08springboot使用log4j2異步日志提升性能的實(shí)現(xiàn)方式
這篇文章主要介紹了springboot使用log4j2異步日志提升性能,異步日志實(shí)現(xiàn)方式:將日志存入一個(gè)單獨(dú)的隊(duì)列中,有一個(gè)單獨(dú)的線程從隊(duì)列中獲取日志并寫入磁盤文件,需要的朋友可以參考下2022-05-05