kodexplorer客户端(包括安卓)下载,怎么搭建部署教程详解

统介绍
KODExplorer是一个公开源码的基于Web的在线文件管理、代码编辑器。它提供了类windows经典用户界面,一整套在线文件管理、文件预览、编辑、上传下载、在线解压缩、音乐播放功能。让你直接在浏览器端实现web开发、源码文件预览、网站部署的同时拥有与本地操作一样方便、快捷、安全的体验。
——设计理念——
传承经典,追求创新,为用户提供方便快捷、安全易用的在线云管理系统。
无论何时(when)、何地(where),拥有web只要你想(want)它就是你的管理利器(4W策略)。
——面向用户——
目前KODExplorer系统管理主要定位在个人云主机、中小企业云资源管理、网盘管理、中小型网站管理等。Web开发者&站长(老鸟):在线编辑、压缩备份、部署,经典windows界面操作,上手容易,远离了主机的SSH、ftp复杂枯燥的命令操作。
个人私有云(菜鸟):管理网盘资源,同样经典windows界面操作,可以就地浏览网盘音乐、视屏文件,上传下载快捷方便。

文件:n459.com/file/25127180-477619047

特色

像使用操作系统一样使用体验,右键操作,拖拽,快捷键……
完美取代FTP管理:可用于服务器文件管理,支持图片、音乐、视频预览,在线解压缩,文件夹拖拽上传……。
框中选择,拖拽移动,拖拽上传,在线编辑器,影音播放器,解压缩。全面ajax保证性能和体验!
各个功能直接无缝连接;以对话框形式存在,多任务管理等功能
完备的中文支持,各种情况下乱码解决;
超快的速度:全面采用Ajax+Json进行数据通信,毫秒级的响应速度;
全平台兼容性:Win Linux Mac (Apache、Nginx、IIS)
完备的中文支持,各种情况下乱码解决;
文件管理
文件选择:单选,鼠标框选,shift连选,ctrl随意选择,键盘上下左右、home、end选择。
文件操作:选择文件后,可以进行复制,剪切,删除,属性查看,压缩,重命名,打开预览等操作……
文件上传:多文件批量上传;html5拖拽上传(拖拽到窗口实现无缝上传)
右键功能:文件右键,文件夹右键,多选后右键操作,桌面右键,树目录右键操作,右键菜单绑定快捷键
(全选——复制——剪切——粘贴——删除——重命名,设置……)
文件浏览:列表模式,图标模式;双击进入子文件夹;地址栏操作;打开文件夹记录逆势操作记录(前进后退)
支持拖拽操作:选中后拖拽,实现剪切到指定文件夹功能
快捷键操作:delete删除,ctrl+A全选,ctrl+C复制,ctrl+X剪切,up/down/left/right/home/end选择文件
在线预览
支持几乎所有编程语言的在线编辑(高亮,多光标编辑.堪比本地的sublime)
文件预览:文本文件内容查看编辑保存;html,swf文件预览,
图片预览:自动生成缩略图,图片幻灯片播放;
音频播放:在线播放音乐,视频文件;支持mp3,wma,mid,aac,wav;mp4,
视频播放:在线视频文件播放,支持格式:flv,f4v,3gp
在线编辑
支持60多种代码(数据文件)高亮
支持多标签:同时编辑多份文件,拖动标签可以切换顺序;支持最大化模式
主题切换:选择你喜欢的编程风格
zendcodeing支持,从此爱上在线编程
查找、替换;撤销反撤销,维持历史记录
自动补全[],{},(),””,”;自动换行,自定义字体,代码折叠等诸多实用功能
系统预览
部分页面预览(更多请看演示地址)

在这里插入图片描述
以下内容无关:

-------------------------------------------分割线---------------------------------------------

为什么线程安全的List推荐使用CopyOnWriteArrayList,而不是Vector
注:本系列文章中用到的jdk版本均为java8

相比很多同学在刚接触Java集合的时候,线程安全的List用的一定是Vector。但是现在用到的线程安全的List一般都会用CopyOnWriteArrayList,很少有人再去用Vector了,至于为什么,文章中会具体说到。接下来,我们先来简单分析以下Vector的源码。

一、Vector集合源码简析
由于本文的重点不是Vector集合,因此只是简单的分析一下Vector的初始化方法和添加元素的方法。

Vector的底层实现和ArrayList一样,都是由数组实现的。

Vector的主要变量如下:

/**

  • 存放元素的数组
    /
    protected Object[] elementData;
    /
    *
  • 元素个数
    /
    protected int elementCount;
    /
    *
  • 扩容自增容量大小
    */
    protected int capacityIncrement;
    1.1 Vector初始化
    Vector的初始化提供了三个方法,除了可以指定初始容量的大小,还可以指定扩容容量的大小。构造器分别如下:

无参构造器

public Vector() {
this(10);
}
指定初始化容量的构造器

public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
指定初始化容量和扩容容量大小的构造器

public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
从上面的构造器中可以看出,如果调用无参构造器,则会创建一个初始化容量为10,扩容容量为0的Vector集合。

1.2 如何扩容
Vector的扩容机制和ArrayList的很像,如果不清楚ArrayList的扩容机制,可以看看这篇文章。这里我们直接看Vector的扩容方法grow。

private void grow(int minCapacity) {
// overflow-conscious code
// 初始化数组的长度,默认为10
int oldCapacity = elementData.length;
// 是否指定扩容容量,不指定扩容为原来的2倍
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
通过上面的方法,我们可以看出,如果指定了扩容容量的大小则扩容的新数组大小为原来的数组加上扩容容量的大小,如果不指定扩容容量的大小则扩容的新数组大小为原来数组大小的2倍。这样扩容为原来的2倍是很消耗空间的,这也是Vector被弃用的原因之一。

除此之外,看过源码的同学可能发现了,Vector集合的所有操作元素的方法都加了synchronized关键字,这就导致了操作Vector的效率会非常低,在开发中,往往读操作的使用频率会远高于其他操作,而CopyOnWriteArrayList就是这样一种读操作效率远高于写操作效率的List,一起来看看。

二、CopyOnWriteArrayList源码简析
CopyOnWriteArrayList类图:

2.1 CopyOnWrite思想
CopyOnWrite简称COW,根据名字来看就是写入时复制。意思就是大家共同去访问一个资源,如果有人想要去修改这个资源的时候,就需要复制一个副本,去修改这个副本,而对于其他人来说访问得资源还是原来的,不会发生变化。

2.2 初始化CopyOnWriteArrayList
CopyOnWriteArrayList 底层是也是有数组实现的。 本文我们只解读添加元素和读取元素的区别,删除修改元素原理和添加元素差不多,操作时都需要进行加锁,而读操作不会加锁。

CopyOnWriteArrayList主要有以下两个变量:

// 独占锁
final transient ReentrantLock lock = new ReentrantLock();

// 存放元素的数组
private transient volatile Object[] array;
我们仔细来分析一下上面两个属性,这两个思想是 CopyOnWriteArrayList 的核心 。

lock:ReentrantLock,独占锁,多线程运行的情况下,只有一个线程会获得这个锁,只有释放锁后其他线程才能获得。
array:存放数据的数组,关键是被volatile修饰了,被volatile修饰,就保证了可见性,也就是一个线程修改后,其他线程立即可见。
最常用的初始化方式如下:

/**

  • Creates an empty list.
    */
    public CopyOnWriteArrayList() {
    setArray(new Object[0]);
    }

/**

  • Sets the array.
    */
    final void setArray(Object[] a) {
    array = a;
    }
    初始化只是创建了一个空的数组,并将array指向它。

2.3 添加元素
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
// 获取原来的数组
Object[] elements = getArray();
// 原来数组的长度
int len = elements.length;
// 创建一个长度+1的新数组,并将原来数组的元素复制给新数组
Object[] newElements = Arrays.copyOf(elements, len + 1);
// 元素放在新数组末尾
newElements[len] = e;
// array指向新数组
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
添加数组的步骤如下:

获得独占锁,将添加功能加锁
获取原来的数组,并得到其长度
创建一个长度为原来数组长度+1的数组,并拷贝原来的元素给新数组
追加元素到新数组末尾
指向新数组
释放锁
这个过程是线程安全的,COW的核心思想就是每次修改的时候拷贝一个新的资源去修改,add()方法再拷贝新资源的时候将数组容量+1,这样虽然每次添加元素都会浪费一定的空间,但是数组的长度正好是元素的长度,也在一定程度上节省了扩容的开销。

2.4 获取元素
public E get(int index) {
return get(getArray(), index);
}

final Object[] getArray() {
return array;
}

private E get(Object[] a, int index) {
return (E) a[index];
}
读操作是天然安全的操作,而且数组本身会进行检查越界问题,因此获取元素的方法很简单,只是根据索引获取该元素。

public int size() {
return getArray().length;
}
由于CopyOnWriteArrayList的底层数组长度,本身就是元素大小,因此size()方法只要返回数组长度就可以了。

三、总结
Vector和CopyOnWriteArrayList都是线程安全的List,底层都是数组实现的,Vector的每个方法都进行了加锁,而CopyOnWriteArrayList的读操作是不加锁的,因此CopyOnWriteArrayList的读性能远高于Vector,Vector每次扩容的大小都是原来数组大小的2倍,而CopyOnWriteArrayList不需要扩容,通过COW思想就能使数组容量满足要求。两个集合都是先了RandomAccess接口,支持随机读取,因此更加推荐使用for循环进行遍历。在开发中,读操作会远远多于其他操作,因此使用CopyOnWriteArrayList集合效率更高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值