Java# 日常开发中遇到的问题

Posted LRcoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java# 日常开发中遇到的问题相关的知识,希望对你有一定的参考价值。

1. BigDecimal 比较大小

// a、b 均不能为null

if (a.compareTo(b) < 0) 
    System.out.println("a 小于 b");


if (a.compareTo(b) == 0) 
    System.out.println("a 等于 b");


if (a.compareTo(b) > 0) 
    System.out.println("a 大于 b");

2. BigDecimal 舍入模式

使用 BigDecimal的 divide时需要注意舍入模式(Rounding mode)

-- ROUND_UP              // 向远离0的方向舍入
    
-- ROUND_DOWN            // 向 0 方向摄入
    
-- ROUND_CEILING         // 向正无穷方向舍入
    
-- ROUND_FLOOR           // 向负无穷方向舍入
    
-- ROUND_HALF_UP         // 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55 保留一位小数结果为1.6  【四舍五入】
    
-- ROUND_HALF_DOWN       // 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入,  1.55 保留一位小数结果为1.5 
    
-- ROUND_HALF_EVEN       // 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用 ROUND_HALF_UP ,如果是偶数,使用 ROUND_HALF_DOWN
    
-- ROUND_UNNECESSARY     // 计算结果是精确的,不需要舍入

示例用法

BigDecimal a = BigDecimal.valueOf(1233);
BigDecimal b = BigDecimal.valueOf(1000);

BigDecimal divide = a.divide(b, 2, BigDecimal.ROUND_HALF_UP);  // 2代表保留 2位小数

3. 解决读取文件出现乱码

  • 首先将要读取的文本文件的编码格式设置为 UTF-8

  • 使用InputStreamReader 类读取文件,因为它的构造方法可以指定字符集

    InputStreamReader isr = new InputStreamReader(new FileInputStream("E:/demo.txt"), StandardCharsets.UTF_8);
    
    // 使用 BufferedReader 类是为了使用 readLine() 方法
    BufferedReader buff = new BufferedReader(isr);
    

    InputStreamReader 类是从字节流到字符流的桥接器:它使用指定的字符集读取字节并将它们解码为字符。

4. split() 相关问题

  • 需要转义的特殊字符(在字符前面加 \\\\

    (  [    /  ^  -  $  |    ]  )  ?  *  +  .
    
  • 底层实现

  • 如果一个字符串中有多个分隔符,可以使用 | 作为连字符

    String str = "a=1 and b=2 or c=3";
    String[] arr = str.split("and|or");
    

5. Druid 监控页面未授权访问

项目背景:项目中引入了 druid-spring-boot-starter,且将功能设置为开启状态

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid-spring-boot-starter</artifactId>
	<version>1.1.16</version>
</dependency>

spring.datasource.druid.stat-view-servlet.enabled=true

此时直接在项目地址后面加: /druid/index.html即可进入监控页面

解决方法

  • 增加账号密码登录

    spring.datasource.druid.stat-view-servlet.enabled=true
    spring.datasource.druid.stat-view-servlet.login-username=root
    spring.datasource.druid.stat-view-servlet.login-password=root123456
    
  • 或直接禁止页面访问(或者不配置,此配置默认为 false)

    spring.datasource.druid.stat-view-servlet.enabled=false
    

6. 获取图片的大小和尺寸

6.1 本地获取图片的大小和尺寸

/**
 * 获取本地图片的尺寸,宽、高
 * @param path
 * @throws IOException
 */
public void getImgSizeWidthHeight(String path) throws IOException 
    File pic = new File(path);
    BufferedImage bImg = ImageIO.read(new FileInputStream(pic));
    // 源图大小
    System.out.printf("%.1f\\n", pic.length() / 1024.0);
    // 源图宽度
    System.out.println(bImg.getWidth());
    // 源图高速
    System.out.println(bImg.getHeight());

6.2 获取服务器上图片的尺寸

/**
 * 获取服务器上图片的宽、高
 * @param imgUrl
 * @throws IOException
 */
public void getImgSizeWidthHeight(String imgUrl) throws IOException 
    URL mUrl = new URL(imgUrl);
    BufferedImage bImg = ImageIO.read(mUrl);
    // 源图宽度
    System.out.println(bImg.getWidth());
    // 源图高速
    System.out.println(bImg.getHeight());

7. 获取接口请求头里的Authorization

需要使用 org.springframework.web.context.request 包下的 RequestContextHolder 类

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) 
    HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
    String authorization = request.getHeader("Authorization");

8. 无效的目标发行版:xx

  • File -> Project Structure… -> Project Setting 下的 JDK版本,共 4 处

  • 若还是未解决的话,则需要在 Settings 中设置

9. 下载文件

9.1 下载网络文件

/**
 * 网络文件下载
 * @param fileUrl 网络文件地址
 * @param outPath 保存到本地的地址
 */
public static void downloadNetFile(String fileUrl, String outPath) 
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try 
        URL url = new URL(fileUrl);
        URLConnection urlConnection = url.openConnection();
        InputStream is = urlConnection.getInputStream();
        bis = new BufferedInputStream(is);
        FileOutputStream fos = new FileOutputStream(outPath);
        bos = new BufferedOutputStream(fos);
        byte[] buffer = new byte[1024];
        int len;
        while ((len = bis.read(buffer)) != -1) 
            bos.write(buffer, 0, len);
        
     catch (IOException e) 
        e.printStackTrace();
     finally 
        if (bos != null) 
            try 
                bos.close();
             catch (IOException e) 
                e.printStackTrace();
            
        

        if (bis != null) 
            try 
                bis.close();
             catch (IOException e) 
                e.printStackTrace();
            
        
    

9.2 以流的形式下载

/**
 * @param path     欲下载的文件的路径
 * @param response 响应
 * @return
 */
public HttpServletResponse download(String path, HttpServletResponse response) 
    try 
        File file = new File(path);
        String filename = file.getName();
        InputStream fis = new BufferedInputStream(new FileInputStream(path));
        byte[] buffer = new byte[fis.available()];
        fis.read(buffer);
        fis.close();
        // 清空response
        response.reset();
        // 设置response的Header
        response.setCharacterEncoding("utf-8");
        response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
        response.addHeader("Content-Length", "" + file.length());
        OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
        response.setContentType("application/octet-stream");
        toClient.write(buffer);
        toClient.flush();
        toClient.close();
     catch (IOException ex) 
        ex.printStackTrace();
    
    return response;

以上是关于Java# 日常开发中遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

Java# 日常开发中遇到的问题

.NET下面的web service开发,如何读取SOAP头里面的信息?

AS Notes|记录日常开发遇到的 AS 问题(不断更新。。。

hadoop集群日常维护中遇到的一些问题汇总

hadoop集群日常维护中遇到的一些问题汇总

软件测试;日常遇到的问题解决