Java--ByteArrayInputStream和ByteArrayOutStream

本文展示了一个 Java 示例代码,该代码使用 ByteArrayInputStream 和 ByteArrayOutputStream 类来读取字符串并将其转换为小写形式。通过这个简单的例子,可以了解如何操作字符串及进行输入输出流的基本应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码如下:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;




public class ByteArrayDemo01 {
	public static void main(String args[]){
		String str="HELLOJAVA";
		ByteArrayInputStream bis=new ByteArrayInputStream(str.getBytes());
		ByteArrayOutputStream bos=new ByteArrayOutputStream();
		int temp=0;
		while((temp=bis.read())!=-1){
			char c=(char)temp;
			bos.write(Character.toLowerCase(c));
		}
		String newStr=bos.toString();
		try {
			bis.close();
			bos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.print(newStr);
	}


}

运行如下:

hellojava

### 获取使用 `weixin-java-pay` 公钥 为了安全地完成微信支付集成,开发者需要验证来自微信服务器的通知签名以及解密敏感数据。这涉及到获取并正确配置微信支付公钥。 #### 1. 引入依赖项 对于希望利用第三方封装库简化操作的应用程序来说,可以考虑引入由 Binary Wang 维护的 `weixin-java-pay` 库[^2]: ```xml <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-pay</artifactId> <version>4.6.0</version> </dependency> ``` #### 2. 配置证书路径与商户私钥 在应用启动时初始化必要的参数,包括但不限于 API v3 密钥、商户号 (mchid) 序列号 (serialNo),还有最重要的——设置用于存储平台证书文件的位置 (`certPath`) 及其对应的商户私钥 (`privateKey`)。这些信息通常保存在一个配置类中以便于管理。 ```java @Configuration public class WxPayConfig { @Value("${wx.pay.merchant-id}") private String mchId; @Value("${wx.pay.api-v3-key}") private String apiV3Key; @Bean(name = "wxPayService") public IWXPayService wxPayService() throws Exception { WXPayConfiguration config = new WXPayConfiguration(); // 设置API V3 Key, 商户ID等基本信息 config.setAppId("your-app-id"); config.setMchId(mchId); config.setApiKey(apiV3Key); // 加载本地证书(.pem格式), 并指定商户私钥 File certFile = ResourceUtils.getFile("classpath:apiclient_cert.pem"); config.setCertStream(new FileInputStream(certFile)); config.setPrivateKey(privateKey); return new DefaultWXPayServiceImpl(config); } } ``` #### 3. 下载并缓存微信支付平台公钥 当接收到微信推送过来的消息或回调通知时,需先下载最新的平台公钥来校验消息的真实性。此过程可通过调用微信提供的接口 `/v3/certificates` 来实现,并将返回的结果中的公钥部分提取出来作为后续加密运算的基础。 ```java @Service @Slf4j public class PublicKeyManager { private final RestTemplate restTemplate; private static Map<String, String> publicKeyCache = new ConcurrentHashMap<>(); @Autowired public PublicKeyManager(RestTemplateBuilder builder){ this.restTemplate = builder.build(); } /** * 更新并获取最新版本的微信支付平台公钥. */ public synchronized void refreshPublicKey(){ try{ ResponseEntity<String> responseEntity = restTemplate.getForEntity( "https://api.mch.weixin.qq.com/v3/certificates", String.class ); JSONObject jsonObject = JSON.parseObject(responseEntity.getBody()); JSONArray dataArr = jsonObject.getJSONArray("data"); for(int i=0;i<dataArr.size();i++){ JSONObject itemObj = dataArr.getJSONObject(i); String serialNumber = itemObj.getString("encrypt_certificate").getJSONObject("algorithm").getString("value"); String pubKeyContent = itemObj.getString("encrypt_certificate").getJSONObject("ciphertext").getString("value"); // 解码Base64编码后的字符串得到实际的PEM格式公钥内容 byte[] decodedBytes = Base64.decode(pubKeyContent.getBytes(StandardCharsets.UTF_8)); X509Certificate certificate = CertificateFactory.getInstance("X.509") .generateCertificate(new ByteArrayInputStream(decodedBytes)); publicKeyCache.put(serialNumber,certificate.getPublicKey().toString()); log.info("Updated WeChat Pay platform public key with SN={}", serialNumber); } }catch(Exception e){ throw new RuntimeException(e.getMessage(),e); } } /** * 根据给定的序列号查找已缓存的公钥实例. * * @param sn 序列号 * @return 对应的公钥对象;如果找不到则抛出异常 */ public PublicKey getPublicKeyBySerial(String sn){ if(!publicKeyCache.containsKey(sn)){ refreshPublicKey(); } return ((RSAPublicKey)(new RSAPublicKeySpec(BigInteger.valueOf(Long.parseLong(publicKeyCache.get(sn))),BigInteger.valueOf(65537)))); } } ``` 上述代码片段展示了如何通过 HTTP 请求访问微信公众平台所提供的公开 API 接口以取得当前有效的 RSA 公钥,并将其换成适合 Java 使用的形式加以储存。每当应用程序重启或是距离上次更新时间过久之后都会触发一次新的请求从而确保所使用的总是最新版次的安全凭证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值