Java开发过程中的小知识点
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");
以上就是开发过程中遇到的大大小小的坑,新的一天,继续努力~
- 点赞
- 收藏
- 关注作者
评论(0)