程序接入

您是否希望将程序运行中生成的文件(例如运行日志、爬虫结果、流量报告、备份文件等)自动发布至网络,以供其他用户能够随时随地下载?或是希望在自己开发的办公系统中提供一个工作资料存储功能?除了从零实现一个文件分享平台外,kiftd也许能为您提供另外一种可能。

目录


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的命令模式切换至“文件管理模式”。方法如下:

//...
PrintWriter writer = new PrintWriter(p.getOutputStream());//如已经创建该对象,无需再次创建!
//...
writer.println("-files");
writer.flush();
//...
			

注意:在本页内所有的示例代码中,kiftd进程相关的PrintWriter对象均为同一个。

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原进程并重新开启它以令新配置生效。