String resourcePath = getClass().getClassLoader().getResource("").getPath();获得的路径是E:\%e5%8a%a8%e5%8a%9b%e8%8a%82%e7%82%b9\Java\xml-annotation-orm\out\production\xml-orm-mysql-reflection\,只想要xml-orm-mysql-reflection\该怎么做
时间: 2023-07-21 18:59:53 浏览: 186
如果您只想要路径中的 "xml-orm-mysql-reflection\" 部分,您可以使用以下代码来获取它:
```java
String resourcePath = getClass().getClassLoader().getResource("").getPath();
String desiredPath = resourcePath.substring(resourcePath.lastIndexOf("xml-orm-mysql-reflection"));
```
这将从 `resourcePath` 字符串中获取最后出现的 "xml-orm-mysql-reflection" 部分及其后面的内容。请注意,这假设 "xml-orm-mysql-reflection\" 是路径中的最后一个目录,并且没有文件名或其他内容跟在它的后面。
相关问题
下面这两段代码的区别在哪?业务中如何区分使用?String path1 = new ClassPathResource("").getAbsolutePath(); String path2 = getClass().getClassLoader().getResource("").getPath();
这两段代码的功能都是获取当前项目的根路径。
区别在于:
- 第一种方式使用Spring提供的ClassPathResource类,需要依赖Spring框架,而第二种方式则是使用Java标准库中的ClassLoader类,不需要依赖任何框架。
- 第一种方式返回的是项目的classes目录的绝对路径,而第二种方式返回的是项目的根目录的绝对路径。
业务中如何选择使用呢?
- 如果你的项目中使用了Spring框架,那么可以使用第一种方式。
- 如果你的项目中没有使用Spring框架,或者不想依赖任何框架,那么可以使用第二种方式。
注意:在使用第二种方式时,需要注意路径中可能会包含空格或其他特殊字符,需要进行URL解码。可以使用如下方式进行解码:
```
String path2 = URLDecoder.decode(getClass().getClassLoader().getResource("").getPath(), "UTF-8");
```
private String getLocalImg(String path) throws IOException { String key = "yiqilai_coupon_default_img"; String cacheValue = redisTemplate.opsForValue().get(key); if (!StringUtils.isEmpty(cacheValue)) { return cacheValue; } //String defaultImg = this.getClass().getResource("classpath:").getPath() + "template/yiqilai/coupon_default.jpg"; InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path); try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1023]; int len; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } String base64Str = new String(Base64Utils.encode(outputStream.toByteArray()), StandardCharsets.UTF_8); redisTemplate.opsForValue().set(key, base64Str, 10, TimeUnit.MINUTES); return base64Str; } finally { inputStream.close(); } }
根据你提供的代码片段,这段代码是一个用于获取本地图片并将其转换成 Base64 编码的方法。
首先,声明了一个字符串变量 `key`,用于指定缓存中存储图片的键。
接下来,通过调用 `redisTemplate.opsForValue().get(key)` 方法从缓存中获取图片的缓存值 `cacheValue`。
然后,通过判断 `cacheValue` 是否为空,如果不为空,则直接返回缓存中的图片数据。
如果缓存中不存在图片数据,接下来的代码将会执行。
这段代码通过调用 `this.getClass().getClassLoader().getResourceAsStream(path)` 方法获取到指定路径下图片的输入流 `inputStream`。
然后,创建一个 `ByteArrayOutputStream` 对象 `outputStream` 用于存储字节数据。
接着,使用一个循环读取 `inputStream` 中的字节数据,并将其写入到 `outputStream` 中。
之后,使用 `Base64Utils.encode(outputStream.toByteArray())` 方法将字节数据进行 Base64 编码,并将结果转换为字符串类型。
接下来,使用 `redisTemplate.opsForValue().set(key, base64Str, 10, TimeUnit.MINUTES)` 方法将编码后的图片数据存储到缓存中,并设置过期时间为 10 分钟。
最后,返回 Base64 编码字符串 `base64Str`。
需要注意的是,在代码最后使用了 `finally` 块来确保输入流 `inputStream` 被关闭。这是为了避免资源泄漏。
阅读全文