文件上传优化:
1.文件名称优化需要优化
服务端,在保存文件的名称如果名称固定,那么最终会导致服务器硬盘,只会保留一个文件,对上传的文件名称优化,
//文件名称定义规则:
System.currenTimeMillis(); + new Random().nextInt(1000000);
2.服务端接收文件的优化
服务器端,接受一个文件之后就关闭了,后面的其他客户端无法继续上传文件,使用循环进行改进,可以不段的接收不同客户端传输过来的文件
//使用循环
while(true){
Socket socket serverSocket.accept();
…
…
}
3.服务器端接收客户端文件的效率优化
服务器端在接收文件的时候,假如某个客户端给你传输一个大文件,此时就不能在接受其他用户文件,所以可以使用多线程技术优化接收效率
while(true){
Socket serverSocket = serverSocket.accept();
//使用多线程技术,提高程序的效率
//有一个客户端上传文件,我就开启一个线程,完成文件的上传
new Thread(new Runnable(){
//重写run方法,设置线程任务
@Override
public void run(){
//使用网络字节输入流对象
InputStream is = socket.getInputStream();
//指定一个目录
File file = new File("D:\\upload");
if(!file.exits()){
file.mkdirs();
}
//防止同名的文件被覆盖
String filename = ""+System.currenTimeMillis(); + new Random().nextInt(1000000)+".jpg";
//构建一个本地文件字节输出流对象
new FileOutputStream(file + filename;)
//一读一写文件的上传,最终把文件写入到服务器短的硬盘当中
……
}
}).start();
}
//服务器端不关闭
serSocket.close();
函数式接口
概念:
函数式接口在Java指的是:有且仅有一个抽象方法的接口就称为函数式接口.(默认方法,私有方法不管)
函数式接口,适用于函数式编程的,在Java当中的函数式编程体现在Lambda表达式,所以函数式接口就是用来服务Lambda表达式.
只有确保接口当中有且仅有一个抽象方法,Java中的Lambda才能顺利的进行推导.Lambda就是匿名内部类的缩写
备注:"语法糖",是指使用更加便利方便但是原理不变的代码语法.就比如遍历集合的时候使用for-each语法,其实地层使用的是迭代器,这便是"语法糖".
格式:
只有确保接口当中有且仅有一个抽象方法即可:
修饰符 interface IterfaceName{
//只能定义一个抽象方法
public abstract 返回值 方法名称(参数列表);
//还可以定义其他的非抽象方法
}
public interface FunctionInterfaceOne {
public abstract void show01();
public default void show02(){
//…
}
//void show03();//不是函数接口了 有且仅有一个抽象方法,才称为函数式接口
}
@FunctionalInterface注解
与@Override注解作用类似,Java8中专门为函数式接口引入一个新注解@FunctionalInterface,该注解主要定义在接口上,一旦接口使用该注解,</