Java:批量复制文件

问题

编写一个程序,将F:\\1目录下面的所有图片[.jpg结尾]复制到F:\\2下面.

有何不同

之前我自己也写过类似的代码,但这次不同的是,代码基本使用了JDK1.8和JDK1.7的API.实现起来逻辑和代码都比之前简单不少.

步骤还是类似:

  1. 遍历目录,取出文件名;
  2. 匹配后缀名是否一致;
  3. 进行复制操作.

java标志
image-2424

代码实现

PS:请使用JDK1.8及以上进行运行.


import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
* 编写一个程序,将F:\\1目录下面的所有图片[.jpg结尾]复制到F:\\2下面.
* 并将原来的文件扩展名从.jpg修改为.png
*

* 例如:
* 下面这样的复制.
* F:\1\1.jpg----F:\2\1.png
*
* @author puruidong
* @version 2016.2.25
*/
public class Main {

public static void main(String[] args) {
final Path path = Paths.get("F:\\1");//第一个路径,源文件路径
final Path path1 = Paths.get("F:\\2");//第二个,需要复制到的路径
if (!Files.isExecutable(path1)) {
System.out.println("需要复制到的文件夹不存在,已自动创建文件夹!");
try {
Files.createDirectory(path1);
} catch (IOException e) {
e.printStackTrace();
}
}
try {

Files
.list(path) //取出path下面所有的文件.
.filter(file -> file.getFileName().toString().endsWith(".jpg"))// 对后缀进行过滤,
// 这里的file.getFileName()返回的是Path对象,必须转换为String之后才能比较
.forEach(x -> { //循环进行处理,在这里看到的数据都是已经过滤过的了.
Path filename = x.getFileName();//获得当前文件的名字.
String newfilename = filename.toString().replace(".jpg", ".png");//替换名字.
String filePath = path + "\\" + filename;//当前文件的绝对路径
String saveFilePath = path1 + "\\" + newfilename;//需要保存到的新路径(包含文件名)
Path tmp = Paths.get(filePath);//两个path对象.
Path saveTmp = Paths.get(saveFilePath);//两个path对象.
try {
Files.copy(tmp, saveTmp, StandardCopyOption.REPLACE_EXISTING);//进行复制操作.第三个参数告诉系统,如果已经存在就进行替换.
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("复制完成!");
}
}

Java:计算区间日期

问题

计算2016-02-22 到 2017-02-22 的每周星期三 具体是哪一天

java标志
image-2422

实现

需使用JDK1.8或以上.


import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
* 计算 2016-2-22 到 2017-2-22 的每周星期三 具体是哪一天
*
* @author puruidong
* @version 2016.2.22
*/
public class Main {
public static void main(String[] args) {
//他想计算 2016-2-22 到 2017-2-22 的每周星期三 具体是哪一天
LocalDate localDate = LocalDate.parse("2016-02-22");
LocalDate endDate = LocalDate.parse("2017-02-22");
List lists = new ArrayList<>();
while (localDate.isBefore(endDate)) {
if (localDate.getDayOfWeek().getValue() == 3)
lists.add(localDate);
localDate = localDate.plusDays(1);
}
System.out.println("所有周三的日期,共有"+lists.size()+"天,具体如下:");
lists.forEach(x -> System.out.println(x));
}
}

运行结果:

所有周三的日期,共有52天,具体如下:
2016-02-24
2016-03-02
2016-03-09
2016-03-16
2016-03-23
2016-03-30
2016-04-06
2016-04-13
2016-04-20
2016-04-27
2016-05-04
2016-05-11
2016-05-18
2016-05-25
2016-06-01
2016-06-08
2016-06-15
2016-06-22
2016-06-29
2016-07-06
2016-07-13
2016-07-20
2016-07-27
2016-08-03
2016-08-10
2016-08-17
2016-08-24
2016-08-31
2016-09-07
2016-09-14
2016-09-21
2016-09-28
2016-10-05
2016-10-12
2016-10-19
2016-10-26
2016-11-02
2016-11-09
2016-11-16
2016-11-23
2016-11-30
2016-12-07
2016-12-14
2016-12-21
2016-12-28
2017-01-04
2017-01-11
2017-01-18
2017-01-25
2017-02-01
2017-02-08
2017-02-15

Flask:在Centos上配置两个Flask项目

源于

一开始我是只有一个项目的,非常好配置,而且也简单。但是后来发现,又有一个新项目需要新增上去。结果配置搞了好几天,今天终于搞定。(在网上的提问

其实精髓很简单,配置两个类似的就行,端口,日志文件,项目路径分开就行。

在这里不谈如何安装环境,关于安装环境可以参考(地址)。

Python flask
image-2417

开始操作

这里使用:Nginx + Uwsgi + virtualenv 进行配置操作.

首先是要配置Nginx,那么安装好之后,Nginx一般是在/usr/local/nginx这个目录下面,配置文件则在/usr/local/nginx/conf下面,因为我们需要配置多个站点,因此需要新建/usr/local/nginx/conf/vhost目录,然后把相关文件放在这个目录下面即可.

首先看nginx.conf的文件[/usr/local/nginx/conf/nginx.conf]:
下面这个配置文件基本只是改动了几个地方,第一行需要注意,这是使用www用户进行操作.所以需要新建用户.另外就是
include /usr/local/nginx/conf/vhost/*.conf;很关键,这一行表示加载vhost目录下面所有conf结尾的文件(在Nginx上配置子站点就是这样操作的).

user www;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}

# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

# location / {
# root html;
# index index.html index.htm;
# }
#}
include /usr/local/nginx/conf/vhost/*.conf;
}

下面是子站点A的conf[目录:/usr/local/nginx/conf/vhost/A.conf]:


server {
listen 80;
server_name A;
#charset koi8-r;
access_log /var/www/venv/logs/access.log;
error_log /var/www/venv/logs/error.log;

location / {
include uwsgi_params; # 引入
uwsgi_pass 127.0.0.1:3031;# 监听端口,此处不同
uwsgi_param UWSGI_PYHOME /var/www/venv/A;# 项目根目录,此处不同
uwsgi_param UWSGI_CHDIR /var/www/venv;# venv虚拟根目录
uwsgi_param UWSGI_SCRIPT main:app; # 启动文件和Flask实例名称(通常都是app)
}
}

下面是子站点B的conf[目录:/usr/local/nginx/conf/vhost/B.conf]:


server {
listen 80;
server_name A;
#charset koi8-r;
access_log /var/www/venv/logs/access.log;
error_log /var/www/venv/logs/error.log;

location / {
include uwsgi_params; # 引入
uwsgi_pass 127.0.0.1:8081;# 监听端口,此处不同
uwsgi_param UWSGI_PYHOME /var/www/venv/B;# 项目根目录,此处不同
uwsgi_param UWSGI_CHDIR /var/www/venv;# venv虚拟根目录
uwsgi_param UWSGI_SCRIPT main:app; # 启动文件和Flask实例名称(通常都是app)
}
}

配置文件都搞定之后,新建/var/www/venv目录,使用mkdir /var/www/venv -p.之后virtualenv A 创建虚拟环境A,完成之后,virtualenv B创建虚拟环境B.都依次创建完之后,分别在项目根目录[就是A,B两个目录]里面新建一个main.py文件.

切换到A目录,使用cd A .

main.py[目录:/var/www/venv/A]:

#!/usr/bin/env python3
# coding=utf-8
# -*-coding:utf-8-*-

from flask import Flask

app = Flask(__name__)

@app.route('/')
def show():
return "A.............."

if __name__ == '__main__':
app.run()

之后需要创建一个xml配置文件,指出如何初始化A项目.
文件:app_config.xml[目录:/var/www/venv/A/]
下面的文件不能有空格,切记切记!!!

/var/www/venv/A main
app
127.0.0.1:3031
4


至此,A项目创建完成.

接着来B项目.切换到B目录,使用cd ../B

main.py[目录:/var/www/venv/B]:

#!/usr/bin/env python3
# coding=utf-8
# -*-coding:utf-8-*-

from flask import Flask

app = Flask(__name__)

@app.route('/')
def show():
return "B.............."

if __name__ == '__main__':
app.run()

之后需要创建一个xml配置文件,指出如何初始化B项目.
文件:app_config.xml[目录:/var/www/venv/B/]
下面的文件不能有空格,切记切记!!!

/var/www/venv/B main
app
127.0.0.1:8081
4


至此,B项目创建完成.

都搞定之后,可以写一个启动脚本.
如下[startserver.sh]:

#!/bin/bash
# Startup script for the nginx Web Server
# ?P.~J?wsgi
/usr/local/python3.4/bin/uwsgi -x /var/www/venv/A/app_config.xml -d /var/log/uwsgi/uwsgiA.log --pidfile /tmp/uwsgiA.pid
/usr/local/python3.4/bin/uwsgi -x /var/www/venv/B/app_config.xml -d /var/log/uwsgi/uwsgiB.log --pidfile /tmp/uwsgiB.pid
# 启动nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf


之后使用chmod +x startserver.sh 即可启动.

总结

一共使用了如下目录或文件:

Nginx

服务器配置文件:
/usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/vhost/A.conf
/usr/local/nginx/conf/vhost/B.conf

Flask

项目文件[项目中还有其它自动生成的文件,忽略不计]:
/var/www/venv/A/app_config.xml
/var/www/venv/A/main.py
/var/www/venv/B/main.py
/var/www/venv/B/app_config.xml

之后就是启动脚本了,可以放在你想放的地方,比如/pyscript/startserver.sh,到此,大功告成!

参考: