-
[问题求助] FusionInsight_HD_8.2.0.1产品,在Flink SQL客户端中select 'hello'报错KeeperErrorCode = ConnectionLoss for /flink_base/flinkflinkSQL client中select 还是报错的,请帮忙指点下,哪里有问题?谢谢org.apache.flink.shaded.zookeeper3.org.apache.zookeeper.KeeperException$SessionClosedRequireAuthException: KeeperErrorCode = Session closed because client failed to authenticate for /flink_base/flink或者org.apache.flink.shaded.zookeeper3.org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /flink_base/flinkzookeeper已经启动,192.168.0.82:24002 ,而且zookeeper中的ACL权限已经设置,但是在设置配额失败[zk: 192.168.0.82:24002(CONNECTED) 2] create /flink_base/flink_base Created /flink_base/flink_base [zk: 192.168.0.82:24002(CONNECTED) 3] ls /flink_base/ Path must not end with / character [zk: 192.168.0.82:24002(CONNECTED) 4] ls /flink_base [flink, flink_base] [zk: 192.168.0.82:24002(CONNECTED) 5] [zk: 192.168.0.82:24002(CONNECTED) 5] [zk: 192.168.0.82:24002(CONNECTED) 5] [zk: 192.168.0.82:24002(CONNECTED) 5] setquota -n 1000000 /flink_base/flink Insufficient permission : /flink_base/flink [zk: 192.168.0.82:24002(CONNECTED) 6] getAcl /flink_base/flink 'world,'anyone : cdrwa [zk: 192.168.0.82:24002(CONNECTED) 7] setAcl /flink_base/flink world:anyone:rwcda [zk: 192.168.0.82:24002(CONNECTED) 8] setquota -n 1000000 /flink_base/flink Insufficient permission : /flink_base/flink [zk: 192.168.0.82:24002(CONNECTED) 9] getAcl /flink_base/ Path must not end with / character [zk: 192.168.0.82:24002(CONNECTED) 10] getAcl /flink_base 'world,'anyone : cdrwa [zk: 192.168.0.82:24002(CONNECTED) 11] getAcl /flink_base/flink 'world,'anyone : cdrwa [zk: 192.168.0.82:24002(CONNECTED) 12] ls /zookeeper/quota [beeline, elasticsearch, flink_base, graphbase, hadoop, hadoop-adapter-data, hadoop-flag, hadoop-ha, hbase, hdfs-acl-log, hive, hiveserver2, kafka, loader, mr-ha, rmstore, sparkthriftserver, sparkthriftserver2x, sparkthriftserver2x_sparkInternal_HAMode, yarn-leader-election] [zk: 192.168.0.82:24002(CONNECTED) 13] ls /zookeeper/quota/flink_base [zookeeper_limits, zookeeper_stats] [zk: 192.168.0.82:24002(CONNECTED) 5] setquota -n 1000000 /flink_base/flink Insufficient permission : /flink_base/flink tail -f /home/dmp/app/ficlient/Flink/flink/log/flink-root-sql-client-192-168-0-85.log 中的日志如下flink-conf.yaml中的全部配置如下akka.ask.timeout: 120 s akka.client-socket-worker-pool.pool-size-factor: 1.0 akka.client-socket-worker-pool.pool-size-max: 2 akka.client-socket-worker-pool.pool-size-min: 1 akka.framesize: 10485760b akka.log.lifecycle.events: false akka.lookup.timeout: 30 s akka.server-socket-worker-pool.pool-size-factor: 1.0 akka.server-socket-worker-pool.pool-size-max: 2 akka.server-socket-worker-pool.pool-size-min: 1 akka.ssl.enabled: true akka.startup-timeout: 10 s akka.tcp.timeout: 60 s akka.throughput: 15 blob.fetch.backlog: 1000 blob.fetch.num-concurrent: 50 blob.fetch.retries: 50 blob.server.port: 32456-32520 blob.service.ssl.enabled: true classloader.check-leaked-classloader: false classloader.resolve-order: child-first client.rpc.port: 32651-32720 client.timeout: 120 s compiler.delimited-informat.max-line-samples: 10 compiler.delimited-informat.max-sample-len: 2097152 compiler.delimited-informat.min-line-samples: 2 env.hadoop.conf.dir: /home/dmp/app/ficlient/Flink/flink/conf env.java.opts.client: -Djava.io.tmpdir=/home/dmp/app/ficlient/Flink/tmp env.java.opts.jobmanager: -Djava.security.krb5.conf=/opt/huawei/Bigdata/common/runtime/krb5.conf -Djava.io.tmpdir=${PWD}/tmp -Des.security.indication=true env.java.opts.taskmanager: -Djava.security.krb5.conf=/opt/huawei/Bigdata/common/runtime/krb5.conf -Djava.io.tmpdir=${PWD}/tmp -Des.security.indication=true env.java.opts: -Xloggc:<LOG_DIR>/gc.log -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=20 -XX:GCLogFileSize=20M -Djdk.tls.ephemeralDHKeySize=3072 -Djava.library.path=${HADOOP_COMMON_HOME}/lib/native -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false -Dbeetle.application.home.path=/opt/huawei/Bigdata/common/runtime/security/config -Dwcc.configuration.path=/opt/huawei/Bigdata/common/runtime/security/config -Dscc.configuration.path=/opt/huawei/Bigdata/common/runtime/securityforscc/config -Dscc.bigdata.common=/opt/huawei/Bigdata/common/runtime env.yarn.conf.dir: /home/dmp/app/ficlient/Flink/flink/conf flink.security.enable: true flinkserver.alarm.cert.skip: true flinkserver.host.ip: fs.output.always-create-directory: false fs.overwrite-files: false heartbeat.interval: 10000 heartbeat.timeout: 120000 high-availability.job.delay: 10 s high-availability.storageDir: hdfs://hacluster/flink/recovery high-availability.zookeeper.client.acl: creator high-availability.zookeeper.client.connection-timeout: 90000 high-availability.zookeeper.client.max-retry-attempts: 5 high-availability.zookeeper.client.retry-wait: 5000 high-availability.zookeeper.client.session-timeout: 90000 high-availability.zookeeper.client.tolerate-suspended-connections: true high-availability.zookeeper.path.root: /flink high-availability.zookeeper.path.under.quota: /flink_base high-availability.zookeeper.quorum: 192.168.0.82:24002,192.168.0.81:24002,192.168.0.80:24002 high-availability.zookeeper.quota.enabled: true high-availability: zookeeper job.alarm.enable: true jobmanager.heap.size: 1024mb jobmanager.web.403-redirect-url: https://192.168.0.82:28443/web/pages/error/403.html jobmanager.web.404-redirect-url: https://192.168.0.82:28443/web/pages/error/404.html jobmanager.web.415-redirect-url: https://192.168.0.82:28443/web/pages/error/415.html jobmanager.web.500-redirect-url: https://192.168.0.82:28443/web/pages/error/500.html jobmanager.web.access-control-allow-origin: * jobmanager.web.accesslog.enable: true jobmanager.web.allow-access-address: * jobmanager.web.backpressure.cleanup-interval: 600000 jobmanager.web.backpressure.delay-between-samples: 50 jobmanager.web.backpressure.num-samples: 100 jobmanager.web.backpressure.refresh-interval: 60000 jobmanager.web.cache-directive: no-store jobmanager.web.checkpoints.disable: false jobmanager.web.checkpoints.history: 10 jobmanager.web.expires-time: 0 jobmanager.web.history: 5 jobmanager.web.logout-timer: 600000 jobmanager.web.pragma-value: no-cache jobmanager.web.refresh-interval: 3000 jobmanager.web.ssl.enabled: false jobmanager.web.x-frame-options: DENY library-cache-manager.cleanup.interval: 3600 metrics.internal.query-service.port: 28844-28943 metrics.reporter.alarm.factory.class: com.huawei.mrs.flink.alarm.FlinkAlarmReporterFactory metrics.reporter.alarm.interval: 30 s metrics.reporter.alarm.job.alarm.checkpoint.consecutive.failures.num: 5 metrics.reporter.alarm.job.alarm.failure.restart.rate: 80 metrics.reporter.alarm.job.alarm.task.backpressure.duration: 180 s metrics.reporter: alarm nettyconnector.message.delimiter: $_ nettyconnector.registerserver.topic.storage: /flink/nettyconnector nettyconnector.sinkserver.port.range: 28444-28843 nettyconnector.ssl.enabled: false parallelism.default: 1 query.client.network-threads: 0 query.proxy.network-threads: 0 query.proxy.ports: 32541-32560 query.proxy.query-threads: 0 query.server.network-threads: 0 query.server.ports: 32521-32540 query.server.query-threads: 0 resourcemanager.taskmanager-timeout: 300000 rest.await-leader-timeout: 30000 rest.bind-port: 32261-32325 rest.client.max-content-length: 104857600 rest.connection-timeout: 15000 rest.idleness-timeout: 300000 rest.retry.delay: 3000 rest.retry.max-attempts: 20 rest.server.max-content-length: 104857600 rest.server.numThreads: 4 restart-strategy.failure-rate.delay: 10 s restart-strategy.failure-rate.failure-rate-interval: 60 s restart-strategy.failure-rate.max-failures-per-interval: 1 restart-strategy.fixed-delay.attempts: 3 restart-strategy.fixed-delay.delay: 10 s restart-strategy: none security.cookie: 9477298cd52a3e409ed0bc570bdc795179fcc7c301a1225e22f47fe0a3db47c2 security.enable: true security.kerberos.login.contexts: Client,KafkaClient security.kerberos.login.keytab: security.kerberos.login.principal: security.kerberos.login.use-ticket-cache: true security.networkwide.listen.restrict: true security.ssl.algorithms: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 security.ssl.enabled: false security.ssl.encrypt.enabled: false security.ssl.key-password: Bapuser@9000 security.ssl.keystore-password: Bapuser@9000 security.ssl.keystore: ssl/flink.keystore security.ssl.protocol: TLSv1.2 security.ssl.rest.enabled: false security.ssl.truststore-password: Bapuser@9000 security.ssl.truststore: ssl/flink.truststore security.ssl.verify-hostname: false slot.idle.timeout: 50000 slot.request.timeout: 300000 state.backend.fs.checkpointdir: hdfs://hacluster/flink/checkpoints state.backend.fs.memory-threshold: 20kb state.backend.incremental: true state.backend: rocksdb state.savepoints.dir: hdfs://hacluster/flink/savepoint task.cancellation.interval: 30000 task.cancellation.timeout: 180000 taskmanager.data.port: 32391-32455 taskmanager.data.ssl.enabled: false taskmanager.debug.memory.logIntervalMs: 0 taskmanager.debug.memory.startLogThread: false taskmanager.heap.size: 1024mb taskmanager.initial-registration-pause: 500 ms taskmanager.max-registration-pause: 30 s taskmanager.maxRegistrationDuration: 5 min taskmanager.memory.fraction: 0.7 taskmanager.memory.off-heap: false taskmanager.memory.preallocate: false taskmanager.memory.segment-size: 32768 taskmanager.network.detailed-metrics: false taskmanager.network.memory.buffers-per-channel: 2 taskmanager.network.memory.floating-buffers-per-gate: 8 taskmanager.network.memory.fraction: 0.1 taskmanager.network.memory.max: 1gb taskmanager.network.memory.min: 64mb taskmanager.network.netty.client.connectTimeoutSec: 300 taskmanager.network.netty.client.numThreads: -1 taskmanager.network.netty.num-arenas: -1 taskmanager.network.netty.sendReceiveBufferSize: 4096 taskmanager.network.netty.server.backlog: 0 taskmanager.network.netty.server.numThreads: -1 taskmanager.network.netty.transport: nio taskmanager.network.numberOfBuffers: 2048 taskmanager.network.request-backoff.initial: 100 taskmanager.network.request-backoff.max: 10000 taskmanager.numberOfTaskSlots: 1 taskmanager.refused-registration-pause: 10 s taskmanager.registration.timeout: 5 min taskmanager.rpc.port: 32326-32390 taskmanager.runtime.hashjoin-bloom-filters: false taskmanager.runtime.max-fan: 128 taskmanager.runtime.sort-spilling-threshold: 0.8 use.path.filesystem: true use.smarterleaderlatch: true web.submit.enable: false web.timeout: 10000 yarn.application-attempt-failures-validity-interval: 600000 yarn.application-attempts: 5 yarn.application-master.port: 32586-32650 yarn.heap-cutoff-min: 384 yarn.heap-cutoff-ratio: 0.25 yarn.heartbeat-delay: 5 yarn.heartbeat.container-request-interval: 500 yarn.maximum-failed-containers: 5 yarn.per-job-cluster.include-user-jar: ORDER zk.ssl.enabled: false zookeeper.clientPort.quorum: 192.168.0.82:24002,192.168.0.81:24002,192.168.0.80:24002 zookeeper.root.acl: OPEN zookeeper.sasl.disable: false zookeeper.sasl.login-context-name: Client zookeeper.sasl.service-name: zookeeper zookeeper.secureClientPort.quorum: 192.168.0.82:24002,192.168.0.81:24002,192.168.0.80:24002
-
[问题求助] FusionInsight_HD_8.2.0.1产品,在Flink SQL客户端中select 'hello'报错KeeperErrorCode = ConnectionLoss for /flink_base/flink1.在flink sql client中执行sql 直接报错[ERROR] Could not execute SQL statement. Reason: org.apache.flink.shaded.zookeeper3.org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /flink_base/flink 2.而且进入zookeeper中查询也是报错,求解求解[omm@192-168-0-82 zookeeper]$ pwd /opt/huawei/Bigdata/FusionInsight_HD_8.2.0.1/install/FusionInsight-Zookeeper-3.6.3/zookeeper [omm@192-168-0-82 zookeeper]$ bin/zkCli.sh -server 192.168.0.82:24002 Connecting to 192.168.0.82:24002 Welcome to ZooKeeper! JLine support is enabled WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: 192.168.0.82:24002(CONNECTING) 0] ls / KeeperErrorCode = Session closed because client failed to authenticate for / [zk: 192.168.0.82:24002(CONNECTED) 1] WATCHER:: WatchedEvent state:Disconnected type:None path:null WATCHER:: WatchedEvent state:SyncConnected type:None path:null WATCHER:: WatchedEvent state:Disconnected type:None path:null 后面是一直循环WATCHER:,flink-conf.yaml中的部分设置如下 flink.security.enable: true flinkserver.alarm.cert.skip: true flinkserver.host.ip: fs.output.always-create-directory: false fs.overwrite-files: false heartbeat.interval: 10000 heartbeat.timeout: 120000 high-availability.job.delay: 10 s high-availability.storageDir: hdfs://hacluster/flink/recovery high-availability.zookeeper.client.acl: creator high-availability.zookeeper.client.connection-timeout: 90000 high-availability.zookeeper.client.max-retry-attempts: 5 high-availability.zookeeper.client.retry-wait: 5000 high-availability.zookeeper.client.session-timeout: 90000 high-availability.zookeeper.client.tolerate-suspended-connections: true high-availability.zookeeper.path.root: /flink high-availability.zookeeper.path.under.quota: /flink_base high-availability.zookeeper.quorum: 192.168.0.82:24002,192.168.0.81:24002,192.168.0.80:24002 high-availability.zookeeper.quota.enabled: true high-availability: zookeeper yarn.application-attempts: 5 yarn.application-master.port: 32586-32650 yarn.heap-cutoff-min: 384 yarn.heap-cutoff-ratio: 0.25 yarn.heartbeat-delay: 5 yarn.heartbeat.container-request-interval: 500 yarn.maximum-failed-containers: 5 yarn.per-job-cluster.include-user-jar: ORDER zk.ssl.enabled: false zookeeper.clientPort.quorum: 192.168.0.82:24002,192.168.0.81:24002,192.168.0.80:24002 zookeeper.root.acl: OPEN zookeeper.sasl.disable: false zookeeper.sasl.login-context-name: Client zookeeper.sasl.service-name: zookeeper zookeeper.secureClientPort.quorum: 192.168.0.82:24002,192.168.0.81:24002,192.168.0.80:24002
-
前言基于java使用SDK实现图像识别,主要以媒资图像标签和名人识别为例。一、环境配置Maven(没有直接下载华为的SDK包,而是使用Maven安装依赖)JDK19(官方的SDK包要求JDK版本必须高于JDK8版本,大家根据自己只要满足版本要求即可)开发工具:IDEA 2023.3(其他版本也可)能创建Maven项目即可开通图像识别服务(目前是免费体验):这里我开通的是图像标签/媒资图像标签和名人识别服务。设置访问密钥服务区域:我开通的服务区域是华北-北京四关键步骤Maven项目的创建和Java环境变量的配置我就不再赘诉,这是大家学习java早已熟练掌握的,这里只讲诉易错的。开通图像识别服务 华为云首页就有云产品体验区(找不到就在搜索栏检索),勾选AI: 点击“立即体验”后,找到服务列表,开通你想要的服务(点击开通): 设置访问密钥 在控制台找到“我的凭证”: 找到“访问密钥”,如果没有就新增,新增后一定要下载密钥的CSV文件,他会有提示让你下载,防止你忘记: 下载完csv文件后用记事本打开即可看到AK和SK: Maven引入依赖配置 版本可以自己切换 <dependency> <groupId>com.huaweicloud.sdk</groupId> <artifactId>huaweicloud-sdk-image</artifactId> <version>3.1.8</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.70</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.16</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.16.0</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.13.0</version> </dependency>二、图像识别实例媒资图像标签功能介绍:对用户传入的图像可以返回图像中的物体名称、所属类别及置信度信息。使用图片是网上的,仅作学习使用: 代码如下:/** * @Version: 1.0.0 * @Author: Dragon_王 * @ClassName: RunImageMediaTaggingSolution * @Description: 媒资图像标签 * @Date: 2024/1/8 11:51 */ /** * 此demo仅供测试使用,强烈建议使用SDK * 使用前需配置依赖jar包。jar包可通过下载SDK获取 */ import com.huaweicloud.sdk.core.auth.ICredential; import com.huaweicloud.sdk.core.auth.BasicCredentials; import com.huaweicloud.sdk.core.exception.ConnectionException; import com.huaweicloud.sdk.core.exception.RequestTimeoutException; import com.huaweicloud.sdk.core.exception.ServiceResponseException; import com.huaweicloud.sdk.image.v2.region.ImageRegion; import com.huaweicloud.sdk.image.v2.*; import com.huaweicloud.sdk.image.v2.model.*; public class RunImageMediaTaggingSolution { public static void main(String[] args) { //此处需要输入您的AK/SK信息 String ak = "你的AK"; String sk = "你的SK"; ICredential auth = new BasicCredentials() .withAk(ak) .withSk(sk); ImageClient client = ImageClient.newBuilder() .withCredential(auth) .withRegion(ImageRegion.valueOf("cn-north-4")) //此处替换为您开通服务的区域 .build(); RunImageMediaTaggingRequest request = new RunImageMediaTaggingRequest(); ImageMediaTaggingReq body = new ImageMediaTaggingReq(); body.withThreshold(10f); body.withLanguage("zh"); body.withUrl("https://tse2-mm.cn.bing.net/th/id/OIP-C.SIuEnb1-arhtDNqfdICVqAHaE7?rs=1&pid=ImgDetMain"); //此处替换为公网可以访问的图片地址 request.withBody(body); try { RunImageMediaTaggingResponse response = client.runImageMediaTagging(request); System.out.println(response.toString()); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { e.printStackTrace(); } catch (ServiceResponseException e) { e.printStackTrace(); System.out.println(e.getHttpStatusCode()); System.out.println(e.getErrorCode()); System.out.println(e.getErrorMsg()); } } }运行结果: //运行结果如下 class RunImageMediaTaggingResponse { result: class ImageMediaTaggingResponseResult { tags: [class ImageMediaTaggingItemBody { confidence: 83.63 type: 动物 tag: 金毛犬 i18nTag: class ImageMediaTaggingItemBodyI18nTag { zh: 金毛犬 en: Golden retriever } i18nType: class ImageMediaTaggingItemBodyI18nType { zh: 动物 en: Animal } instances: [] }, class ImageMediaTaggingItemBody { confidence: 81.78 type: 动物 tag: 金毛 i18nTag: class ImageMediaTaggingItemBodyI18nTag { zh: 金毛 en: Golden hair } i18nType: class ImageMediaTaggingItemBodyI18nType { zh: 动物 en: Animal } instances: [] }, class ImageMediaTaggingItemBody { confidence: 77.00 type: 动物 tag: 金毛寻猎犬 i18nTag: class ImageMediaTaggingItemBodyI18nTag { zh: 金毛寻猎犬 en: Golden Retriever } i18nType: class ImageMediaTaggingItemBodyI18nType { zh: 动物 en: Animal } instances: [] }, class ImageMediaTaggingItemBody { confidence: 62.60 type: 动物 tag: 贵妇犬 i18nTag: class ImageMediaTaggingItemBodyI18nTag { zh: 贵妇犬 en: Poodle } i18nType: class ImageMediaTaggingItemBodyI18nType { zh: 动物 en: Animal } instances: [] }, class ImageMediaTaggingItemBody { confidence: 59.02 type: 生活 tag: 狗链 i18nTag: class ImageMediaTaggingItemBodyI18nTag { zh: 狗链 en: Dog chain } i18nType: class ImageMediaTaggingItemBodyI18nType { zh: 生活 en: Life } instances: [] }, class ImageMediaTaggingItemBody { confidence: 53.84 type: 动物 tag: 宠物狗 i18nTag: class ImageMediaTaggingItemBodyI18nTag { zh: 宠物狗 en: Pet dog } i18nType: class ImageMediaTaggingItemBodyI18nType { zh: 动物 en: Animal } instances: [] }, class ImageMediaTaggingItemBody { confidence: 48.01 type: 动物 tag: 狗狗 i18nTag: class ImageMediaTaggingItemBodyI18nTag { zh: 狗狗 en: Dog } i18nType: class ImageMediaTaggingItemBodyI18nType { zh: 动物 en: Animal } instances: [] }, class ImageMediaTaggingItemBody { confidence: 44.02 type: 动物 tag: 犬 i18nTag: class ImageMediaTaggingItemBodyI18nTag { zh: 犬 en: Dog } i18nType: class ImageMediaTaggingItemBodyI18nType { zh: 动物 en: Animal } instances: [] }, class ImageMediaTaggingItemBody { confidence: 42.11 type: 动物 tag: 纯种犬 i18nTag: class ImageMediaTaggingItemBodyI18nTag { zh: 纯种犬 en: Purebred dog } i18nType: class ImageMediaTaggingItemBodyI18nType { zh: 动物 en: Animal } instances: [] }, class ImageMediaTaggingItemBody { confidence: 38.65 type: 动物 tag: 中华田园犬 i18nTag: class ImageMediaTaggingItemBodyI18nTag { zh: 中华田园犬 en: Chinese pastoral dog } i18nType: class ImageMediaTaggingItemBodyI18nType { zh: 动物 en: Animal } instances: [] }] } } Process finished with exit code 0名人识别功能介绍:分析并识别图片中包含的敏感人物、明星及网红人物,返回人物信息及人脸坐标。使用照片是网上的照片,仅作学习使用: 代码如下:/** * @Version: 1.0.0 * @Author: Dragon_王 * @ClassName: RunCelebrityRecognitionSolution * @Description: 媒资标签 * @Date: 2024/1/9 16:23 */ import com.alibaba.fastjson.JSON; import com.huaweicloud.sdk.core.auth.ICredential; import com.huaweicloud.sdk.core.auth.BasicCredentials; import com.huaweicloud.sdk.core.exception.ConnectionException; import com.huaweicloud.sdk.core.exception.RequestTimeoutException; import com.huaweicloud.sdk.core.exception.ServiceResponseException; import com.huaweicloud.sdk.image.v2.ImageClient; import com.huaweicloud.sdk.image.v2.model.RunCelebrityRecognitionRequest; import com.huaweicloud.sdk.image.v2.region.ImageRegion; import com.huaweicloud.sdk.image.v2.model.CelebrityRecognitionReq; import com.huaweicloud.sdk.image.v2.model.RunCelebrityRecognitionResponse; public class RunCelebrityRecognitionSolution { public static void main(String[] args) { // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全 // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK String ak = "你的AK"; String sk = "你的SK"; ICredential auth = new BasicCredentials() .withAk(ak) .withSk(sk); ImageClient client = ImageClient.newBuilder() .withCredential(auth) .withRegion(ImageRegion.valueOf("cn-north-4")) //此处替换为您开通服务的区域 .build(); RunCelebrityRecognitionRequest request = new RunCelebrityRecognitionRequest(); CelebrityRecognitionReq body = new CelebrityRecognitionReq(); body.withThreshold(0f); body.withUrl("https://tse1-mm.cn.bing.net/th/id/OIP-C.tM6jifW1xaCDP7Kia9QiYwHaKD?rs=1&pid=ImgDetMain"); //此处替换为公网可以访问的图片地址 request.withBody(body); try { RunCelebrityRecognitionResponse response = client.runCelebrityRecognition(request); System.out.println(response.getHttpStatusCode()); System.out.println(JSON.toJSONString(response)); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { e.printStackTrace(); } catch (ServiceResponseException e) { e.printStackTrace(); System.out.println(e.getHttpStatusCode()); System.out.println(e.getErrorCode()); System.out.println(e.getErrorMsg()); } } }运行结果:200 {"httpStatusCode":200,"result":[{"confidence":0.9985551,"faceDetail":{"w":132,"h":186,"x":197,"y":79},"label":"成龙"}]} Process finished with exit code 0总结以上就是华为云的AI图像识别服务调用,这里提供官方文档
-
Java课程设计 前言 来csdn也有两年了,在这期间学了很多的知识,也跟着许多的大神做了几个小项目。但自己也在想什么时候能够有个自己的项目,之前在学校做过一个基于集合存储数据的学生信息管理系统,现在想着改进一下,于是趁着暑假做了一个小项目吧(基于mysql+jdbc+java swing的学生成绩信息管理系统)。一来是巩固自己的学习成果,二来是记录自己的学习历程,期待后面能做出更多的项目吧。 设计需求和思路 设计需求 1.利用jdbc将java程序与mysql建立连接 2.利用java swing将学生信息和成绩信息显现出来 3.通过使用sql指令来实现对学生信息和成绩信息的crud(增查改删)操作 设计思路 1.利用Navicat创建两个数据表(stu和classes),同时两个数据表用外键约束连接( CONSTRAINT `fk_classes_stu` FOREIGN KEY (`class_id`) REFERENCES `stu` (`stu_num`) ON DELETE CASCADE ) 2.使用sql指令对数据表中数据进行增删改查,并通过java swing显示 3.查询所有学生信息,利用连接查询将两个数据表的信息一并显示 详细操作 1.设计主界面(登录注册界面) 账号和密码通过HashMap来存储,账号为键密码为值,利用其基本方法来添加账号密码(注册),以及登录。 package view; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Map; public class MainView extends JFrame { private Map<String,String> userhashmap=new HashMap<>(); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); JPanel p4=new JPanel(); JLabel welcome=new JLabel("欢迎来到学生信息管理系统"); JLabel username=new JLabel("账号:"); JLabel password=new JLabel("密码:"); JTextField usernametext=new JTextField(10); JPasswordField passwordField=new JPasswordField(10); JButton confirm=new JButton("确认"); JButton exit=new JButton("退出"); JButton register=new JButton("注册"); public MainView() { this.setTitle("学生信息管理系统"); this.setSize(800, 500); this.setLayout(new GridLayout(4, 1,10,10)); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); p4.add(welcome); p1.add(username); p1.add(usernametext); p2.add(password); p2.add(passwordField); p3.add(confirm); p3.add(register); p3.add(exit); this.add(p4); this.add(p1); this.add(p2); this.add(p3); register.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==register){ if(userhashmap.containsKey(usernametext.getText())){ JOptionPane.showMessageDialog(null,"注册失败,您的账号已存在","警告",JOptionPane.WARNING_MESSAGE); return; } userhashmap.put(usernametext.getText(),passwordField.getText()); JOptionPane.showMessageDialog(null,"注册成功","通知",JOptionPane.INFORMATION_MESSAGE); } } }); confirm.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == confirm) { if (userhashmap.containsKey(usernametext.getText())) { if (userhashmap.get(usernametext.getText()).equals(passwordField.getText())) { JOptionPane.showMessageDialog(null,"登陆成功","通知",JOptionPane.INFORMATION_MESSAGE); dispose(); ManagerView mv=new ManagerView(); mv.setVisible(true); } else { JOptionPane.showMessageDialog(null,"密码错误","警告",JOptionPane.WARNING_MESSAGE); } } else{ JOptionPane.showMessageDialog(null,"该用户不存在","警告",JOptionPane.WARNING_MESSAGE); } } } }); exit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); } public static void main(String[] args) { MainView m=new MainView(); m.setVisible(true); } } 2.设计学生信息管理界面和成绩信息管理界面 使用GridBagLayout布局设置左边为学生信息管理的按钮,右边为成绩信息管理的按钮 package view; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class ManagerView extends JFrame{ JButton insert=new JButton("添加学生信息"); JButton delete=new JButton("删除学生"); JButton update=new JButton("学生信息修改"); JButton query=new JButton("查询学生信息"); JButton queryall=new JButton("查询所有学生信息"); JButton insertclass=new JButton("添加成绩信息"); JButton deleteclass=new JButton("删除成绩信息"); JButton updateclass=new JButton("修改成绩信息"); JLabel labelstu=new JLabel("学生管理系统");//设置“学生管理系统”标签 JLabel labelclass=new JLabel("成绩管理系统");//设置“成绩管理系统”标签 public ManagerView(){ this.setTitle("学生成绩管理"); this.setSize(1200,500); this.setLayout(new GridBagLayout()); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置每个按钮长,高为140,120 Dimension dimension=new Dimension(140,30);//通过setPreferredSize()方法来设置按钮和标签大小,但要传入Dimension对象 insert.setPreferredSize(dimension); delete.setPreferredSize(dimension); update.setPreferredSize(dimension); query.setPreferredSize(dimension); queryall.setPreferredSize(dimension); insertclass.setPreferredSize(dimension); deleteclass.setPreferredSize(dimension); updateclass.setPreferredSize(dimension); labelstu.setPreferredSize(dimension); labelclass.setPreferredSize(dimension); GridBagConstraints constraintsleft=new GridBagConstraints(); constraintsleft.gridx = 0; // 列为0 constraintsleft.gridy = GridBagConstraints.RELATIVE; // 按钮的行相对于前一个按钮的行 constraintsleft.anchor = GridBagConstraints.CENTER; // 设置水平方向上的位置居中 constraintsleft.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向 /*constraintsleft.weightx = 0.5; // 水平方向上的权重为0.5*/ constraintsleft.insets = new Insets(5, 5, 5, 200); // 设置按钮的内边距 constraintsleft.ipadx = 10; this.add(labelstu,constraintsleft); this.add(insert,constraintsleft); this.add(delete,constraintsleft); this.add(update,constraintsleft); this.add(query,constraintsleft); this.add(queryall,constraintsleft); GridBagConstraints constraintsright=new GridBagConstraints(); constraintsright.gridx=1; constraintsleft.gridy = GridBagConstraints.RELATIVE; // 按钮的行相对于前一个按钮的行 constraintsleft.anchor = GridBagConstraints.CENTER; // 设置水平方向上的位置居中 constraintsleft.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向 /*constraintsleft.weightx = 0.5; // 水平方向上的权重为0.5*/ constraintsleft.insets = new Insets(5, 200, 5, 5); // 设置按钮的内边距 constraintsleft.ipadx = 10; this.add(labelclass,constraintsright); this.add(insertclass,constraintsright); this.add(deleteclass,constraintsright); this.add(updateclass,constraintsright); insert.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { InsertStuView insertStuView=new InsertStuView(); insertStuView.setVisible(true); } }); delete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { DeleteStuView deleteStuView=new DeleteStuView(); deleteStuView.setVisible(true); } }); update.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { UpdateStuview updateStuview=new UpdateStuview(); updateStuview.setVisible(true); } }); query.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { QueryStuView queryStuView=new QueryStuView(); queryStuView.setVisible(true); } }); insertclass.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { InsertClassView insertClassView=new InsertClassView(); insertClassView.setVisible(true); } }); deleteclass.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { DeleteClassView deleteClassView=new DeleteClassView(); deleteClassView.setVisible(true); } }); updateclass.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { UpdateClassView updateClassView =new UpdateClassView(); updateClassView.setVisible(true); } }); /* p1.add(insert); p2.add(delete); p3.add(query); p4.add(update); p5.add(orderby);*/ queryall.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { QueryAllView queryAllView=new QueryAllView(); queryAllView.setVisible(true); } }); } } 3.设计学生信息操作 添加学生信息 package view; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import service.StuManage; public class InsertStuView extends JFrame { JLabel labelname=new JLabel("请输入您的姓名"); JLabel labelgender=new JLabel("请输入您的性别"); JLabel labelid=new JLabel("请输入您的学号"); JTextField textname=new JTextField(15); JTextField textgender=new JTextField(15); JTextField textid=new JTextField(15); JButton confirm=new JButton("确定"); JButton cancel=new JButton("取消"); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); JPanel p4=new JPanel(); public InsertStuView(){ this.setSize(500,300); this.setTitle("请添加学生信息"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(new GridLayout(4,1,10,10)); p1.add(labelname); p1.add(textname); p2.add(labelgender); p2.add(textgender); p3.add(labelid); p3.add(textid); p4.add(confirm); p4.add(cancel); this.add(p1); this.add(p2); this.add(p3); this.add(p4); confirm.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { StuManage.insertStudata(textname.getText(),textgender.getText(),textid.getText()); } catch (Exception ex) { JOptionPane.showMessageDialog(null,"添加失败","警告",JOptionPane.WARNING_MESSAGE); } dispose(); } }); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dispose(); } }); } } 通过学号删除学生,因为学号不会重复 package view; import service.StuManage; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class DeleteStuView extends JFrame { JLabel labelid=new JLabel("请输入您想删除学生的学号"); JTextField textField=new JTextField(15); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JButton confirm=new JButton("确定"); JButton cancel=new JButton("取消"); public DeleteStuView(){ this.setSize(500,300); this.setLayout(new GridLayout(2,1,0,0)); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("删除学生"); p1.add(labelid); p1.add(textField); p2.add(confirm); p2.add(cancel); p1.setBorder(BorderFactory.createEmptyBorder(70,0,0,0)); this.add(p1); this.add(p2); confirm.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try{ StuManage.deleteStudata(textField.getText()); }catch(Exception ex){ JOptionPane.showMessageDialog(null,"删除失败","警告",JOptionPane.WARNING_MESSAGE); } dispose(); } }); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dispose(); } }); } } 学生信息修改 package view; import service.StuManage; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class UpdateStuview extends JFrame{ JLabel labeloldid=new JLabel("请输入您要修改学生的学号"); JLabel labelname=new JLabel("请输入您要修改后的姓名"); JLabel labelgender=new JLabel("请输入您要修改后的性别"); JLabel labelid=new JLabel("请输入您要修改后的学号"); JTextField textFieldoldid=new JTextField(15); JTextField textname=new JTextField(15); JTextField textgender=new JTextField(15); JTextField textid=new JTextField(15); JButton confirm=new JButton("确定"); JButton cancel=new JButton("取消"); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); JPanel p4=new JPanel(); JPanel p5=new JPanel(); public UpdateStuview(){ this.setSize(500,300); this.setTitle("请修改学生信息"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(new GridLayout(5,1,10,10)); p1.add(labeloldid); p1.add(textFieldoldid); p2.add(labelname); p2.add(textname); p3.add(labelgender); p3.add(textgender); p4.add(labelid); p4.add(textid); p5.add(confirm); p5.add(cancel); this.add(p1); this.add(p2); this.add(p3); this.add(p4); this.add(p5); confirm.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { StuManage.updateStudata(textname.getText(),textgender.getText(),textid.getText(),textFieldoldid.getText()); } catch (Exception ex) { JOptionPane.showMessageDialog(null,"修改失败","警告",JOptionPane.WARNING_MESSAGE); } dispose(); } }); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dispose(); } }); } } 查询学生信息 package view; import service.ClassManage; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class QueryStuView extends JFrame { JLabel id=new JLabel("请输入学生的id"); JTextField textid=new JTextField(15); JButton confirm=new JButton("确定"); JButton cancel=new JButton("取消"); JLabel labelstu=new JLabel("学生信息表"); JLabel labelscore=new JLabel("成绩信息表"); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); JPanel p4=new JPanel(); String[] stucolumnname={"姓名","性别","学号"}; String[] scorecolumnname={"学科","分数","教师"}; public QueryStuView(){ this.setLayout(new GridLayout(4,4,10,10)); this.setTitle("学生信息查询"); this.setSize(1000,700); DefaultTableModel stumodel=new DefaultTableModel(); DefaultTableModel scoremodel=new DefaultTableModel(); stumodel.setColumnIdentifiers(stucolumnname); scoremodel.setColumnIdentifiers(scorecolumnname); JTable stutable = new JTable(stumodel); JTable scoretable=new JTable(scoremodel); JScrollPane scrollstu=new JScrollPane(stutable); JScrollPane scrollscore=new JScrollPane(scoretable); p1.setBorder(BorderFactory.createEmptyBorder(70,0,0,0)); p1.add(id); p1.add(textid); p2.add(confirm); p2.add(cancel); p3.add(labelstu); p3.add(scrollstu); p4.add(labelscore); p4.add(scrollscore); this.add(p1); this.add(p2); this.add(p3); this.add(p4); confirm.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try{ stumodel.setRowCount(0); scoremodel.setRowCount(0); ClassManage.querystu(textid.getText(),stumodel,scoremodel); }catch(Exception ex){ JOptionPane.showMessageDialog(null,"查找失败","警告",JOptionPane.WARNING_MESSAGE); } } }); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dispose(); } }); } } 查询所有学生信息 package view; import service.ClassManage; import javax.swing.*; import javax.swing.table.DefaultTableModel; public class QueryAllView extends JFrame{ JLabel text=new JLabel("学生信息查询"); DefaultTableModel model=new DefaultTableModel(); JTable queryall=new JTable(model); JScrollPane jScrollPane=new JScrollPane(queryall); JPanel p1=new JPanel(); JPanel p2=new JPanel(); public QueryAllView(){ this.setTitle("学生成绩查询"); this.setSize(1000,700); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); String[] columnname={"姓名","性别","学号","科目","分数"}; model.setColumnIdentifiers(columnname); p1.add(text); p2.add(jScrollPane); this.add(p1); this.add(p2); try{ ClassManage.queryall(model); }catch(Exception ex){ JOptionPane.showMessageDialog(null,"查询失败","警告",JOptionPane.WARNING_MESSAGE); } } } ———————————————— 版权声明:本文为CSDN博主「Java雪荷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/xyendjsj/article/details/131774615
-
默认安装失败,手动安装应该选择哪个目录呀?我的jre在c盘里,我选择c盘,提示安装成功,但是好像并没有安装成功,如何检验是否安装成功了?
yd_239626805
发表于2023-12-15 09:28:27
2023-12-15 09:28:27
最后回复
This is WeAutomate
2023-12-15 13:47:11
183 10 -
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需写作干货注入能量… 热爱写作,愿意让自己成为更好的人…一、Apache POI介绍Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。一般情况下,POI 都是用于操作 Excel 文件。二、应用场景Apache POI 的应用场景:银行网银系统导出交易明细各种业务系统导出Excel报表批量导入业务数据三、使用步骤1.导入maven坐标代码如下(示例):<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.16</version> </dependency>2.写入代码讲解在内存中创建一个Excel文件:XSSFWorkbook excel=new XSSFWorkbook();在Excel文件中创建一个Sheet页:XSSFSheet sheet=excel.createSheet("info");在Sheet中创建行对象,rownum编号从0开始:XSSFRow row=sheet.createRow(1);创建单元格并且写入文件内容:row.createCell(1).setCellValue("姓名"); row.createCell(2).setCellValue("城市");//创建一个新行: row=sheet.createRow(2); row.createCell(1).setCellValue("张三"); row.createCell(2).setCellValue("北京");通过输出流将内存中的Excel文件写入到磁盘:FileOutputStream out=new FileOutputStream(new File("D:\\info.xlsx")); excel.write(out);关闭资源:out.close(); excel.close();全部代码如下:package com.sky.test; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.File; import java.io.FileOutputStream; public class POITest { /** * 通过POI创建Excel文件并且写入文件内容 */ public static void write() throws Exception{ //在内存中创建一个Excel文件 XSSFWorkbook excel=new XSSFWorkbook(); //在Excel文件中创建一个Sheet页 XSSFSheet sheet=excel.createSheet("info"); //在Sheet中创建行对象,rownum编号从0开始 XSSFRow row=sheet.createRow(1); //创建单元格并且写入文件内容 row.createCell(1).setCellValue("姓名"); row.createCell(2).setCellValue("城市"); //创建一个新行 row=sheet.createRow(2); row.createCell(1).setCellValue("张三"); row.createCell(2).setCellValue("北京"); //创建一个新行 row=sheet.createRow(3); row.createCell(1).setCellValue("李四"); row.createCell(2).setCellValue("南京"); //通过输出流将内存中的Excel文件写入到磁盘 FileOutputStream out=new FileOutputStream(new File("D:\\info.xlsx")); excel.write(out); //关闭资源 out.close(); excel.close(); } public static void main(String[] args) throws Exception{ write(); } }效果如下:3.读取代码讲解创建文件读取流: InputStream in =new FileInputStream(("D:\\info.xlsx"));读取磁盘上已经存在的Excel文件:XSSFWorkbook excel=new XSSFWorkbook(in);读取Excel文件中的第一个Sheet页:XSSFSheet sheet=excel.getSheetAt(0);获取Sheet中最后一行的行号:int lastRowNum = sheet.getLastRowNum();输出:for(int i = 1; i <= lastRowNum ; i++){ //获得某一行 XSSFRow row = sheet.getRow(i); //获得单元格对象 String cellValue1 = row.getCell(1).getStringCellValue(); String cellValue2 = row.getCell(2).getStringCellValue(); System.out.println(cellValue1+" "+cellValue2); }关闭资源:in.close(); excel.close();完整代码如下:package com.sky.test; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; public class POITest { /** * 通过POI创建Excel文件并且写入文件内容 */ public static void write() throws Exception{ //在内存中创建一个Excel文件 XSSFWorkbook excel=new XSSFWorkbook(); //在Excel文件中创建一个Sheet页 XSSFSheet sheet=excel.createSheet("info"); //在Sheet中创建行对象,rownum编号从0开始 XSSFRow row=sheet.createRow(1); //创建单元格并且写入文件内容 row.createCell(1).setCellValue("姓名"); row.createCell(2).setCellValue("城市"); //创建一个新行 row=sheet.createRow(2); row.createCell(1).setCellValue("张三"); row.createCell(2).setCellValue("北京"); //创建一个新行 row=sheet.createRow(3); row.createCell(1).setCellValue("李四"); row.createCell(2).setCellValue("南京"); //通过输出流将内存中的Excel文件写入到磁盘 FileOutputStream out=new FileOutputStream(new File("D:\\info.xlsx")); excel.write(out); //关闭资源 out.close(); excel.close(); } /** * 通过POI读取Excel文件中的内容 * @throws Exception */ public static void read() throws Exception{ //创建文件读取流 InputStream in =new FileInputStream(("D:\\info.xlsx")); //读取磁盘上已经存在的Excel文件 XSSFWorkbook excel=new XSSFWorkbook(in); //读取Excel文件中的第一个Sheet页 XSSFSheet sheet=excel.getSheetAt(0); //获取Sheet中最后一行的行号 int lastRowNum = sheet.getLastRowNum(); for(int i = 1; i <= lastRowNum ; i++){ //获得某一行 XSSFRow row = sheet.getRow(i); //获得单元格对象 String cellValue1 = row.getCell(1).getStringCellValue(); String cellValue2 = row.getCell(2).getStringCellValue(); System.out.println(cellValue1+" "+cellValue2); } //关闭资源 in.close(); excel.close(); } public static void main(String[] args) throws Exception{ //write(); read(); } }总结以上就是Apache POI(处理Miscrosoft Office各种文件格式)的相关知识点,希望对你有所帮助。 积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!
-
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需写作干货注入能量… 热爱写作,愿意让自己成为更好的人…一、WebSocket介绍WebSocket 是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。1.Http和WebSocket比较:2.应用场景视频弹窗网页聊天体育实况更新股票基金报价实时更新二、WebSocket使用步骤1.客户端搭建博主这里使用案例的一个websocket.html页面作为WebSocket客户端,能够迅速的让我们了解通过WebSocket客户端与服务端之间的联系。 websocket.html页面效果如下:网页代码如下:<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title>WebSocket Demo</title> </head> <body> <input id="text" type="text" /> <button onclick="send()">发送消息</button> <button onclick="closeWebSocket()">关闭连接</button> <div id="message"> </div> </body> <script type="text/javascript"> var websocket = null; var clientId = Math.random().toString(36).substr(2); //判断当前浏览器是否支持WebSocket if('WebSocket' in window){ //连接WebSocket节点 websocket = new WebSocket("ws://localhost:8080/ws/"+clientId); } else{ alert('Not support websocket') } //连接发生错误的回调方法 websocket.onerror = function(){ setMessageInnerHTML("error"); }; //连接成功建立的回调方法 websocket.onopen = function(){ setMessageInnerHTML("连接成功"); } //接收到消息的回调方法 websocket.onmessage = function(event){ setMessageInnerHTML(event.data); } //连接关闭的回调方法 websocket.onclose = function(){ setMessageInnerHTML("close"); } //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function(){ websocket.close(); } //将消息显示在网页上 function setMessageInnerHTML(innerHTML){ document.getElementById('message').innerHTML += innerHTML + '<br/>'; } //发送消息 function send(){ var message = document.getElementById('text').value; websocket.send(message); } //关闭连接 function closeWebSocket() { websocket.close(); } </script> </html>2.导入maven坐标代码如下(示例):<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>3.导入WebSocket服务端组件WebSocketServer,用于和客户端通信WebSocketServer.java代码如下(示例):package com.sky.websocket; import org.springframework.stereotype.Component; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * WebSocket服务 */ @Component @ServerEndpoint("/ws/{sid}") public class WebSocketServer { //存放会话对象 private static Map<String, Session> sessionMap = new HashMap(); /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session, @PathParam("sid") String sid) { System.out.println("客户端:" + sid + "建立连接"); sessionMap.put(sid, session); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message, @PathParam("sid") String sid) { System.out.println("收到来自客户端:" + sid + "的信息:" + message); } /** * 连接关闭调用的方法 * * @param sid */ @OnClose public void onClose(@PathParam("sid") String sid) { System.out.println("连接断开:" + sid); sessionMap.remove(sid); } /** * 群发 * * @param message */ public void sendToAllClient(String message) { Collection<Session> sessions = sessionMap.values(); for (Session session : sessions) { try { //服务器向客户端发送消息 session.getBasicRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); } } } }1.@ServerEndpoint主要是将目前的类定义成一个websocket服务器端, 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端 @ServerEndpoint("/ws/{sid}")注解是跟客户端中的连接WebSocket节点中的代码对应: 其中的Session是指当前服务端与客户端之间的会话2.@OnOpen@OnOpen注解表示当客户端连接上服务端时触发,加上@OnOpen后的方法就变成了回调方法。(建立连接的时候会调用)3.@OnMessage@OnMessage注解表示收到客户端发来的消息时触发。4.@OnClose@OnClose注解表示当连接关闭时触发。4.导入配置类WebSocketConfiguration,注册WebSocket的服务端组件WebSocketConfiguration.java代码如下(示例)package com.sky.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; /** * WebSocket配置类,用于注册WebSocket的Bean */ @Configuration public class WebSocketConfiguration { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }5.导入定时任务类WebSocketTask,定时向客户端推送数据WebSocketTask.java代码如下(示例)package com.sky.task; import com.sky.websocket.WebSocketServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @Component public class WebSocketTask { @Autowired private WebSocketServer webSocketServer; /** * 通过WebSocket每隔5秒向客户端发送消息 */ @Scheduled(cron = "0/5 * * * * ?") public void sendMessageToClient() { webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now())); } }三、演示结果当我们运行项目后,点击WebSocket.html,在服务端的控制台会出现连接成功字样,此时调用的是OnOpen回方法:客户端每隔五秒收到来自服务端的消息:客户端也能向服务端进行通信:当我们点击关闭连接的时候也会在服务端的控制台输出:刷新页面也会建立新的连接:总结以上就是WebSocket协议在java中的应用的相关知识点,希望对你有所帮助。 积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!
-
Node.js 团队近期新发布20.6.0版本,在今年4月的版本上增强了安全性和API引入,同时也增加对新操作系统的支持以及对 TypeScript 兼容性的优化,虽然现在该版本处于测试阶段,你觉得Node.js在未来会呈现怎样的发展态势呢?Node.js新版本发布,你觉得哪一性能提升最实用?你觉得Node.js与JAVA相比,其优势在哪里?未来会超越JAVA吗?
-
有人说“并发”是java语言中最晦涩难学的知识点,因为它涉及操作系统、内存、CPU、编程语言等多方面的基础知识,很考验程序员的内功。那么开发者们,你觉得java中最难学的知识点是什么?你为什么入坑 JAVA?
-
`CollectionUtils.isEmpty()`、`MapUtils.isEmpty()` 和 `ArrayUtils.isEmpty()` 都是 Apache Commons Collections 库中的工具类方法,用于判断集合、映射或数组是否为空。 - `CollectionUtils.isEmpty(collection)`:用于判断一个集合(如 List、Set)是否为空。如果集合为 null 或者集合中没有任何元素,则返回 true;否则返回 false。 - `MapUtils.isEmpty(map)`:用于判断一个映射(如 Map)是否为空。如果映射为 null 或者映射中没有任何键值对,则返回 true;否则返回 false。 - `ArrayUtils.isEmpty(array)`:用于判断一个数组是否为空。如果数组为 null 或者数组长度为 0,则返回 true;否则返回 false。 这三个方法的区别在于它们分别针对不同类型的数据结构进行判空操作。你可以根据需要选择适合的方法来判断相应的数据结构是否为空。
-
Java常用的判空函数有以下几种:使用==判断对象是否为null:if (object == null) { // do something }使用equals()方法判断字符串是否为null或空字符串:if (string == null || string.equals("")) { // do something }使用Objects.isNull()方法判断对象是否为null: ```java import java.util.Objects;if (Objects.isNull(object)) { // do something }4. 使用`StringUtils.isEmpty()`方法判断字符串是否为null或空字符串(需要引入Apache Commons Lang库): ```java import org.apache.commons.lang3.StringUtils; if (StringUtils.isEmpty(string)) { // do something }
-
Object.isNull() 和 obj == null 的区别在于它们检查对象是否为空的方式不同。Object.isNull() 是一个静态方法,用于检查一个对象是否为 null。它接受一个参数,即要检查的对象。如果对象为 null,它将返回 true,否则返回 false。这个方法主要用于避免使用 == 操作符进行 null 检查时可能出现的类型转换问题。Object.isNull(null); // true Object.isNull(undefined); // false Object.isNull(""); // false Object.isNull(0); // false Object.isNull([]); // false Object.isNull({}); // false Object.isNull(true); // false Object.isNull(false); // falseobj == null 是一个比较操作符,用于检查一个对象是否等于 null。它同样接受一个参数,即要检查的对象。如果对象为 null,它将返回 true,否则返回 false。但是,当使用 == 操作符进行 null 检查时,可能会出现类型转换的问题。例如:"" == null; // true,因为 "" 会被转换为 0,然后与 null 进行比较 0 == null; // true,因为 0 会被转换为字符串 "0",然后与 null 进行比较 false == null; // true,因为 false 会被转换为数字 0,然后与 null 进行比较总结:Object.isNull() 和 obj == null 都可以用于检查对象是否为 null,但 Object.isNull() 可以避免类型转换的问题。在大多数情况下,建议使用 Object.isNull() 进行 null 检查。
-
Java中使用List的流操作需要注意以下几点: 1. 性能问题:在使用流操作时,需要考虑到数据量的大小和处理方式对性能的影响。如果处理的数据量非常大,或者操作过程中创建了大量的临时对象,可能会导致性能下降或内存溢出等问题。因此,需要根据实际情况选择合适的操作方式和优化算法。 2. 异常处理:在使用流操作时,可能会出现各种异常情况,例如空指针异常、类型转换异常等。为了避免程序崩溃,需要在代码中添加适当的异常处理逻辑。 3. 并发问题:在使用流操作时,需要考虑多线程并发访问的问题。如果多个线程同时修改同一个List对象,可能会导致数据不一致或其他并发问题。因此,需要使用合适的同步机制来保证线程安全。 4. 代码可读性:在使用流操作时,需要遵循一定的编码规范和风格,以提高代码的可读性和可维护性。例如,可以使用Lambda表达式来简化代码,但需要注意不要过度使用Lambda表达式导致代码难以理解。 5. 兼容性问题:在使用流操作时,需要考虑不同版本的Java之间的兼容性问题。不同的Java版本可能对流操作的支持程度不同,因此需要根据实际情况选择合适的版本进行开发和测试。
-
Java中List的常用流处理包括:过滤(filter):根据给定的条件筛选出符合条件的元素。映射(map):将列表中的每个元素转换为另一种形式。排序(sorted):对列表中的元素进行排序。去重(distinct):去除列表中的重复元素。收集(collect):将流中的元素收集到一个新的集合中。以下是这些操作的示例代码:import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class ListStreamExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 过滤:筛选出偶数 List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println("偶数:" + evenNumbers); // 映射:将每个数字乘以2 List<Integer> doubledNumbers = numbers.stream() .map(n -> n * 2) .collect(Collectors.toList()); System.out.println("每个数字乘以2:" + doubledNumbers); // 排序:从小到大排序 List<Integer> sortedNumbers = numbers.stream() .sorted() .collect(Collectors.toList()); System.out.println("从小到大排序:" + sortedNumbers); // 去重:去除重复元素 List<Integer> distinctNumbers = numbers.stream() .distinct() .collect(Collectors.toList()); System.out.println("去除重复元素:" + distinctNumbers); // 收集:将流中的元素收集到一个新的集合中 List<Integer> newList = numbers.stream() .collect(Collectors.toList()); System.out.println("新集合:" + newList); } }
-
随着鸿蒙系统的愈发壮大,鸿蒙知识的学习也就变得越发迫切。本月给大家带来的技术干货合集就包括鸿蒙,spring,springboot,java,nginx,redis等众多内容,希望可以帮到大家。 1.Centos搭建KMS(vlmcsd)激活服务器的步骤【转】 https://bbs.huaweicloud.com/forum/thread-0251137381864278028-1-1.html 2.鸿蒙极速入门(一)-HarmonyOS简介 https://bbs.huaweicloud.com/forum/thread-0217137149871563005-1-1.html 3.鸿蒙极速入门(二)-开发准备和HelloWorld https://bbs.huaweicloud.com/forum/thread-0212137150055432004-1-1.html 4.鸿蒙极速入门(三)-TypeScript语言简介 https://bbs.huaweicloud.com/forum/thread-0217137150099699006-1-1.html 5.鸿蒙极速入门(四)-通过登录Demo了解ArkTS https://bbs.huaweicloud.com/forum/thread-0212137150569231005-1-1.html 6.鸿蒙极速入门(五)-路由管理(Router) https://bbs.huaweicloud.com/forum/thread-0217137150812608007-1-1.html 7.HarmonyOS 实战项目 https://bbs.huaweicloud.com/forum/thread-0298137147742910003-1-1.html 8.HarmonyOS 高级特性 https://bbs.huaweicloud.com/forum/thread-0263137147693666005-1-1.html 9.HarmonyOS应用开发 https://bbs.huaweicloud.com/forum/thread-02125137147620736007-1-1.html 10.HarmonyOS UI 开发 https://bbs.huaweicloud.com/forum/thread-0251137147552748004-1-1.html 11.准备HarmonyOS开发环境 https://bbs.huaweicloud.com/forum/thread-0217137147386754003-1-1.html 12.Nginx服务器安装配置SSL证书流程(实现HTTPS安装) https://bbs.huaweicloud.com/forum/thread-0224137038725392014-1-1.html 13.几款值得选的SSH客户端软件 https://bbs.huaweicloud.com/forum/thread-02107137038433887013-1-1.html 14.8个站酷免费字体且可商用 不担心字体版权 https://bbs.huaweicloud.com/forum/thread-0235137038369347011-1-1.html 15.7个加速搜索引擎收录网站实用有效方法 https://bbs.huaweicloud.com/forum/thread-02112137038294122014-1-1.html 16. Java 算法篇-深入理解递归(递归实现:青蛙爬楼梯)-转载 https://bbs.huaweicloud.com/forum/thread-0213136969605169006-1-1.html 17.【内网穿透】搭建我的世界Java版服务器,公网远程联机-转载 https://bbs.huaweicloud.com/forum/thread-02112136969569637009-1-1.html 18.【Nginx篇】Nginx轻松上手-转载 https://bbs.huaweicloud.com/forum/thread-0213136969448107005-1-1.html 19.【SpringBoot(IDEA)+Vue(Vscode)前后端交互】-转载 https://bbs.huaweicloud.com/forum/thread-02107136969215321009-1-1.html 20.【SpringBoot】| SpringBoot 集成 Redis-转载 https://bbs.huaweicloud.com/forum/thread-0240136952804547006-1-1.html 21.基于SpringBoot的个人博客管理系统的设计与实现 毕业设计开题报告-转载 https://bbs.huaweicloud.com/forum/thread-02112136952724159004-1-1.html 22.【SpringBoot篇】Spring_Task定时任务框架-转载 https://bbs.huaweicloud.com/forum/thread-02127136952689543005-1-1.html 23.【SpringCloud】Eureka基于Ribbon负载均衡的调用链路流程分析-转载 https://bbs.huaweicloud.com/forum/thread-0224136952632959005-1-1.html 24. Spring Boot单元测试-转载 https://bbs.huaweicloud.com/forum/thread-0213136952529904002-1-1.html 25.【Springboot系列】SpringBoot整合Jpa-转载 https://bbs.huaweicloud.com/forum/thread-0240136952500264005-1-1.html 26. Spring Boot + MyBatis-Plus实现数据库读写分离 -转载 https://bbs.huaweicloud.com/forum/thread-02107136952426802006-1-1.html
上滑加载中
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签