java IO流进阶 模拟上传头像系统详解

简介: 对之前javaSE基础万字详解篇之IO流 的内容补充,用IO流来模拟上传头像的系统,代码中作了较为详细的注释,需要较扎实的javaSE基础。

目录

一、前言:

二、思路:

       PS:直接看代码中的注释也可以.

       ①分析:

       ②总结:

三、代码:

       ①准备工作:

       ②代码演示:

       ③运行效果:

四、撒❀:


一、前言:

               这篇文章是对之前java IO流基础 万字详解的补充。我们试着用java IO流 来模拟一个独立的头像上传系统。看本篇分享需要有一定的javaSE基础,特别是IO流基础和File文件类基础,因为本篇就是对File类和IO流知识综合的一个小应用。基础好的同学也可以直接看代码。代码中做了非常详细的注释

二、思路:

       PS:直接看代码中的注释也可以.

       ①分析:

               1.要上传头像,多少要有一个保存所上传头像的目录,up以头像文件夹作为演示,如图:

image.png

               即,演示中我们所上传的头像,都会保存在“头像” 这个文件夹里头。当然,因为是新建的文件夹做演示用的,所以一开始头像文件夹内容为空,如图:

image.png

               2.既然是用到了IO流的知识,那IO流肯定是“上传头像”这具体一过程用到了,也就是字节流拷贝头像嘛,但是,我们如何获取用户想要上传的头像?  这里我们考虑选择Scanner类的nextLine()方法,让用户输入要上传头像的路径(因为该路径之后是可以作为IO流拷贝中数据源文件路径的)。

               3.收到用户输入的路径后,应该立刻判断该文件后缀名是否属于图片的格式,如果不是,应该提示用户录入的不是图片,要重新录入。

               4.如果路径符合图片的格式,就要进行二次判断了,判单传入的路径是否合法,以及是否是文件,如果路径非法,或者传入的是个名字叫xxx.png之类的文件夹而不是文件,就提示用户录入的路径不合法,要重新录入。最后就是要判断该图片是不是已经在头像文件夹中存在了,如果存在,应该提示用户要上传的头像已经存在了,无需再次上传,如果不存在,就准备进行上传工作。

               5.最后一步就是正式的上传工作了,使用高效字节流拷贝图片,直接搞定。  

       ②总结:

               经过上述的简略分析,我们大致确定要定义三个函数,

               第一个函数用于实现获取用户头像的功能,且要进行判断,判断是否为图片,且是否为合法路径。

               第二个函数用于判断要上传的头像是否已经存在,即是否已经上传过了。

               第三个函数用于执行确定的上传操作。

三、代码:

       ①准备工作:

               up也有个毛病就是演示教学的时候往往过于认真,所以更注重实操效果。因此我们要上传的头像就随便找了。如下是up随便找的几张普普通通的插图:

image.png

image.png

image.png

               🆗,小伙伴儿将就一下吧,毕竟是演示,图片不需要华丽。up将这三张图片放在了桌面上的csdn文件夹中作为备用。如图:image.png

               为了测试我们的系统,我特意将三张图片的格式分别设置为了.png  .jpg  和 .bmp格式,注意看,第一个文件夹我故意给它起名字为Fake.png,测试一下能否混淆视听。

       ②代码演示:

packageknowledge.simulation;
importjava.io.File;
importjava.util.Arrays;
importjava.util.Scanner;
importjava.io.BufferedInputStream;
importjava.io.BufferedOutputStream;
importjava.io.IOException;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
/**  java进阶之利用IO流模拟用户上传头像的功能。*  假设所有的用户头像都应该上传到  D:\JAVA\IDEA\file\头像 文件夹中*//*思路分析:①前言:既然要以IO流上传头像,很明显要用到我们的字节流拷贝头像。但肯定是确定了要上传时,才开始拷贝,不会盲目拷贝的。②因此我们需要先确定要上传的头像,即你想要上传哪个头像?并且如果这个头像已经上传过了,就没必要再上传了,直接用就可以了。③所以我们至少需要自定义三个独立的函数。第一个函数负责获取用户要上传的头像。第二个函数负责判断获取的头像是否已经上传。第三个函数负责将确定上传的头像进行上传工作。*/publicclassHeadPortrait {
publicstaticvoidmain(String[] args) throwsIOException {
//以下步骤是仅是main方法中的执行流程,具体实现要定义的函数放在了main函数的下方。//一.此处调用第一个方法,用来获取要上传的 用户头像 的路径(合法路径)/*注意该路径是用File类型作接收,因此我们最好在第一个方法中就直接返回一个File类型。*/FileportraitPath=getPortrait();
System.out.println(portraitPath);
//二.此处调用第二个方法,用来判断要上传的用户头像, 是否已经在头像文件夹中存在booleanexist=isExist(portraitPath.getName());
//三.若已存在, 提示用户该头像已经上传过了,无需浪费资源。if (exist) {
System.out.println("你**都上传过了,还传个鸡脖。给👴爬");
        } else {
//四.如果不存在,就上传该用户头像,并提示上传成功uploadHeadPortrait(portraitPath);
System.out.println("上传成功!");
        }
System.out.println("ok------------------------------------------------");
    }
//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------//以下分别是我们自定义的三个函数。//I.定义第一个方法,用来获取要上传的用户头像 的路径(合法路径)  --->  getPortrait():/*第一个方法用来获取要上传的用户头像的路径return返回具体的要上传的用户头像的路径(以File类型返回)*/publicstaticFilegetPortrait() {
//1.提示用户输入要上传的用户头像的路径,并用String类型作接收Scannersc=newScanner(System.in);
/*因为路径是字符串, 还要求输入,所以想到用Scanner 类的 nextLine()方法又因为不知道用户输入多少次才能录入正确,所以用 while(true)死循环 + break 的经典搭配。*///2./*判断该路径的后缀名是否是 .jpg  .bmp  .png, 这是最常见的三种图片格式。如果传入头像的路径不是以这三种格式作结尾, 就提示 : 哥,你就憋难为我了!咱改个后缀吧。*/while (true) {
System.out.println("请输入你要上传的用户头像的路径:");
StringtryPath=sc.nextLine();
if (tryPath.endsWith(".jpg") ||tryPath.endsWith(".bmp") ||tryPath.endsWith(".png")) {
FileportraitPath=newFile(tryPath);
/*用File类型作接收,就可以调用File类的判断方法了,而且可以直接返回File类型,与main中的代码无缝衔接。*///3./*1)如果输入的路径确是这三种格式之一,程序接着执行。但系统必须做出判断,判断该路径是否存在,以及该路径对应的是否是文件(不能是文件夹!)2)如果判断都莫得问题,就说明用户输入的路径是合法且正确的,直接返回对应的File类型。3)如果判断出现问题, 就提示: 您输入的路径不合法, 请重新录入。*/if (portraitPath.exists() &&portraitPath.isFile()) {
sc.close();
returnportraitPath;
                } else {
System.out.println("您输入的路径不合法, 请重新录入");
                }
            } else {
System.out.println("哥,你就憋难为我了!咱改个后缀吧。");
            }
        }
    }
//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------//II.定义第二个方法,用来判断要上传的用户头像, 是否已经在头像文件夹中存在/*注意,该方法的返回值类型为boolean类型。*/publicstaticbooleanisExist(StringportraitPath) {
//1.将我们的头像文件夹封装成File对象FileDestinationFolder=newFile("D:\\JAVA\\IDEA\\file\\头像");
//2.获取头像文件夹中 所有的文件(夹) 的名称数组String[] FileNames=DestinationFolder.list();                 //注意是String[] 来接收System.out.println(Arrays.toString(FileNames));                //这里我们输出头像文件夹中已有文件的名称数组//3.利用增强for遍历第二步获取到的数组,并将获取到的数组依次和我们上传头像的路径portraitPath进行比较for (StringFileName : FileNames) {
if (FileName.equals(portraitPath)) {
//4.如果目标文件夹(即头像文件夹)中有和上传的头像路径一致的,就说明该头像已经存在了,返回truereturntrue;
            }
        }
//5.如果不一致,就说明该用户头像不存在,返回false/*细节:  应该等到所有FileName都和portraitPath不相等时,再去返回false,因此返回false的语句放在了增强for外面。*/returnfalse;
    }
//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------//III.定义第三个方法,是上传用户头像步骤的具体实现。//IO流拷贝核心六部曲:/*1.创建字节输入流对象,关联数据源文件2.创建字节输出流对象,关联目的地文件3.定义变量,记录读取到的内容4.循环读取,只要条件满足就一直读,并将读取到的内容赋值给变量5.将读取到的数据写入到 目的地文件中6.关闭资源 (及异常处理)*/publicstaticvoiduploadHeadPortrait(FileportraitPath) throwsIOException { //建议这里直接抛出父类异常IOException//1.创建字节缓冲输入流对象,关联数据源文件BufferedInputStreambi=newBufferedInputStream(newFileInputStream(portraitPath));
//2.创建字节缓冲输出流对象,关联目的地文件BufferedOutputStreambo=newBufferedOutputStream(newFileOutputStream("D:\\JAVA\\IDEA\\file\\头像\\"+portraitPath.getName()));
/*因为模拟上传头像系统,而系统在获得数据后都会有备份原文件的数据,因此此处我们要先让拷贝过来的头像和源文件名称一致,于是使用了 File类的getName() 方法这么写可以保证拷贝后的文件与数据源文件名字一样。*///3.定义变量,记录读取到的内容intlen;
//4.循环读取,只要条件满足就一直读,并将读取到的内容赋值给变量while ((len=bi.read()) !=-1) {
//5.将读取到的数据写入到 目的地文件中bo.write(len);      //使用了一次写入一个字节的重载方法write(int b)        }
//6.释放资源bi.close();
bo.close();
    }
}

image.gif

       ③运行效果:

               好的,我们看看运行效果如何:

               我们先输入一个不是图片的路径,如下演示:

image.png


               如gif所示,当我们上传一个以非图片格式作为后缀的路径时,它提示我们后缀不是图片格式。那我们接着上传一个以图片格式结尾的文件夹。(文件夹不是文件,图片属于文件!) ,如图:

 
image.png

               它提示我们路径非法,因为它不是一个文件,而只是个名字叫Fake.png的文件夹。那我们传入一个真正的要上传的头像的路径,演示如下:

image.png

               好的,它提示我们上传成功了,那我们切到头像文件夹下,看看是否存在test1.png头像,如图:

image.png

               雀氏成功了。我们再接着把test2.jpg  和 test3.bmp传上去。演示如下:

image.png

               可以看到test2.jpg 和 test3.bmp也成功上传了 。🆗,我们的演示就全部结束了。

image.png

四、撒❀:

               能将代码全部理解并成功运行的,恭喜你,你有着扎实的基础!

System.out.println("END---------------------------------------------------------------------------------");

目录
相关文章
|
1月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
59 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
13天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
42 3
|
1月前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
47 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
1月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
67 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
16天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
16 1
|
18天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
21天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
23天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
46 1
|
27天前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。
|
1月前
|
Java 关系型数据库 MySQL
基于Java的学生成绩管理系统/学生信息管理系统
基于Java的学生成绩管理系统/学生信息管理系统
38 2