1. 准备工作
1.1. 部署kiftd
本文将介绍如何通过进程间通信的方式将kiftd作为一个独立进程与您的Java项目进行接入。这种接入方式的优点是操作简单、可以将kiftd作为一个可选模块接入、最大程度地避免代码侵入并保证程序之间的独立性,比较适合对并发量需求不高并需要快速实现接入的项目(若您的项目并发量较大或需要更好的控制灵活性,推荐使用kiftd的源代码进行代码级的整合接入)。
首先,您需要将kiftd安装至您的硬盘中(安装流程与正常使用无任何区别)。此外,您还必须确保jdk中的bin文件夹已经被正确加入至环境变量PATH中。为了验证该环境变量配置正确,请在命令提示符(cmd)或终端(Shell)中执行如下命令:
java -version
如果环境变量PATH的配置正确,那么您将看到类似如下内容的输出(以Oracle JDK 1.8.0_131为例):
java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
请注意:kiftd的运行环境要求为 JDK 1.8 或 Java 8及以上 版本,不支持更早的版本。此外,请勿将kiftd安装至包含中文的路径下。
完成上述步骤后,您应该尝试启动kiftd以确保其能够运行。测试完毕后需 退出程序 ,避免与接下来的操作发生冲突。
特别提示:请确保kiftd使用的端口号与您的程序本身或是其他正在运行的服务均不冲突。例如:如果您使用了Apache Tomcat,其端口号为8080,那么kiftd的端口号需换用其他端口。
2. 在程序中控制kiftd启动
2.1. 以独立进程方式启动kiftd
控制kiftd的最基本示例便是能使用代码来启动它。 要实现这一功能,可以借助java自带的执行系统命令和进程通信功能。
示例:使用java.lang.Runtime工具可得到操作系统的运行环境,并以开启独立进程的方式启动kiftd:
try { //... Process process = Runtime.getRuntime().exec("java -jar {kiftd主程序的完整路径} -console"); //... } catch (Exception e) { //... }
其中, {kiftd主程序的完整路径}
处必须填写您的kiftd中jar程序的完整路径(例如“D:\\Programs\\kiftd-master\\kiftd-1.0.17-RELEASE.jar”)。
执行上述代码后,kiftd将进行文件系统初始化、配置文件生成、文件系统校对等准备工作,但并不会开启服务器引擎。接下来,您还需要使用该进程返回的java.lang.Process对象获得该进程的输出流,向其发送“开启服务器”指令:
//... PrintWriter writer = new PrintWriter(process.getOutputStream());//使用process对象得到输出流并生成一个PrintWriter。 writer.println("-start");//向kiftd发送启动服务器指令 writer.flush(); //...
上述两步执行完毕后,kiftd将开启服务器引擎并提供访问。您可以打开浏览器,访问http://127.0.0.1:{kiftd端口号}/
进行测试。
2.2. 关闭kiftd服务器引擎或终止kiftd运行
当您需要关闭kiftd服务器引擎并停止所有访问时,请向其发送“关闭服务器引擎”指令:
//... writer.println("-stop"); writer.flush(); //...
当然,您也可以直接向其发送“退出”指令来彻底结束kiftd的进程:
//... writer.println("-exit"); writer.flush(); //...
2.3. 监听kiftd运行状态
监听kiftd的运行状态对于接入kiftd而言也十分重要,你可以通过kiftd进程的Proceess对象获得一个输入流,并转换为一个BufferedReader:
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
接下来,通过BufferedReader对象读取kiftd进程返回的信息,这些信息会以字符串类型返回并可通过如下方法读取:
reader.readLine();
kiftd的进程在运行中会不定时地返回一些信息。因此,正确的做法是开启一个独立的线程来循环监听返回信息。示例如下:
try { //... Process process = Runtime.getRuntime().exec("java -jar {kiftd主程序的完整路径} -console"); //以独立的线程实时监控该进程输出信息 Thread t = new Thread(() -> { BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; try { while ((line = reader.readLine()) != null) { System.out.println(line);//实时打印进程的返回信息,您可以根据这个信息判断kiftd的运行状态 } } catch (IOException e) { e.printStackTrace(); } }); t.start(); //... } catch (Exception e) { //... }
上述示例运行后,您会在控制台内打印类似于下列内容的信息:
[2019年04月11日 17:00:28] 青阳网络文件系统-kiftd 控制台模式[Console model] [2019年04月11日 17:00:28]Character encoding with UTF-8 [2019年04月11日 17:00:28]正在初始化服务器... [2019年04月11日 17:00:28]正在载入配置文件... [2019年04月11日 17:00:28]配置文件载入完毕。正在检查配置... [2019年04月11日 17:00:28]正在检查服务器配置... [2019年04月11日 17:00:28]检查完毕。 [2019年04月11日 17:00:28]准备就绪。 命令帮助: kiftd:您可以输入以下指令以控制服务器: -start 启动服务器 -stop 停止服务器 -exit 停止服务器并退出应用 -restart 重启服务器 -files 文件管理 -status 查看服务器状态 -help 显示帮助文本
您可以通过kiftd进程返回的信息内容实现对其运行状态的监听,并进行相应的处理。
3. 操作文件系统
实现对kiftd内部文件的控制是一个重要内容。实际上,操作kiftd的文件系统很简单:只需根据《kiftd说明文档》中“使用命令进行本地文件管理”一章提供的命令进行文件及文件夹的导入、导出和删除即可。本节将对涉及到的内容提供具体示例代码,以供参考。
注意:下列操作均应在一个线程中进行,因为这些操作不保证线程安全。
3.1. 进入文件管理模式
操作文件系统必须将kiftd的命令模式切换至“文件管理模式”。方法如下:
//... writer.println("-files"); writer.flush(); //...
3.2. 切换目录
无论是进行导入、导出还是删除操作,均只能针对当前所在的目录进行。在进入“文件管理模式”后,默认会进入“/ROOT”目录,您也可以使用目录切换命令进入其他目录。方法如下:
//... writer.println("cd {要进入的目录名称}"); writer.flush(); //...
与Unix/Linux操作系统中提供的cd命令不同,该命令不支持跨路径切换。示例:当您需要切换至“/ROOT/docs/2018_01/”目录时,必须发送两次切换目录指令:“cd docs”、“cd 2018_01”,而不能直接发送“cd docs/2018_01”。
如需返回上一级,请使用“cd ../”或“cd ..”。
如需获取当前目录的内容,请发送“ls”指令并通过监听kiftd运行状态的方式得到返回结果。
3.3. 导入、导出及删除文件或文件夹
1,将本地硬盘中的文件或文件夹导入至当前目录内:
//... writer.println("import {要导入的文件或文件夹的完整路径}"); writer.flush(); //...
其中,{要导入的文件或文件夹的完整路径}
处必须使用目标文件或文件夹的完整路径,例如“D:\\output\\”或“/home/myaccount/docs/log1001.txt”。
值得注意的是:kiftd并未提供创建文件夹的指令。如需在kiftd中创建文件夹,只需在本地创建好文件夹,并在其中存入相应的文件后再进行导入即可(实际上,导入空的文件夹并无意义)。
2,将kiftd中的文件或文件夹导出至本地硬盘中:
//... writer.println("export {要导出的文件或文件夹名称} {存放文件夹的完整路径}"); writer.flush(); //...
需要注意的是:{存放文件夹的完整路径}
必须已经存在,且是一个具备写权限的文件夹。若存放文件夹不存在,则kiftd会终止导出操作。
3,删除kiftd中的文件或文件夹:
//... writer.println("rm {要删除的文件或文件夹名称}"); writer.flush(); //...
3.4. 退出文件管理模式
如需退出“文件管理模式”并回到kiftd的命令模式,请向kiftd进程发送“退出文件管理模式”指令:
//... writer.println("exit"); writer.flush(); //...
4. 动态添加、修改及删除用户账户
4.1. 通过修改配置文件进行账户配置
除了基本的文件操作外,kiftd也支持动态修改账户设置。事实上,由于kiftd的账户信息是使用.properties进行文件存储的,因此您可以直接通过java自带的Properties工具类对其进行解析。
示例:获取kiftd中admin账户的密码:
try { //... Properties account=new Properties(); account.load(new FileInputStream(new File("{kiftd主目录下conf文件夹的完整路径}", "account.properties"))); String pwd=account.getProperty("admin.pwd");//该字符串即为密码 //... } catch (Exception e) { //... }
同理,也可以使用下列方法对admin账户的密码进行修改,并更新至账户设置文件中:
account.setProperty("admin.pwd", "{新密码}"); account.store(new FileOutputStream(new File("{kiftd主目录下conf文件夹的完整路径}", "account.properties")),"{注释内容}");
删除账户和增加账户的操作均与此类似,相应的配置方式可参见《kiftd说明文档》中对账户设置的介绍,因此不再提供具体示例。
当更新完成后,kiftd将会在运行时自动更新账户配置内容,并立即生效。
5. 修改kiftd服务器设置项
5.1. 通过修改配置文件进行服务器配置
该操作的过程与4.1.
通过修改配置文件进行账户配置章中提到的方法完全相同,区别仅在于:存储服务器配置的文件名称为server.properties
。
该文件内的具体配置内容请参阅《kiftd说明文档》中的“服务器设置”一章内“直接修改配置文件”一节的内容。
特别提示:修改服务器配置文件 必须重启kiftd后生效 ,仅重启kiftd服务器引擎无法完成更新。因此,当kiftd服务器配置更新后,您必须结束kiftd原进程并重新开启它以令新配置生效。