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

使用JavaIO流和網(wǎng)絡(luò)制作一個(gè)簡(jiǎn)單的圖片爬蟲

 更新時(shí)間:2023年04月07日 11:07:42   作者:CrazyDragon_King  
這篇文章主要介紹了使用JavaIO流和網(wǎng)絡(luò)制作一個(gè)簡(jiǎn)單的圖片爬蟲,通過關(guān)鍵字爬取百度圖片,這個(gè)和我們使用搜索引擎搜索百度圖片是一樣的,只是通過爬蟲可以學(xué)習(xí)技術(shù)的使用,需要的朋友可以參考下

Java IO流和網(wǎng)絡(luò)的簡(jiǎn)單應(yīng)用

最近看到了 URL 類的用法,簡(jiǎn)單的做了一個(gè)Java 版的爬蟲。發(fā)現(xiàn)還挺有趣的,就拿出來分享一下。通過關(guān)鍵字爬取百度圖片,這個(gè)和我們使用搜索引擎搜索百度圖片是一樣的,只是通過爬蟲可以學(xué)習(xí)技術(shù)的使用。(這個(gè)程序只是用來學(xué)習(xí)使用的,沒有其它用途?。?/p>

在這里插入圖片描述

在這里插入圖片描述

Java IO 流和 URL 類

Java IO流

Java 的 IO 流是實(shí)現(xiàn)輸入/輸出的基礎(chǔ),它可以方便的實(shí)現(xiàn)數(shù)據(jù)的輸入/輸出操作,在 Java 中把不同的輸入/輸出源(鍵盤、文件、網(wǎng)絡(luò)連接等)抽象表述為”流“(Stream),通過流的方法運(yùn)行Java 程序使用相同的方式來訪問不同的輸入/輸出源。

因?yàn)?IO流 已經(jīng)對(duì)各種輸入輸出源做了一個(gè)抽象處理,所以我們可以使用相對(duì)一致的代碼處理各種的源,只需要把它們作為輸入輸出流來進(jìn)行處理就行了,這就是面向抽象的好處。

URL 類

URI 和 URL

先來了解一下什么是 URL 吧,說 URL 之前先簡(jiǎn)單了解URI
**URI,統(tǒng)一資源標(biāo)識(shí)符(Uniform Resource Identifier)**是采用一種特定語法標(biāo)識(shí)一個(gè)資源的字符串。所標(biāo)識(shí)的資源可能是服務(wù)器上的一個(gè)文件或者其它任何內(nèi)容。URI 的語法是由一個(gè)模式和一個(gè)模式特定部分組成,模式和模式特定部分用一個(gè)冒號(hào)分隔,如下所示:

模式:模式特定部分

URI 中的模式特定部分沒有特定的語法,很多都采用一種層次結(jié)構(gòu)形式,如:
//authority/path?query

**URL,統(tǒng)一資源定位符(Uniform Resource Location)**是URI的一個(gè)子集,它除了標(biāo)識(shí)一個(gè)資源外 ,還會(huì)為資源提供一個(gè)特定的網(wǎng)絡(luò)位置,客戶端可以用它來獲取這個(gè)資源的一個(gè)表示。
注意:URL和URI并不是完全相同的,通用的URI可以告訴你一個(gè)資源是什么,但是無法告訴你它在哪里,以及如何得到這個(gè)資源。
在Java中,這二者都有相應(yīng)的實(shí)現(xiàn),java.net.URI 類(只標(biāo)識(shí)資源)與 java.net.URL 類(既能標(biāo)識(shí)資源,又能獲取資源)

URL 中的網(wǎng)絡(luò)位置通常包括用來訪問服務(wù)器的協(xié)議(FTP、HTTP等)、服務(wù)器的主機(jī)名或IP地址,以及文件在該服務(wù)器上的路徑。典型的 URL 類似于 https://www.baidu.com/。它表示百度服務(wù)器上的一個(gè) html 文件(百度搜索的首頁(yè)),它可以通過 HTTP 協(xié)議訪問雖然沒有直接在 URL 后面加上 html 文件的名字。如果使用 tomcat 的話,通常是 http://127.0.0.1:8080/foods/index.html 這種形式,其實(shí)二者是相同的。

好了,簡(jiǎn)單的了解就到此為止了,感興趣的話,可以查閱相關(guān)書籍了解更詳細(xì)的知識(shí),上面只是提到一些基礎(chǔ)的概念。

URL類

java.net.URL類是對(duì)統(tǒng)一資源定位符的抽象表示。它不依賴于繼承來配置不同類型的URL的實(shí)例,而使用了策略設(shè)計(jì)模式。協(xié)議處理器就是策略,URL 類構(gòu)成上下文,通過它來選擇不同的策略。(值得一提的是:
java 的 IO流也是使用了一種設(shè)計(jì)模式:裝飾器模式。

例如如下代碼:

DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File())))。

URL 類包含很多的構(gòu)造方法,我也只是第一次使用,就使用了最簡(jiǎn)單的一種形式:(剛開始學(xué)習(xí),根本不需要了解這么多,先用著再說,慢慢掌握知識(shí)。)

public URL(String url) throws MalformedURLException

Java 爬蟲

Talk is cheap, show me the code!
前面主要是一下簡(jiǎn)單的基礎(chǔ)知識(shí),如果已經(jīng)了解可以直接看下面這部分。

項(xiàng)目的基本結(jié)構(gòu):

在這里插入圖片描述

Client

package dragon;

import java.io.File;
import java.io.IOException;

public class Client {
	public static final String downloadFilePath = "D:\\DragonDataFile\\cat";
	public static void main(String[] args) throws IOException {
		//初始化創(chuàng)建文件下載目錄
		File dir = new File(Client.downloadFilePath);
		if (!dir.exists()) {
			dir.mkdirs();
		}
		//啟動(dòng)下載窗口
		new Window("龍");
	}
}

DataProcessUtil

package dragon;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class DataProcessUtil {
	
	//根據(jù)鏈接獲取 html 文件數(shù)據(jù)。
	public static String getData(String link) throws IOException {
		URL url = new URL(link);
		URLConnection connection = url.openConnection();
		StringBuilder strBuilder = new StringBuilder();
		try (
			BufferedInputStream bis = new BufferedInputStream(connection.getInputStream())){
			int hasRead = 0;
			byte[] b = new byte[1024];
			while ((hasRead = bis.read(b)) != -1) {
				strBuilder.append(new String(b, 0, hasRead));
			}
		}
		return strBuilder.toString();
	}
	
	public static List<String> getLinkList(String str){
		String regx = "\"objURL\":\"(.*?)\",";
		Pattern p = Pattern.compile(regx);
		Matcher m = p.matcher(str);
		List<String> strs = new LinkedList<>();
		while (m.find()) {
			strs.add(m.group(0));
		}
		//使用 Stream API 進(jìn)行處理并返回。
		 return strs.stream()
				.map(s->s.substring(10, s.length()-2))
				.collect(Collectors.toList());
	}
}

說明:
獲取html頁(yè)面的信息,并進(jìn)行處理,使用正則表達(dá)式從html中提取圖片的鏈接。
(正則表達(dá)式是參考其它人的實(shí)現(xiàn),這個(gè)涉及到對(duì)html內(nèi)容的分析)

String regx = "\"objURL\":\"(.*?)\",";
//使用 Stream API 進(jìn)行處理并返回。
		 return strs.stream()
				.map(s->s.substring(10, s.length()-2))
				.collect(Collectors.toList());

使用Java 8新增加的 Stream 對(duì)數(shù)據(jù)進(jìn)行遍歷,提取所有的圖片的 URL 組成一個(gè)列表集合返回。

DownLoadUtil

package dragon;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.Random;

public class DownLoadUtil {
	public static void downLoad(List<String> strs) {
		strs.stream().forEach(u->{
			try {
				URL url = new URL(u);
				String contentType  = url.openConnection().getContentType();
				if (contentType != null && contentType.contains("image/")) {
					//獲取圖片的類型:content type
					String filetype = null;
					if (contentType.contains("jpeg")) {
						filetype = ".jpeg";
					} else if (contentType.contains("jpg")) {
						filetype = ".jpg";
					} else{
						filetype = ".png";
					} //gif 格式圖片,似乎無法正常顯示		
					
					//使用當(dāng)前日期的毫秒數(shù)+隨機(jī)數(shù)+contentType 作為文件名
					Random rand = new Random(System.currentTimeMillis());
					String filename = new Date().getTime()+rand.nextInt(10000)+filetype;		
					Runnable r = ()->{
						int flag = 0;
						File imageFile = new File(Client.downloadFilePath, filename);
						try(
							BufferedInputStream bis = new BufferedInputStream(url.openConnection().getInputStream());
							BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(imageFile))){
							int hasRead = 0;
							byte[] b = new byte[1024];
							while ((hasRead = bis.read(b)) != -1) {
								bos.write(b, 0, hasRead);
							}
						} catch (IOException e) {
							System.out.println("下載失??!");
							//對(duì)于下載失敗的圖片進(jìn)行刪除,不然會(huì)出現(xiàn)錯(cuò)誤!圖片只能正?,F(xiàn)實(shí)一部分
							if (imageFile.exists()) {
								boolean b = imageFile.delete();
								System.out.println("下載失敗,刪除圖片"+b);
							}
							flag = 1;
							e.printStackTrace();
						}
						if (flag == 0)
							System.out.println("下載完成:"+filename);
					};
					Thread t = new Thread(r);
					t.start();   //啟動(dòng)下載線程。
				}
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("鏈接錯(cuò)誤!");
			}
		});
	}
}

**注意:這里遇到一個(gè)問題,就是圖片的下載過程受到網(wǎng)絡(luò)因素的影響,有時(shí)候會(huì)下載失敗,但是如果圖片已經(jīng)開始下載,仍然提示下載失敗,那么這張圖片可以能會(huì)出現(xiàn)異常,比如出現(xiàn)一下奇怪的顏色,我對(duì)下載失敗的圖片,進(jìn)行了處理,發(fā)現(xiàn),似乎沒有效果。所以我代碼中處理下載失敗圖片的部分,可能不起效果?;蛟S,可以通過獲取資源文件的大小和下載后文件的大小進(jìn)行比對(duì),如果不相等就刪除,感興趣的可以試試。 **
單純的判斷大小無法解決圖片變形的問題,還有一種情況需要考慮!在最下面,會(huì)有詳細(xì)說明解決方法。

Window

package dragon;

import java.awt.FlowLayout;
import java.io.IOException;
import java.util.List;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class Window extends JFrame{
	/**
	 * 自動(dòng)生成的序列化版本號(hào)
	 */
	private static final long serialVersionUID = 7809323808831342296L;
	private JLabel label_keyWord, label_Page;
	private JTextField textField, textPage;
	private JButton download;
	
	public Window(String name) {
		super(name);
		this.init();
		//設(shè)置布局
		this.setLayout(new FlowLayout());
		this.setBounds(400, 400, 250, 150);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
	
	private void init() {
		label_keyWord = new JLabel("關(guān)鍵字");
		label_Page = new JLabel("頁(yè)數(shù)");
		textField = new JTextField(10);
		textPage = new JTextField(10);
		download = new JButton("下載");
		
		download.addActionListener(e->{
			String keyWord = textField.getText().trim();
			String page = textPage.getText().trim();
			int download_page = 0;   
			if (keyWord.length() == 0 || page.length() == 0) {
				JOptionPane.showMessageDialog(null, "關(guān)鍵字或頁(yè)數(shù)不能為空!", "警告", JOptionPane.WARNING_MESSAGE);
				return ;
			}
			
			try {
				download_page = Integer.parseInt(page);  //匹配單個(gè)數(shù)字,如果數(shù)字很多使用正則表達(dá)式
			} catch (NumberFormatException exp) {
				JOptionPane.showMessageDialog(null, "頁(yè)數(shù)必須為數(shù)字!", "警告", JOptionPane.WARNING_MESSAGE);
				return ;
			}
			
			String link = null;
			for (int i = 1; i <= download_page; i++) {
				//分頁(yè)下載圖片!
				link = "http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word="+keyWord+"&pn="+i*20;
				this.download(link);
			}
		});

		Box boxH1 = Box.createHorizontalBox();
		boxH1.add(label_keyWord);
		boxH1.add(Box.createHorizontalStrut(10));
		boxH1.add(textField);
		Box boxH2 = Box.createHorizontalBox();
		boxH2.add(label_Page);
		boxH2.add(Box.createHorizontalStrut(23));
		boxH2.add(textPage);
		Box boxH3 = Box.createHorizontalBox();
		boxH3.add(download);
		
		Box boxV = Box.createVerticalBox();
		boxV.add(boxH1);
		boxV.add(Box.createVerticalStrut(10));
		boxV.add(boxH2);
		boxV.add(Box.createVerticalStrut(10));
		boxV.add(boxH3);
		this.add(boxV);
	}
	
	private void download(String link) {
		try {
			String str = DataProcessUtil.getData(link);
			List<String> links = DataProcessUtil.getLinkList(str);
			//嘗試下載!使用線程進(jìn)行下載,防止阻塞!
			Thread t = new Thread(()->{
				DownLoadUtil.downLoad(links);
			});
			t.start();
		} catch (IOException e1) {
			e1.printStackTrace();
			JOptionPane.showMessageDialog(null, "啥都沒有!", "警告", JOptionPane.WARNING_MESSAGE);
		}
	}
}

說明:
當(dāng)圖片沒有下載完成時(shí),不要再次點(diǎn)擊下載按鈕,否則會(huì)報(bào)錯(cuò)。因?yàn)榫€程不能被再次啟動(dòng)。

運(yùn)行結(jié)果

在這里插入圖片描述

基本原理

我來簡(jiǎn)單畫一個(gè)示意圖,大家湊合著看:

簡(jiǎn)單爬蟲示意圖

說明:首先通過百度圖片的URL來獲取百度圖片那個(gè)頁(yè)面的信息(html的內(nèi)容),我們平時(shí)在瀏覽器使用,看到的都是瀏覽器處理好的頁(yè)面,如果使用爬蟲爬取的就是原始的html頁(yè)面,在瀏覽器按 F12 也可以看到。因?yàn)閳D片的鏈接都在html 中,所以我們需要取出這些圖片,這里就用到了**正則表達(dá)式(Regular Expression)**的知識(shí)了,通過正則表達(dá)式可以取出需要的信息(資源的URL或者說資源的地址)。其實(shí)獲取html的過程和獲取圖片的過程,都是一樣的。

這里說一下,這個(gè)步驟:

	//根據(jù)鏈接獲取 html 文件數(shù)據(jù)。
	public static String getData(String link) throws IOException {
		URL url = new URL(link);
		URLConnection connection = url.openConnection();
		StringBuilder strBuilder = new StringBuilder();
		try (
			BufferedInputStream bis = new BufferedInputStream(connection.getInputStream())){
			int hasRead = 0;
			byte[] b = new byte[1024];
			while ((hasRead = bis.read(b)) != -1) {
				strBuilder.append(new String(b, 0, hasRead));
			}
		}
		return strBuilder.toString();
	}

通過參數(shù) link,創(chuàng)建一個(gè) URL 對(duì)象,然后通過使用URLConnection connection = url.openConnection();獲取 URLConnection 對(duì)象,在通過 URLConnection 對(duì)象的getInputStream() 方法,獲取輸入流即可。這樣就完成了對(duì)資源的獲取。我這里強(qiáng)調(diào)資源,因?yàn)橄螺d圖片其實(shí)和這個(gè)過程是一樣的。

總結(jié)

這個(gè)小軟件雖然功能很簡(jiǎn)單,但是也用到了很多知識(shí)點(diǎn),比較適合初學(xué)者進(jìn)行學(xué)習(xí)(Java IO流、網(wǎng)絡(luò)、Stream、線程的知識(shí)),知識(shí)雖然用到的都不難(一些基礎(chǔ)知識(shí)),但是融合起來使用,還是很有意思的。

對(duì)于圖片的奇怪顏色問題,可以確定是圖片的大小和原來圖片的大小不一致導(dǎo)致的,至于為什么是這樣的,估計(jì)需要具備一定的圖形學(xué)知識(shí),才能解答,這個(gè)超出了這個(gè)東西的范圍了。所以為了判斷哪些圖片出錯(cuò),我就使用大小判斷的方法,對(duì)最后生成的文件大小和網(wǎng)絡(luò)圖片文件大小進(jìn)行比對(duì),刪除了一些無法下載的圖片,但是有一些圖片居然無法刪除,我查閱了資料,大多說它被另一個(gè)進(jìn)程占用,但是我這個(gè)圖片應(yīng)該是沒有的。后來,經(jīng)過檢查發(fā)現(xiàn)是多線程惹得禍,因?yàn)槭嵌嗑€程,并且代碼執(zhí)行速度太快了(對(duì)的,和這個(gè)也有關(guān)系),因?yàn)槲业奈募钱?dāng)前時(shí)間的毫秒數(shù)+一個(gè)種子為當(dāng)前時(shí)間的隨機(jī)數(shù),在多線程的情況下,重復(fù)的概率居然還挺高的。
所以,原因就出現(xiàn)了,當(dāng)發(fā)現(xiàn)圖片大小不對(duì),試圖刪除圖片時(shí),圖片被另一個(gè)線程占用,無法刪除。(關(guān)于名字重復(fù)的問題,就是兩個(gè)線程在同一個(gè)毫秒啟動(dòng)了,所以隨機(jī)數(shù)也是相等的(種子相等),因此有些圖片就會(huì)和其它圖片寫入同一個(gè)圖片文件,導(dǎo)致出現(xiàn)異常情況。)

總結(jié)一下:
圖片異常的情況有兩種:
1.網(wǎng)絡(luò)原因,導(dǎo)致圖片無法完整下載,這是無法解決的,只能刪除。
2.圖片名字重復(fù),導(dǎo)致多張圖片數(shù)據(jù)被寫入同一張圖片當(dāng)中,這是程序錯(cuò)誤,可以避免的。

解決方法:
對(duì)于第一種情況,只需要把錯(cuò)誤的圖片刪除即可;
對(duì)于第二種情況,要避免圖片名字重復(fù),所以我重新設(shè)計(jì)了圖片的命名方法,
采用:當(dāng)前時(shí)間的毫秒數(shù)+UUID隨機(jī)數(shù)(查閱資料,這個(gè)挺好用的)作為文件的命名方式。注:UUID 也有一個(gè)缺點(diǎn),就是名字太長(zhǎng)了。

修改后的源文件:

package dragon;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.UUID;

public class DownLoadUtil {
	public static void downLoad(List<String> strs) {
		strs.stream().forEach(u->{
			try {
				URL url = new URL(u);
				URLConnection urlConnection = url.openConnection();
				String contentType  = urlConnection.getContentType();
				//獲取資源文件的大小
				long size = urlConnection.getContentLengthLong();
				if (contentType != null && contentType.contains("image/")) {
					//獲取圖片的類型:content type
					String filetype = null;
					if (contentType.contains("jpeg")) {
						filetype = ".jpeg";
					} else if (contentType.contains("jpg")) {
						filetype = ".jpg";
					} else{
						filetype = ".png";
					} //gif 格式圖片,似乎無法正常顯示		
					
					//使用當(dāng)前時(shí)間戳+隨機(jī)數(shù)+contentType 作為文件名
					String filename = System.currentTimeMillis()+UUID.randomUUID().toString()+filetype;
					//使用線程進(jìn)行下載
					Runnable r = ()->{
						File imageFile = new File(Client.downloadFilePath, filename);
						try(
							BufferedInputStream bis = new BufferedInputStream(urlConnection.getInputStream());
							BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(imageFile))){
							int hasRead = 0;
							byte[] b = new byte[1024];
							while ((hasRead = bis.read(b)) != -1) {
								bos.write(b, 0, hasRead);
							}
						} catch (IOException e) {
							System.out.println("下載失??!");
							e.printStackTrace();
						}
						//對(duì)下載失敗的圖片進(jìn)行刪除。
						if (imageFile.length() != size) {
							boolean result = imageFile.delete();
							System.out.println(imageFile.length()+"  "+size+" "+filename+" 刪除結(jié)果:"+result);
							//大小不符合,說明圖片下載有問題,刪除圖片。
						} else {
							System.out.println("下載完成:"+filename);
						}
					};
					Thread t = new Thread(r);
					t.start();   //啟動(dòng)下載線程。
				}
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("鏈接錯(cuò)誤!");
			}
		});
	}
}

運(yùn)行截圖
這樣網(wǎng)絡(luò)原因錯(cuò)誤的圖片直接刪除,代碼原因的錯(cuò)誤,已經(jīng)改正了。

在這里插入圖片描述

注:還有一些圖片無法顯示,這個(gè)可能是官方不允許我們進(jìn)行爬取,有的圖片,爬取的就是不允許爬取那種圖片,還有一些圖片,不支持格式(這個(gè)原因,我 也不太明白,希望明白的人,可以指出來為什么)。

到此這篇關(guān)于使用JavaIO流和網(wǎng)絡(luò)制作一個(gè)簡(jiǎn)單的圖片爬蟲的文章就介紹到這了,更多相關(guān)JavaIO流制作圖片爬蟲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot+MybatisPlus+Oracle實(shí)現(xiàn)主鍵自增的示例代碼

    Springboot+MybatisPlus+Oracle實(shí)現(xiàn)主鍵自增的示例代碼

    這篇文章主要介紹了Springboot+MybatisPlus+Oracle實(shí)現(xiàn)主鍵自增的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • spring?項(xiàng)目實(shí)現(xiàn)限流方法示例

    spring?項(xiàng)目實(shí)現(xiàn)限流方法示例

    這篇文章主要為大家介紹了spring項(xiàng)目實(shí)現(xiàn)限流的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • springboot中的controller注意事項(xiàng)說明

    springboot中的controller注意事項(xiàng)說明

    這篇文章主要介紹了springboot中的controller注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springboot+redis實(shí)現(xiàn)簡(jiǎn)單的熱搜功能

    springboot+redis實(shí)現(xiàn)簡(jiǎn)單的熱搜功能

    這篇文章主要介紹了springboot+redis實(shí)現(xiàn)一個(gè)簡(jiǎn)單的熱搜功能,通過代碼介紹了過濾不雅文字的過濾器,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Java中的==使用方法詳解

    Java中的==使用方法詳解

    這篇文章主要介紹了Java中“==”的使用方法,,==可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中,equals()是方法,只能用于引用數(shù)據(jù)類型,需要的朋友可以參考下
    2022-09-09
  • Redis介紹和使用場(chǎng)景詳解

    Redis介紹和使用場(chǎng)景詳解

    這篇文章主要為大家詳細(xì)介紹了Redis介紹和使用場(chǎng)景,需要的朋友可以參考,具體內(nèi)容如下
    2018-04-04
  • SpringBoot3集成MyBatis詳解

    SpringBoot3集成MyBatis詳解

    MyBatis是一款開源的持久層框架,它極大地簡(jiǎn)化了與數(shù)據(jù)庫(kù)的交互流程,MyBatis更具靈活性,允許開發(fā)者直接使用SQL語句與數(shù)據(jù)庫(kù)進(jìn)行交互,本文將詳細(xì)介紹在Spring Boot項(xiàng)目中如何集成MyBatis,以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的輕松訪問和操作,需要的朋友可以參考下
    2023-12-12
  • springboot微服務(wù)項(xiàng)目集成html頁(yè)面的實(shí)現(xiàn)

    springboot微服務(wù)項(xiàng)目集成html頁(yè)面的實(shí)現(xiàn)

    本文主要介紹了springboot微服務(wù)項(xiàng)目集成html頁(yè)面的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 把Java程序轉(zhuǎn)換成exe,可直接運(yùn)行的實(shí)現(xiàn)

    把Java程序轉(zhuǎn)換成exe,可直接運(yùn)行的實(shí)現(xiàn)

    這篇文章主要介紹了把Java程序轉(zhuǎn)換成exe,可直接運(yùn)行的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java?百度手寫文字識(shí)別接口配置代碼

    java?百度手寫文字識(shí)別接口配置代碼

    本文通過實(shí)例代碼給大家介紹了java?百度手寫文字識(shí)別接口配置方法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-01-01

最新評(píng)論