Java开发过程中的小知识点

举报
多米诺的古牌 发表于 2022/01/19 21:31:56 2022/01/19
【摘要】 1.创建文件创建的文件首先要创建一个File对象,并且传递路径参数,此时创建文件可能会碰到许多坑,比如可能会碰到没有上级路径、创建的是文件夹等等1.1 错误1-创建的是文件夹File file = new File(path路径);if(!file.exists()) {file.mkdirs();}此时创建的只会是类似xxx.docx或者xxx.txt之类的文件夹,没有看错,虽然是有后缀的...

1.创建文件

创建的文件首先要创建一个File对象,并且传递路径参数,此时创建文件可能会碰到许多坑,比如可能会碰到没有上级路径、创建的是文件夹等等

1.1 错误1-创建的是文件夹

File file = new File(path路径);

if(!file.exists()) {file.mkdirs();}此时创建的只会是类似xxx.docx或者xxx.txt之类的文件夹,没有看错,虽然是有后缀的但创建出来的还会是文件夹。

1.2 错误2-没有上级路径

File file = new File(path路径);

if(!file.exists()) {file.createNewFile();}使用createNewFile()方法确实是创建文件的,但是如果上级目录或者上上级目录等不存在,依然会报错。

1.3 正确的创建文件写法

先通过file.getParentFile().exists()方法判断上级目录是否存在,如果不存在根据获取的上级目录,通过mkdirs()方法根据上级目录信息自动创建多层级目录,此时上级目录以及上上级目录等待都确定有了,这时候我们再判断一下索要创建的文件是否存在,如果不存在则通过createNewFile()方法进行创建。

File file = new File(filePath);
if (!file.getParentFile().exists()){
    file.getParentFile().mkdirs();
}

if (!file.exists()) {
    file.createNewFile();
}

1.4 按照年月日曾经创建文件夹

如何按照2022/01/19/test.txt这样的形式创建文件和对应的文件夹呢?需要如下几步即可:

1.4.1 封装个方法,将日期形式拼成一个字符串;

String dir = "";
Date now = new Date();
dir  = DateFormatUtils.format(now, "yyyy/MM/dd")

1.4.2 将需要创建的文件名和创建的这个字符串拼接起来

一定要注意拼接的时候中间要加"/",此时拼接完的文件名称就是2022/01/19/test.txt

String fileName= "text.txt";
String newName = dir +"/"+ fileName;

1.4.3 根据当前日期创建文件

此时就可以自动根据时间日期自动创建对应的目录了,此处在上传下载导入导出这里应该应用的很多,小技巧get~

File file = new File(newName);
if (!file.getParentFile().exists()){
    file.getParentFile().mkdirs();
}

if (!file.exists()) {
    file.createNewFile();
}

2.如何判断list中的重复项

2.1 通过hashset

通过将list转换为hashset,因为hashset是会自动去重的,所以比较转换前后的size长度就可以知道是否有重复项了,这样会比较快捷,但是缺点是无法精确找到到底哪些元素重复了,只能判断整体是否有重复项。

List<Test> list = new ArrayList<Test>();

list.add.....

HashSet<Test> set = new HashSet<Test>(list);

if(list.size() != set.size()){//如果长度不相等就说明有重复项}

2.2 通过contains方法判断

创建一个空的list,然后比对list和list2中的元素,如果不存在就将元素加入空的list2中,这样list中重复的元素就会暴露出来,这样可以精确找到到底是哪些元素是重复的,但缺点是会耗时一些。

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(1);
list.add(3);
list.add(3);
list.add(2);
List<Integer> list2 = new ArrayList<>();
for (Integer i : list) {
    if (list2.contains(i)) {
        System.out.println("list中存在重复的数据为:"+ i);
    }
    list2.add(i);
}

2.3 双重for循环进行判断

这种更加耗时一些,但是优点是可以更加精确的判断出,重复项是哪些元素,以及重复项的位置。

for (int i = 0; i < list.size() - 1; i++){
     temp  = list.get(i);
     for (int j = i + 1; j < list.size(); j++){
          if (temp.equals(list.get(j))){
               System.out.println("第" + (i + 1) + "个元素跟第" + (j + 1) + "个元素重复,值是:" + temp);
           }
     }
}

3. 若依框架的使用爬坑

3.1 No converter for [class cn.xxx.common.core.domain.RestResult] with preset Content-Type 'application/octet-stream'报错

问题描述:当我在一个接口中写了一个下载方法,最后返回下载后的文件路径,路径返回成功,但是实际上调用接口返回的是一堆乱码。。。

解决办法:因为若依框架中会对这种带请求和响应的参数进行拦截(暂时这里还有待研究。。。),在不知道怎么放过咱们的请求的情况下,那就不要设置这些响应头,类型之类的东西了。。。只要没有去设置,我们还是朋友。。。暂时是这样的,将这些咱们自主去设置的请求或者响应的的东西去掉后,一切正常了,世界也变得清新起来~

public String test(HttpServletRequest request, HttpServletResponse response){}
response.addHeader("Content-Disposition", "attachment;filename=" + newName+"");
response.addHeader("Content-Length", "" + file.length());
response.setContentType("application/octet-stream");

以上就是开发过程中遇到的大大小小的坑,新的一天,继续努力~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。