Solo  当前访客:4 登录 注册

喧哗博客-http://blog.xuahua.com

繁华过后的沉寂--技术经验分享
浏览次数: 94,390    文章总数: 91    评论总数: 3
存档:
2016 年 03 月 (23)

java提高篇-导出execl(具体使用篇) 有更新!

现在这篇文章,讲的是如何使用前一篇文章导出通用工具类

具体如下:

ackage com.xuahua.utils.export;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jxl.CellView;
import jxl.write.Label;
import jxl.write.Number;

import com.xuahua.pojo.TMemCashTradeRecordVo;
import com.xuahua.utils.ExportExcelUtils;

public class TradeExportUtils extends ExportExcelUtils {
	
	@Override
	public List<Map<String, Object>> getHeaders() {
		List<Map<String, Object>> headers = new ArrayList<Map<String, Object>>();

		Map<String, Object> header = new HashMap<String, Object>();
		header.put("value", "序");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "用户名");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "交易号");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "交易前余额");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "交易金额");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "交易后余额");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "交易类型");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "收入支出");
		headers.add(header);
		
		header = new HashMap<String, Object>();
		header.put("value", "交易支出");
		headers.add(header);
		
		header = new HashMap<String, Object>();
		header.put("value", "订单号");
		headers.add(header);
		
		header = new HashMap<String, Object>();
		header.put("value", "摘要");
		headers.add(header);
		return headers;
	}

	@Override
	public void writeContent(List list) throws Exception{
		List<TMemCashTradeRecordVo> currencyCardList = list;
		CellView cellView = new CellView();  
	    cellView.setAutosize(true); //设置自动大小
		for (int i = 0; i < currencyCardList.size(); i++) {
			TMemCashTradeRecordVo vo = currencyCardList.get(i);

			number = new jxl.write.Number(0, rowIndex, (i + 1), cellFormat1);
			ws.addCell(number);
			
			label = new jxl.write.Label(1, rowIndex, vo.getUsername(),cellFormat1); // 用户名
			ws.addCell(label);

			label = new jxl.write.Label(2, rowIndex, vo.getTradeno(),cellFormat1); // 交易流水号
			ws.addCell(label);
			
			number = new Number(3, rowIndex, vo.getAccountcashmoney().add(vo.getAccountfrzoenmoney()).doubleValue(),cellFormat1); // 交易前金额
			ws.addCell(number);
			
			number = new Number(4, rowIndex, vo.getTradetotalmoney().doubleValue(),cellFormat1); // 交易金额
			ws.addCell(number);
			
			number = new Number(5, rowIndex, vo.getCashmoney().add(vo.getFrzoenmoney()).doubleValue(),cellFormat1); // 交易后金额
			ws.addCell(number);
			
			label = new jxl.write.Label(6, rowIndex,vo.getTradetype(), cellFormat1); // 交易类型
			ws.addCell(label);
			
			label = new jxl.write.Label(7, rowIndex,vo.getInorout(), cellFormat1); // 收入支出类型
			ws.addCell(label);

			label = new Label(8, rowIndex, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(vo.getCreatetime()),cellFormat1);
			ws.addCell(label);
			
			label = new Label(9, rowIndex, vo.getGeneralno(),cellFormat1); // 订单号
			ws.addCell(label);

			label = new Label(10, rowIndex, vo.getRemark(),cellFormat1); // 备注
			
			ws.setColumnView(i, cellView);
			ws.addCell(label);

			rowIndex++;
		}

	}
	
}

看了上面的代码以后,怎么样?会使用了么?

java提高篇-导出execl(通用工具类) 有更新!

在web开发中,经常会遇到需要把数据导出到EXCEL中,并提供下载。

那么本文将提供一个通用的导出EXCEL的工具类。。。具体的实现或自定义的样式,可以自己定义。

请看下文代码

package com.xuahua.utils;

import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

import org.apache.log4j.Logger;

/**
 * @author wyong 提供公用方法,来生成xls。 具体的数据对象由writeContent实现,标签页的头由getHeaders实现。
 * 
 */
public class ExportExcelUtils {

	protected Label label;
	protected Number number;

	protected WritableWorkbook wwb;
	protected WritableSheet ws;
	protected int rowIndex = 0;
	protected int MAXRECORD = 60000;// 每个工作空间最大记录条数。

	protected WritableCellFormat titleFormat1;
	protected WritableCellFormat headerFormat1;
	protected WritableCellFormat cellFormat1;
	protected WritableCellFormat dateCellFormat;

	private static final Logger logger = Logger
			.getLogger(ExportExcelUtils.class);

	public ExportExcelUtils() {
		try {
			headerFormat1 = initHeaderFormat();
			cellFormat1 = initCellFormat();
			dateCellFormat = initDateFormat();
			titleFormat1 = initTitleFormate();
		} catch (WriteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void xls(OutputStream os, String sheetName, List contentList)
			throws Exception {
		wwb = Workbook.createWorkbook(os);
		try {
			int maxsize = contentList.size();
			if (maxsize > MAXRECORD) {
				int s = maxsize % MAXRECORD == 0 ? maxsize / MAXRECORD
						: maxsize / MAXRECORD + 1;
				List tmpList = new ArrayList(MAXRECORD);
				for (int i = 0; i < s; i++) {
					rowIndex = 0;
					tmpList = contentList.subList(i * MAXRECORD, (i + 1)
							* MAXRECORD > maxsize ? maxsize : (i + 1)
							* MAXRECORD);
					ws = wwb.createSheet(sheetName + "-" + i, i);
					this.writeHeaders();
					this.writeContent(tmpList);
				}
			} else {
				ws = wwb.createSheet(sheetName, 0);
				this.writeHeaders();
				this.writeContent(contentList);
			}
		} finally {
			wwb.write();
			wwb.close();

			os.flush();
			os.close();
		}
	}

	/**
	 * @param objlist
	 *            需要写入xls文件中的对象。做过处理的一个标签页最多60000条。
	 * @throws Exception
	 */
	public void writeContent(List objlist) throws Exception {
		throw new Exception("u` must implements this method.");
	};

	/**
	 * xls文件中的标题头。
	 * 
	 * @return
	 * @throws Exception
	 */
	public List<Map<String, Object>> getHeaders() throws Exception {
		throw new Exception("u` must implements this method.");
	};

	// 写表头
	public void writeHeaders() throws Exception {
		List<Map<String, Object>> headers = this.getHeaders();

		for (int i = 0; i < headers.size(); i++) {
			Map<String, Object> map = headers.get(i);

			Label label = new Label(i, rowIndex, map.get("value").toString(),
					headerFormat1);
			ws.addCell(label);

		}
		rowIndex++;
	}

	/**
	 * 格式化日期单元格
	 * 
	 * @return
	 * @throws WriteException
	 */
	protected WritableCellFormat initDateFormat() throws WriteException {
		jxl.write.DateFormat df = new jxl.write.DateFormat("yyyy-MM-dd HH:mm:ss");
		WritableCellFormat dateCellFormat = new jxl.write.WritableCellFormat(df);
		dateCellFormat.setAlignment(Alignment.LEFT);
		dateCellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
		dateCellFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
		dateCellFormat.setAlignment(Alignment.CENTRE); //设置水平对齐
		dateCellFormat.setWrap(false); //设置自动换行
		return dateCellFormat;
	}

	/**
	 * 格式化单元格样式
	 * 
	 * @return
	 * @throws WriteException
	 */
	protected WritableCellFormat initCellFormat() throws WriteException {
		WritableFont cellFont1 = new WritableFont(WritableFont.TIMES, 12);
		WritableCellFormat cellFormat1 = new WritableCellFormat(cellFont1);
		cellFormat1.setAlignment(Alignment.LEFT);
		cellFormat1.setVerticalAlignment(VerticalAlignment.CENTRE);
		cellFormat1.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
		cellFormat1.setAlignment(Alignment.CENTRE); //设置水平对齐
		cellFormat1.setWrap(false); //设置自动换行
		return cellFormat1;

	}

	/**
	 * @return 格式化headerformate
	 * @throws WriteException
	 */
	protected WritableCellFormat initHeaderFormat() throws WriteException {
		WritableFont headerFont1 = new WritableFont(WritableFont.TIMES, 14,
				WritableFont.BOLD);
		headerFont1.setColour(Colour.BLUE);
		WritableCellFormat headerFormat1 = new WritableCellFormat(headerFont1);
		headerFormat1.setAlignment(Alignment.CENTRE);
		headerFormat1.setVerticalAlignment(VerticalAlignment.CENTRE);
		headerFormat1.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
		headerFormat1.setBackground(Colour.YELLOW);
		headerFormat1.setAlignment(Alignment.CENTRE); //设置水平对齐
		headerFormat1.setWrap(false); //设置自动换行
		return headerFormat1;
	}

	/**
	 * 格式化initTitleFormate1
	 * 
	 * @return
	 * @throws WriteException
	 */
	protected WritableCellFormat initTitleFormate() throws WriteException {
		WritableFont titleFont1 = new WritableFont(WritableFont.TIMES, 24,
				WritableFont.BOLD);
		titleFont1.setColour(Colour.BLUE);
		WritableCellFormat titleFormat1 = new WritableCellFormat(titleFont1);
		titleFormat1.setAlignment(Alignment.CENTRE);
		titleFormat1.setVerticalAlignment(VerticalAlignment.CENTRE);
		titleFormat1.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
		titleFormat1.setBackground(Colour.YELLOW);
		titleFormat1.setAlignment(Alignment.CENTRE); //设置水平对齐
		titleFormat1.setWrap(false); //设置自动换行
		return titleFormat1;
	}
}

liunx提高篇-NODEJS 环境布署

 
1,nodejs安装
>解压缩 tar -xvf node-v4.2.4-liunx-x64.tar.gz
 设置全局:
 
1
2
ln -s /home/kun/mysofltware/node-v0.10.28-linux-x64/bin/node /usr/local/bin/node
ln -s /home/kun/mysofltware/node-v0.10.28-linux-x64/bin/npm /usr/local/bin/npm
 

(二)通过源码编译

    这种方式你下载的文件是Source code,我不太喜欢这种方式。。。主要是麻烦

 wget https://nodejs.org/dist/v4.2.4/node-v4.2.4-sunos-x64.tar.gz

1
2
3
4
5
6
7
8
9
10
11
#  tar xvf node-v0.10.28.tar.gz 
#  cd node-v0.10.28 
#  ./configure 
# make 
# make install 
# cp /usr/local/bin/node /usr/sbin/ 
 
查看当前安装的Node的版本 
# node -v 
 
v0.10.28

liunx基础篇- find 用法示例

转自http://www.cnblogs.com/wanqieddy/archive/2011/06/09/2076785.html

Linux中find常见用法示例

·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

find命令的参数;

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

#-print 将查找到的文件输出到标准输出
#-exec   command   {} \;      —–将查到的文件执行command操作,{} 和 \;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户
 
例:find . -name .svn | xargs rm -rf

====================================================

-name   filename             #查找名为filename的文件
-perm                        #按执行权限来查找
-user    username             #按文件属主来查找
-group groupname            #按组来查找
-mtime   -n +n                #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime    -n +n               #按文件访问时间来查GIN: 0px">

-ctime    -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前

-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                     #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2              找文件,-n指n天以内,+n指n天以前 
-ctime    -n +n               #按文件创建时间来查找文件,-n指n天以内,+n指n天以前 
-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                      #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2               #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]               #查长度为n块[或n字节]的文件
-depth                       #使查找在进入子目录前先行查找完本目录
-fstype                     #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]               #查长度为n块[或n字节]的文件
-depth                       #使查找在进入子目录前先行查找完本目录
-fstype                      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount                       #查文件时不跨越文件系统mount点
-follow                      #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                %;      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount                       #查文件时不跨越文件系统mount点
-follow                      #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                        #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune                       #忽略某个目录

=====================================================
$find   ~   -name   "*.txt"   -print    #在$HOME中查.txt文件并显示
$find   .    -name   "*.txt"   -print
$find   .    -name   "[A-Z]*"   -print   #查以大写字母开头的文件
$find   /etc   -name   "host*"   -print #查以host开头的文件
$find   .   -name   "[a-z][a-z][0–9][0–9].txt"    -print   #查以两个小写字母和两个数字开头的txt文件
$find .   -perm   755   -print
$find   .   -perm -007   -exec ls -l {} \;   #查所有用户都可读写执行的文件同-perm 777
$find   . -type d   -print
$find   .   !   -type   d   -print 
$find   .   -type l   -print

$find   .   -size   +1000000c   -print        #查长度大于1Mb的文件
$find   .   -size   100c         -print       # 查长度为100c的文件
$find   .   -size   +10   -print              #查长度超过期作废10块的文件(1块=512字节)

$cd /
$find   etc   home   apps    -depth   -print   | cpio   -ivcdC65536   -o   /dev/rmt0
$find   /etc -name "passwd*"   -exec grep   "cnscn"   {}   \;   #看是否存在cnscn用户
$find . -name "yao*"   | xargs file
$find   . -name "yao*"   |   xargs   echo    "" > /tmp/core.log
$find   . -name "yao*"   | xargs   chmod   o-w

======================================================

find   -name april*                     在当前目录下查找以april开始的文件
find   -name   april*   fprint file        在当前目录下查找以april开始的文件,并把结果输出到file中
find   -name ap* -o -name may*   查找以ap或may开头的文件
find   /mnt   -name tom.txt   -ftype vfat   在/mnt下查找名称为tom.txt且文件系统类型vfat的文件
find   /mnt   -name t.txt ! -ftype vfat   在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
find   /tmp   -name wa* -type l            在/tmp下查找名为wa开头且类型为符号链接的文件
find   /home   -mtime   -2                 在/home下查最近两天内改动过的文件
find /home    -atime -1                  查1天之内被存取过的文件
find /home -mmin    +60                  在/home下查60分钟前改动过的文件
find /home   -amin   +30                  查最近30分钟前被存取过的文件
find /home   -newer   tmp.txt             在/home下查更新时间比tmp.txt近的文件或目录
find /home   -anewer   tmp.txt            在/home下查存取时间比tmp.txt近的文件或目录
find   /home   -used   -2                  列出文件或目录被改动过之后,在2日内被存取过的文件或目录
find   /home   -user cnscn                列出/home目录内属于用户cnscn的文件或目录
find   /home   -uid   +501                  列出/home目录内用户的识别码大于501的文件或目录
find   /home   -group   cnscn              列出/home内组为cnscn的文件或目录
find   /home   -gid 501                   列出/home内组id为501的文件或目录
find   /home   -nouser                    列出/home内不属于本地用户的文件或目录
find   /home   -nogroup                   列出/home内不属于本地组的文件或目录
find   /home    -name tmp.txt    -maxdepth   4   列出/home内的tmp.txt 查时深度最多为3层
find   /home   -name tmp.txt   -mindepth   3   从第2层开始查
find   /home   -empty                     查找大小为0的文件或空目录
find   /home   -size   +512k                查大于512k的文件
find   /home   -size   -512k               查小于512k的文件
find   /home   -links   +2                查硬连接数大于2的文件或目录
find   /home   -perm   0700                查权限为700的文件或目录
find   /tmp   -name tmp.txt   -exec cat {} \;
find   /tmp   -name   tmp.txt   -ok   rm {} \;

find    /   -amin    -10     # 查找在系统中最后10分钟访问的文件
find    /   -atime   -2        # 查找在系统中最后48小时访问的文件
find    /   -empty             # 查找在系统中为空的文件或者文件夹
find    /   -group   cat        # 查找在系统中属于 groupcat的文件
find    /   -mmin   -5         # 查找在系统中最后5分钟里修改过的文件
find    /   -mtime   -1       #查找在系统中最后24小时里修改过的文件
find    /   -nouser           #查找在系统中属于作废用户的文件
find    /   -user    fred     #查找在系统中属于FRED这个用户的文件

 
查当前目录下的所有普通文件
# find . -type f -exec ls -l {} \; 
-rw-r–r–    1 root      root         34928 2003-02-25   ./conf/httpd.conf 
-rw-r–r–    1 root      root         12959 2003-02-25   ./conf/magic 
-rw-r–r–    1 root      root          180 2003-02-25   ./conf.d/README 
查当前目录下的所有普通文件,并在- e x e c选项中使用ls -l命令将它们列出

=================================================
在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec   -ok   rm {} \;

=================================================
查询当天修改过的文件
[root@book class]# find   ./   -mtime   -1   -type f   -exec   ls -l   {} \;

=================================================
查询文件并询问是否要显示
[root@book class]# find   ./   -mtime   -1   -type f   -ok   ls -l   {} \;  
< ls … ./classDB.inc.php > ? y
-rw-r–r–    1 cnscn    cnscn       13709   1月 12 12:22 ./classDB.inc.php
[root@book class]# find   ./   -mtime   -1   -type f   -ok   ls -l   {} \;  
< ls … ./classDB.inc.php > ? n
[root@book class]#

=================================================
查询并交给awk去处理
[root@book class]# who   |   awk   ’{print $1"\t"$2}’
cnscn    pts/0

=================================================
awk—grep—sed

[root@book class]# df   -k |   awk ‘{print $1}’ |   grep   -v   ’none’ |   sed   s"/\/dev\///g"
文件系统
sda2
sda1
[root@book class]# df   -k |   awk ‘{print $1}’ |   grep   -v   ’none’
文件系统
/dev/sda2
/dev/sda1

 
 
1)在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名

A) find   /tmp   -name   "*.h"   | xargs   -n50   grep SYSCALL_VECTOR
B) grep   SYSCALL_VECTOR   /tmp/*.h | cut    -d’:'   -f1| uniq > filename
C) find   /tmp   -name "*.h"   -exec grep "SYSCALL_VECTOR"   {}   \; -print

2)find / -name filename -exec rm -rf {} \;
    find / -name filename -ok rm -rf {} \;

3)比如要查找磁盘中大于3M的文件:
find . -size +3000k -exec ls -ld {} ;

4)将find出来的东西拷到另一个地方
find *.c -exec cp ‘{}’ /tmp ‘;’

如果有特殊文件,可以用cpio,也可以用这样的语法:
find dir -name filename -print | cpio -pdv newdir

6)查找2004-11-30 16:36:37时更改过的文件
# A=`find ./ -name "*php"` |   ls -l –full-time $A 2>/dev/null | grep "2004-11-30 16:36:37"

Linux-allLinux | No Comments »

find 实例

四月 18th, 2006

  要在/usr/linux中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名,有以下几种方法实现
find /usr/linux -name "*.h" | xargs -n50 grep SYSCALL_VECTOR
grep SYSCALL_VECTOR /usr/linux/*.h | cut -d’:’ -f1 | uniq > filename
find /usr/linux -name "*.h" -exec grep "SYSCALL_VECTOR" {} \; -print

  我用find / -name filename| rm -rf,不成功,请问为什么不成功?
find / -name filename -exec rm -rf {} \;
find . -name filename |rm -rf试一下{} 表示你找出来的结果。
\; 则相当于“宪法”,没什么说头,就是这么规定的,在 -exec 后面需要一个表示该命令终结的的符号。可以在 man find 中找到答案。
要让rm识别find的结果,如下:
find / -name filename |xargs rm -rf
之所以find . -name filename |rm -rf不通过,是因为rm命令不接受从标准输入传过来的指令
查找含特定字符串的文件
例如查找当前目录下含有"the string you want find…"字符串的文件:
$find . -type f -exec grep “the string you want find…” {} ; -print

  从根目录开始查tmpfile,一旦查到马上删除
find / -name "tmpfile" -exec rm {} \;

  find 的perm问题
请问一下以下命令什么意思?关键是那个数字前的-,其他都还知道
find -name ".*" -perm -007
我知道
find -name ".*" -perm 755
这个是用来查找权限位为755的隐藏文件
噢,对了还有,我上边的命令都省略了find的pathname参数 find默认是查找当前工作目录的吗?
如果我用 -ok 替代 -exec, 那么还需要加上 {} \; 吗?
这个已经清楚,仍然需要,因为 -ok 只是 -exec 的提示模式,它只是多了一个确认操作的步骤,刚才没有读懂那几句E文的意思 呵呵 不好意思
-007是指查找所有用户都可读、写、执行的文件,要小心呀~~~
解释解释?
find -name ".*" -perm -007 和 find -name ".*" -perm 777 有区别吗?
-007是怎么来得呢?
不过有一个问题
我用 find . -perm -100 会列出当前目录 . , 这是为什么呢?

下面引用由explover在 2002/10/01 06:15am 发表的内容:
-007是指查找所有用户都可读、写、执行的文件,要小心呀~~~
-007是查找含其它用户(不同组,非属主)可读,写,执行的文件.并不一定要同组可读写,-是指最少权限为007.
下面引用由一颗小白菜在 2002/10/01 10:16am 发表的内容:
OK了, 呵呵
不过有一个问题
我用 find . -perm -100 会列出当前目录 . , 这是为什么呢?
这种方法不会准确的找出目录的. -100是指权限至少是属主可运行.
在unix系统下,你可以拥有对目录文件的执行权你才可以进入一个目录.这便是目录文件被列出的原因.
find . -perm -001 -print找到往往是目录文件.
我的意思当然不是使用这种方法来找目录,只不过不明白其中的 -100 意义了
那以此类推,是不是 -010是指权限至少是owner同组可执行的吗?也就是说其实这里的010和-是分开的,-表示一个至少的意思,而且010才是真正用来描述权限位的?
这样子就明白了 谢谢你噢

  将find出来的东西拷到另一个地方?
find *.c -exec cp ‘{}’ /tmp ‘;’
如果有特殊文件,可以用cpio,也可以用这样的语法:
find dir -name filename -print | cpio -pdv newdir

  找出磁盘中某个大小范围内的文件
比如要查找磁盘中大于3M的文件:
find . -size +3000k -exec ls -ld {} ;

  如何用find查找某一天更改的文件?
可以使用这一行命令来实现:
A=`find ~ -print` | ls -l –full-time $A 2>/dev/null | grep "Jun 27" | grep 1998

  使用find 命令查找某个时间段的shell怎么写。比如11点到12点的。thanks
创建一个脚本judgetime,内容如下:
ls -l $*|awk ‘{split($8,hour,":");if((hour[1]>23 || hour[1] < 1)&&hour[1]<24)print}’
到要查找的目录下,运行
find ./ -name "*" -exec judgetime {} \;
注意时间格式为24小时制。
thank you ,如果我要精确到分钟呢
touch -t 04241112 starttemp #精确到12分钟
touch -t 04241220 endtemp #截止到12点20
find [dir] -newer starttemp -a ! -newer endtemp -exec ls -l {} \;
newer?
那昨天12:10文件如何呢?
每天执行的时候,用当天的日期和时间戳替换一下不就行了吗?
我不知道他是不是把所有的11:00~12:00的都找出来,是不是只执行一次还是每天都执行?
这种情况俺猜想是自己的东西放在哪忘了,只记得当时是深夜了。
有道理!
不愧是斑竹!
不光知道怎么解决问题,还知道在什么情况下出现这类问题,佩服佩服!
问题又出现了。创建这个文件的时候。本来应该是时间的一栏现在写上了2002,而不是12:00.
等到12:00过了吧!

  删除指定日期的文件
find ./ -name 文件名 -exec rm -f {} \;
例:删除当前30天内没用过的文件,用如下命令:
find / -atime +30 -exec rm -f {} \;
我自己试着写了一小段SHELL,也用ll ,grep, rm 几个命令,用起来还差强人意。
对过滤出来的文件名列表中用了一个FOR语句,再执行rm 。现在我想把这段SHELL 扩展一下让它每天定时运行将 n 天前的文件删掉,有没有人能给我一些提示,谢谢!
还有个问题,对于前面那位朋友提到的"find / -atime +30 -exec rm -f {} \;
"方法,我很早就试过几次,不过好像都不太对,参数 -atime n 是查找n天前被访问过的文件,我不明白的是这里的时间参照点是什么,以及这个n天是怎么计算的。
问 题二、对于"ll |cut -f 1" 这个命令我是不是用错了,我只想取出 ll 中列出的文件名,但用cut -f 命令做不到 ,我只好换用 ll |cut -c 59- 这种方式得到我要的文件名,but it’s a pool idear !我也试过用awk ,好像也不对,看看大家可不可以给我一些小小的提醒,TKS SO MUCH
问题三、如何改变 I结点 的日期格式 我现在的系统显示的格式是:
-rw-r—– 1 msahz01 users 2253 2002年2月 2日 poheader.i
我想把这换成
-rw-rw-rw- 1 house users 2193 Apr 19 2001 hkdisp.p
如何才能做到这点?
awk 应该可以
ll | awk ‘{print $9}’
删除多少天之前的文件
find /yourpath -mtime +31 -exec rm {} \;
find /yourpath -mtime +366 -exec rm {} \;

find中, -ctime, -mtime及其-atime有何区别

请问 -ctime 和 -mtime 有什么关系 ?
如果父目录的 ctime 改变, 那它下面的文件的 ctime 就会自动都改了吗 ?
-ctime 和 -mtime ,-atime 这些信息是存在哪儿呢 ?

我用 -mtime -1 找到了新建或改的文件.
但怎样才能找到一天内 mv 来的文件呢( 它们的时间是原有的时间,早于一天 ) ?

用-newer选项啊。
你可以先touch一个你想要的时间的文件如下:
$ touch -t 08190800 test
$ ls -l test
-rw-r–r– 1 dba other 0 Aug 19 08:00 test
然后
$ find . -newer test -print
.
./.sh_history
$ ls -l .sh_history
-rw——- 1 dba other 154 Aug 20 17:39 .sh_history

用touch可以写出你想要的任何时间的文件,然后用-newer ,! -newer选项即可成功。

1.ctime含inode信息修改的时间.mtime只指文件内容建立或修改的时间.
2 不会.
3.这些信息应该是存在文件系统的超级块里.

我查了书 -ctime 是指 inode 的改变(或称文件的状态改变).
请问 inode 存了哪些信息 ?
做了些小测试,-mtime 改, -ctime 一定也改.
改文件名, -ctime 也会改.
谁能回答 i-node 存了哪些东西 ?

vi /usr/include/sys/inode.h

班主,我不能 access /usr/include/sys/inode.h .
摘书如下:
Directories contain directory entries. Each entry contains a file or subdirectory name and an index node reference number (i-node number). To increase speed and enhance use of disk space, the data in a file is stored at various locations in the computer’s memory. The i-node contains the addresses used to locate all the scattered blocks of data associated with a file. The i-node also records other information about the file including time of modification and access, access modes, number of links, file owner, and file type.
可我发现 -atime 改了, -ctime 还没改. why ?
( 我先 cat 一个 ASCII 文件,再用 -atime -1 有它用 -ctime -1 居然没有它.)
着岂不跟 inode 信息改变, ctime 就改矛盾吗?

我不同意你贴出来的那段文章,正如我提到的那样,atime,ctime,mtime是放到超级块里,在sco unix下是一种叫stat的结构.(stat_32),不同的系统文件系统可能不同.
sco 下inode的结构如下:

typedef struct inode
{
struct inode *i_forw; /* inode hash chain */
struct inode *i_back; /* ‘’ */
struct inode *av_forw; /* freelist chain */
struct inode *av_back; /* ‘’ */
int *i_fsptr; /* "typeless" pointer to fs dependent */
ino32_t i_number; /* i number, 1-to-1 with dev address */
ushort i_ftype; /* file type = IFDIR, IFREG, etc. */
short i_fstyp; /* File system type */
off_t i_size; /* size of file */
ushort i_uid; /* owner */
ushort i_gid; /* group of owner */
ushort i_flag;
ushort i_want; /* i_flag extension to avoid MP races */
ushort i_count; /* reference count */
short i_nlink; /* directory entries */
dev_t i_rdev; /* Raw device number */
#define i_namtype i_rdev /* i_ftype==IFNAM subtype */
dev_t i_dev; /* device where inode resides */
struct mount *i_mton;/* ptr to mount table entry that */
/* this directory is mounted on */
struct region *i_rp; /* ptr to shared region if any */
struct stdata *i_sp; /* ptr to associated stream */
struct iisem *isem; /* ptr to XENIX semaphores */
struct iisd *isd; /* ptr to XENIX shared data */
} i_un;
#define i_mnton i_un.i_mton /* i_ftype==IFDIR IMOUNT */
#define i_rptr i_un.i_rp /* i_ftype==IFREG || i_ftype==IFBLK */
#define i_sptr i_un.i_sp /* i_ftype==IFCHR || i_ftype==IFIFO */
#define i_sem i_un.isem /* i_ftype==IFNAM && i_namtype==IFSEM */
#define i_sd i_un.isd /* i_ftype==IFNAM && i_namtype==IFSHD */

struct fstypsw *i_fstypp; /* ptr to file system switch FSPTR */
long *i_filocks; /* pointer to filock (structure) list */
unsigned long i_mappages; /* number of pages currently cached */
unsigned long i_vcode; /* read-ahead block save (NFS) */
short i_wcnt; /* write open count or ITEXT count */
struct lockb i_cilock; /* tas to synchronize i_flag changes */
ushort i_rdlocks; /* count of non-exclusive lockers */
} inode_t;

所以,访问一个文件不能改变inode信息.
使用chown, chgrp, chmod命令可以很好的比较mtime和ctime
chown改变一个文件的属主,用ctime可以找到,用mtime便找不到.
试试看.

多谢斑竹! 我是在 Solaris 上面试的.我是对 -ctime 不明白.
试的结果如下:
修改文件,-mtime 改了, -ctime 也会改.
访问文件,-atime 改了, -ctime 没变.
chown, chgrp, chmod,mv, 都会使 -ctime 改变,但不影响 -atime 和 -mtime.
touch 可以改 -mtime and/or -atime,但 touch -a 只改访问时间时,-ctime也改了.
touch -m 改修改时间时,-ctime当然也改了.
好象还有别的很多东西可以令 -ctime 改变, 搞不清楚.
有什么方法可以显示 -mtime,atime,ctime 吗?
可以用 -ctime 来实现对目录的增量文件进行备份或 transfer 吗 ?
多谢!

没有什么工具显示,(可能是俺不知道)
把下面程序里的st_mtime换成st_ctime,或st_atime便可以得到你要的了.
#include
int
main (int argc, char **argv)
{
struct stat buf;
char date[80];
char fname[80];
printf("Enter filename (with full path) to check mtime : ");
scanf("%s",fname);
stat(fname, &buf);
printf ("mtime (in sec) of %s = %ld\n", fname, buf.st_mtime);
strcpy(date, ctime((time_t *)&(buf.st_mtime)));
printf ("mtime (in date) of %s = %s\n", fname, date);
}

至于文件备份,有什么不可以的么?

mtime ls -l 最近修改文件内容的时间
atime ls -lu 最近访问文件的时间
ctime ls -li 最近文件有所改变的状态 ,如文件修改,属性\属主 改变 ,节点 ,链接变化等 ,应该是不拘泥只是时间前后的改变

俺看了ls的帮助,以为只是按ctime或atime排序,显示的时间还是mtime.

仔细比较了一下,ayhan说的是对的.谢谢ayhan.

多谢 ahyan 提示 ! 我在 Solaris 上试过如下:
mtime 用 ls -l 看到
atime 用 ls -lu 看到
ctime 用 ls -lc 看到. (ls -li 只有 inode number)
摘书如下:
-c Uses time of last modification of the i-node (file
created, mode changed, and so forth) for sorting (-t)
or printing (-l or -n).
-u Uses time of last access instead of last modification
for sorting (with the -t option) or printing (with the
-l option).
-i For each file, prints the i-node number in the first
column of the report.

linux基础篇-sort 命令详解

转自 http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html

 

sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始!

1 sort的工作原理

 

sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

[rocrocket@rocrocket programming]$ cat seq.txt
banana
apple
pear
orange
[rocrocket@rocrocket programming]$ sort seq.txt
apple
banana
orange
pear

2 sort的-u选项

它的作用很简单,就是在输出行中去除重复行。

[rocrocket@rocrocket programming]$ cat seq.txt
banana
apple
pear
orange
pear
[rocrocket@rocrocket programming]$ sort seq.txt
apple
banana
orange
pear
pear
[rocrocket@rocrocket programming]$ sort -u seq.txt
apple
banana
orange
pear

pear由于重复被-u选项无情的删除了。

3 sort的-r选项

sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。

[rocrocket@rocrocket programming]$ cat number.txt
1
3
5
2
4
[rocrocket@rocrocket programming]$ sort number.txt
1
2
3
4
5
[rocrocket@rocrocket programming]$ sort -r number.txt
5
4
3
2
1

4 sort的-o选项

由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。

但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。

[rocrocket@rocrocket programming]$ sort -r number.txt > number.txt
[rocrocket@rocrocket programming]$ cat number.txt
[rocrocket@rocrocket programming]$
看,竟然将number清空了。

就在这个时候,-o选项出现了,它成功的解决了这个问题,让你放心的将结果写入原文件。这或许也是-o比重定向的唯一优势所在。

[rocrocket@rocrocket programming]$ cat number.txt
1
3
5
2
4
[rocrocket@rocrocket programming]$ sort -r number.txt -o number.txt
[rocrocket@rocrocket programming]$ cat number.txt
5
4
3
2
1

5 sort的-n选项

你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。

我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!

[rocrocket@rocrocket programming]$ cat number.txt
1
10
19
11
2
5
[rocrocket@rocrocket programming]$ sort number.txt
1
10
11
19
2
5
[rocrocket@rocrocket programming]$ sort -n number.txt
1
2
5
10
11
19

6 sort的-t选项和-k选项

如果有一个文件的内容是这样:

[rocrocket@rocrocket programming]$ cat facebook.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。

那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实现?

幸好,sort提供了-t选项,后面可以设定间隔符。(是不是想起了cut和paste的-d选项,共鸣~~)

指定了间隔符之后,就可以用-k来指定列数了。

[rocrocket@rocrocket programming]$ sort -n -k 2 -t : facebook.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3

我们使用冒号作为间隔符,并针对第二列来进行数值升序排序,结果很令人满意。

7 其他的sort常用选项

-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

-M会以月份来排序,比如JAN小于FEB等等

-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。

有时候学习脚本,你会发现sort命令后面跟了一堆类似-k1,2,或者-k1.2 -k3.4的东东,有些匪夷所思。今天,我们就来搞定它—-k选项!

1 准备素材

$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

 

第一个域是公司名称,第二个域是公司人数,第三个域是员工平均工资。(除了公司名称,其他的别信,都瞎写的^_^)

2 我想让这个文件按公司的字母顺序排序,也就是按第一个域进行排序:(这个facebook.txt文件有三个域)

$ sort -t ‘ ‘ -k 1 facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

看到了吧,就直接用-k 1设定就可以了。(其实此处并不严格,稍后你就会知道)

3 我想让facebook.txt按照公司人数排序

$ sort -n -t ‘ ‘ -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

不用解释,我相信你能懂。

但是,此处出现了问题,那就是baidu和sohu的公司人数相同,都是100人,这个时候怎么办呢?按照默认规矩,是从第一个域开始进行升序排序,因此baidu排在了sohu前面。

4  我想让facebook.txt按照公司人数排序 ,人数相同的按照员工平均工资升序排序:

$ sort -n -t ‘ ‘ -k 2 -k 3 facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

看,我们加了一个-k2 -k3就解决了问题。对滴,sort支持这种设定,就是说设定域排序的优先级,先以第2个域进行排序,如果相同,再以第3个域进行排序。(如果你愿意,可以一直这么写下去,设定很多个排序优先级)

5 我想让facebook.txt按照员工工资降序排序,如果员工人数相同的,则按照公司人数升序排序:(这个有点难度喽)

$ sort -n -t ‘ ‘ -k 3r -k 2 facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

此处有使用了一些小技巧,你仔细看看,在-k 3后面偷偷加上了一个小写字母r。你想想,再结合我们上一篇文章,能得到答案么?揭晓:r和-r选项的作用是一样的,就是表示逆序。因为sort默认是按照升序排序的,所以此处需要加上r表示第三个域(员工平均工资)是按照降序排序。此处你还可以加上n,就表示对这个域进行排序时,要按照数值大小进行排序,举个例子吧:

$ sort -t ‘ ‘ -k 3nr -k 2n facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

看,我们去掉了最前面的-n选项,而是将它加入到了每一个-k选项中了。

6 -k选项的具体语法格式

要继续往下深入的话,就不得不来点理论知识。你需要了解-k选项的语法格式,如下:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分。

先给你灌输一个思想,那就是“如果不设定End部分,那么就认为End被设定为行尾”。这个概念很重要的,但往往你不会重视它。

Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。

C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 2和-k 3就是省略了C.Start的例子喽。

FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。

同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。

7 突发奇想,从公司英文名称的第二个字母开始进行排序:

$ sort -t ‘ ‘ -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000

看,我们使用了-k 1.2,这就表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和 google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。guge只能屈居第四了。

8 又突发奇想,,只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:

$ sort -t ‘ ‘ -k 1.2,1.2 -k 3,3nr facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

由于只对第二个字母进行排序,所以我们使用了-k 1.2,1.2的表示方式,表示我们“只”对第二个字母进行排序。(如果你问“我使用-k 1.2怎么不行?”,当然不行,因为你省略了End部分,这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序)。对于员工工资进行排 序,我们也使用了-k 3,3,这是最准确的表述,表示我们“只”对本域进行排序,因为如果你省略了后面的3,就变成了我们“对第3个域开始到最后一个域位置的内容进行排序” 了。

9 在modifier部分还可以用到哪些选项?

可以用到b、d、f、i、n 或 r。

其中n和r你肯定已经很熟悉了。

b表示忽略本域的签到空白符号。

d表示对本域按照字典顺序排序(即,只考虑空白和字母)。

f表示对本域忽略大小写进行排序。

i表示忽略“不可打印字符”,只针对可打印字符进行排序。(有些ASCII就是不可打印字符,比如\a是报警,\b是退格,\n是换行,\r是回车等等)

10 思考思考关于-k和-u联合使用的例子:

$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

这是最原始的facebook.txt文件。

$ sort -n -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

$ sort -n -k 2 -u facebook.txt
guge 50 3000
baidu 100 5000
google 110 5000

当设定以公司员工域进行数值排序,然后加-u后,sohu一行就被删除了!原来-u只识别用-k设定的域,发现相同,就将后续相同的行都删除。

$ sort  -k 1 -u facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

$ sort  -k 1.1,1.1 -u facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500

这个例子也同理,开头字符是g的guge就没有幸免于难。

$ sort -n -k 2 -k 3 -u facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

咦!这里设置了两层排序优先级的情况下,使用-u就没有删除任何行。原来-u是会权衡所有-k选项,将都相同的才会删除,只要其中有一级不同都不会轻易删除的:)(不信,你可以自己加一行sina 100 4500试试看)

11 最诡异的排序:

$ sort -n -k 2.2,3.1 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

以第二个域的第二个字符开始到第三个域的第一个字符结束的部分进行排序。

第一行,会提取0 3,第二行提取00 5,第三行提取00 4,第四行提取10 5。

又因为sort认为0小于00小于000小于0000….

因此0 3肯定是在第一个。10 5肯定是在最后一个。但为什么00 5却在00 4前面呢?(你可以自己做实验思考一下。)

答案揭晓:原来“跨域的设定是个假象”,sort只会比较第二个域的第二个字符到第二个域的最后一个字符的部分,而不会把第三个域的开头字符纳入比较范围。当发现00和00相同时,sort就会自动比较第一个域去了。当然baidu在sohu前面了。用一个范例即可证实:

$ sort -n -k 2.2,3.1 -k 1,1r facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

12 有时候在sort命令后会看到+1 -2这些符号,这是什么东东?

关于这种语法,最新的sort是这么进行解释的:

On older systems, `sort’ supports an obsolete origin-zero syntax `+POS1 [-POS2]‘ for specifying sort keys.  POSIX 1003.1-2001 (*note Standards conformance::) does not allow this; use `-k’ instead.

原来,这种古老的表示方式已经被淘汰了,以后可以理直气壮的鄙视使用这种表示方法的脚本喽!

(为了防止古老脚本的存在,在这再说一下这种表示方法,加号表示Start部分,减号表示End部分。最最重要的一点是,这种方式方法是从0开始计数的,以前所说的第一个域,在此被表示为第0个域。以前的第2个字符,在此表示为第1个字符。明白?)

java基础篇--生成指定长度的随机字符串 有更新!

public static Random random = new Random();
	/**
	 * 生成len 位随机整数
	 *  包括数字字母
	  * @Title: getSexRandom
	  * @return int    
	  * @throws
	 */
	public static String getRandomStr(int len){
		StringBuilder ret = new StringBuilder();
		for (int i = 0; i < len; i++) {
			boolean isChar = (random.nextInt(2) % 2 == 0);// 输出字母还是数字
			if (isChar) { // 字符串
				int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; // 取得大写字母还是小写字母
				ret.append((char) (choice + random.nextInt(26)));
			} else { // 数字
				ret.append(Integer.toString(random.nextInt(10)));
			}
		}
		return ret.toString();
	}

java基础篇-模拟浏览器请求(post,get) 有更新!

public static String postRequest(String url, Map<String, String> data) {
		// 响应内容
		String result = "";

		// 定义http客户端对象--httpClient
		HttpClient httpClient = new HttpClient();

		// 定义并实例化客户端链接对象-postMethod
		PostMethod postMethod = new PostMethod(url);

		try {
			// 设置http的头
			postMethod.getParams().setParameter(
					HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
			postMethod.setRequestHeader("ContentType",
					"application/x-www-form-urlencoded;charset=UTF-8");
			if (data != null) {
				NameValuePair[] data1 = new NameValuePair[data.size()];
				int i = 0;
				for (String mapKey : data.keySet()) {
					// 填入各个表单域的值
					String vString = data.get(mapKey) == null ? "" : data.get(
							mapKey).toString();
					// vString = new String(vString.getBytes("utf-8"),"GBK");
					data1[i++] = new NameValuePair(mapKey, vString);
				}

				// 将表单的值放入postMethod中
				postMethod.setRequestBody(data1);
			}
			// 定义访问地址的链接状态
			int statusCode = 0;
			try {
				// 客户端请求url数据
				statusCode = httpClient.executeMethod(postMethod);
			} catch (Exception e) {
				e.printStackTrace();
			}

			// 请求成功状态-200
			if (statusCode == HttpStatus.SC_OK) {
				try {
					result = postMethod.getResponseBodyAsString();
				} catch (IOException e) {
					e.printStackTrace();
				}
			} else {
				System.out.println("请求返回状态:" + statusCode);
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			// 释放链接
			postMethod.releaseConnection();
			httpClient.getHttpConnectionManager().closeIdleConnections(0);
		}
		return result;
	}

	public static String postRequest(String url, String xmlstring,
			String contentType, String charset) {
		if (StringUtils.isBlank(charset)) {
			charset = "UTF-8";
		}
		if (StringUtils.isBlank(contentType)) {
			contentType = "text/html;charset=" + charset;
		}
		PostMethod post = new PostMethod(url);
		// 设置请求的内容直接从文件中读取
		HttpClient httpclient = new HttpClient();
		httpclient.getParams().setContentCharset("UTF-8");
		String resultstring = "";
		try {
			post.setRequestEntity(new StringRequestEntity(xmlstring,
					contentType, charset));
			int result = httpclient.executeMethod(post);
			resultstring = post.getResponseBodyAsString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		post.releaseConnection();
		return resultstring;
	}

	public static String postRequest(String url, Map<String, Object> data,
			Map<String, String> cookie, String domain) {
		// 响应内容
		String result = "";

		// 定义http客户端对象--httpClient
		HttpClient httpClient = new HttpClient();

		// 定义并实例化客户端链接对象-postMethod
		PostMethod postMethod = new PostMethod(url);

		try {
			// 设置http的头
			postMethod.getParams().setParameter(
					HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
			postMethod.setRequestHeader("ContentType",
					"application/x-www-form-urlencoded;charset=UTF-8");
			if (cookie != null) {
				if (domain == null) {
					domain = "";
				}
				HttpState initialState = new HttpState();
				for (String cookieName : cookie.keySet()) {
					Cookie c = new Cookie(domain, cookieName,
							cookie.get(cookieName), "/", -1, true);
					initialState.addCookie(c);
				}
				httpClient.setState(initialState);
			}
			if (data != null) {
				NameValuePair[] data1 = new NameValuePair[data.size()];
				int i = 0;
				for (String mapKey : data.keySet()) {
					// 填入各个表单域的值
					String vString = data.get(mapKey) == null ? "" : data.get(
							mapKey).toString();
					// vString = new String(vString.getBytes("utf-8"),"GBK");
					data1[i++] = new NameValuePair(mapKey, vString);
				}

				// 将表单的值放入postMethod中
				postMethod.setRequestBody(data1);
			}

			// 定义访问地址的链接状态
			int statusCode = 0;
			try {
				// 客户端请求url数据
				statusCode = httpClient.executeMethod(postMethod);
			} catch (Exception e) {
				e.printStackTrace();
			}

			// 请求成功状态-200
			if (statusCode == HttpStatus.SC_OK) {
				try {
					result = postMethod.getResponseBodyAsString();
				} catch (IOException e) {
					e.printStackTrace();
				}
			} else {
				System.out.println("请求返回状态:" + statusCode);
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			// 释放链接
			postMethod.releaseConnection();
			httpClient.getHttpConnectionManager().closeIdleConnections(0);
		}
		return result;
	}

java基础篇--模拟浏览器请求https--安全协议https请求 有更新!

https 协议,因为安全,所以在处理上,也有些不同。现在给出示例

 

/**
	 * @param url
	 * @param xmlstring
	 * @param match_id 密钥-- .p12的密钥
	 * @param file "apiclient_cert.p12" .p12的文件路径
	 * @return
	 */
	public static String httpsGetRequest(String url, String xmlstring, String match_id,String file){
		    KeyStore keyStore;
		    StringBuilder result = new StringBuilder();
			try {
				keyStore = KeyStore.getInstance("PKCS12");
				FileInputStream instream = new FileInputStream(new File(file));
	            keyStore.load(instream, match_id.toCharArray());

		        // Trust own CA and all self-signed certs
		        SSLContext sslcontext = SSLContexts.custom()
		                .loadKeyMaterial(keyStore, match_id.toCharArray())
		                .build();
		        // Allow TLSv1 protocol only
		        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
		                sslcontext,
		                new String[] { "TLSv1" },
		                null,
		                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
		        CloseableHttpClient httpclient = HttpClients.custom()
		                .setSSLSocketFactory(sslsf)
		                .build();
		        try {

	            HttpGet httpget = new HttpGet(url);
	            System.out.println("executing request" + httpget.getRequestLine());
	            CloseableHttpResponse response = httpclient.execute(httpget);
	            try {
	                HttpEntity entity = response.getEntity();
	                System.out.println("----------------------------------------");
	                System.out.println(response.getStatusLine());
	                if (entity != null) {
	                    System.out.println("Response content length: " + entity.getContentLength());
	                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
	                    String text="";
	                    while ((text = bufferedReader.readLine()) != null) {
	                    	result.append(text);
	                    }
	                }
	                EntityUtils.consume(entity);
	            } finally {
	                response.close();
	            }
	        } finally {
	            httpclient.close();
	        }
			} catch (Exception e) {
				e.printStackTrace();
			}
		return result.toString();
	}
	

spring4.x+json+中文乱码解决

基本配置:
1,在配置文件web.xml中设置统一设置过滤字符串
        <filter>
              <filter-name>encodingFilter</filter-name>
              <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
                  <init-param>
                   <param-name>encoding</param-name>
                   <param-value>utf-8</param-value>
                  </init-param>
         </filter>
 
         <filter-mapping>
              <filter-name>encodingFilter</filter-name>
              <url-pattern>/*</url-pattern>
         </filter-mapping>
2,在applicationContent.xml中配置返回json编码
        <bean id="multipartResolver"
  class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
 <bean
  class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
  <property name="messageConverters">
   <list>
    <bean
     class="org.springframework.http.converter.StringHttpMessageConverter">
     <property name="supportedMediaTypes">
      <list>
       <value>text/plain;charset=UTF-8</value>
       <value>text/html;charset=UTF-8</value>
      </list>
     </property>
    </bean>
    <bean
     class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
     <property name="supportedMediaTypes">
      <list>
       <value>text/plain;charset=UTF-8</value>
       <value>application/json;charset=UTF-8</value>
      </list>
     </property>
    </bean>
   </list>
  </property>
 </bean>
 
3,在response返回流中,设置响应头编码格式,统一为 UTF-8
       response.setHeader("Content-type", "text/html;charset=UTF-8");
       response.setCharacterEncoding("UTF-8");
4,在tomcat中配置文件中server.xml中<connector>节点,添加 URIEncoding="UTF-8"
 
 
第一种解决方案:
        在@RequestMapping(value="/index" ,produces = "text/html;charset=UTF-8")
 在使用public Map<String,Object) index(){} 这样的方法时,一定要写这样的注解才可以保持中文不乱码。

但是这种写法每个都需要硬编码 ,可以使用第二种方案。
 
第二种解决方案:
<!-- spring4.x json中文乱码处理,这一句一定要放在context:compent-scan前面 -->
 <mvc:annotation-driven>
  <mvc:message-converters>
   <bean class="org.springframework.http.converter.StringHttpMessageConverter">
    <property name="supportedMediaTypes">
     <list>
      <value>text/plain;charset=UTF-8</value>
      <value>text/html;charset=UTF-8</value>
     </list>
    </property>
   </bean>
  </mvc:message-converters>
 </mvc:annotation-driven>

Access-Control-Allow-Origin donot allow-----liunx服务器-tomcat跨域允许访问

上传文件,有时候需要跨二级域名访问,因为安全策略,需要做一些策略的调整。比如tomcat或者Nginx又或者代码。

1,tomcat 目录 conf/web.xml中,

最前面添加。
<filter>
        <filter-name>CorsFilter</filter-name>
        <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
        <init-param>
            <param-name>cors.allowed.methods</param-name>
            <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowed.headers</param-name>
            <param-value>Access-Control-Allow-Origin,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
        </init-param>
        <async-supported>true</async-supported>
    </filter>
    <filter-mapping>
        <filter-name>CorsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 
2,nginx 支持跨域访问
     2.1 在nginx.conf 
        http{
             add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
        }
    2.1 在子域名访问域名下
    
     location / {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' 'POST,GET';
                proxy_pass http://file.bdbvip.com;
                proxy_redirect     off;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
 
       }
3,代码头部申明

//response.setHeader("Access-Control-Allow-Origin", "blog.xuahua.com,cus.xuahua.com"); 仅允许指定的二级域名可以跨域
response.setHeader("Access-Control-Allow-Origin", "*"); //允许所有的
response.setHeader("Access-Control-Allow-Methods","POST"); //指定请求方法
response.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With,Content-Type,Accept");

liunx基础篇-文本对齐(vim技巧)

1,在vim文本编辑器中,

esc 退出编辑模式-->gg 快速定位至文本开头 --> 按下v键,进入虚拟编辑-->shift+g 全选文本 --> 按下 = ;文本对齐。

 

java基础篇-日期格式处理 有更新!

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 日期工具类,提供常用的静态方法
 * 
 * @author Administrator
 * 
 */
public class DateUtils extends org.apache.commons.lang.time.DateUtils {

	protected final static Log log = LogFactory.getLog(DateUtils.class);
	public final static String[] ChineseWeek = { "日", "一", "二", "三", "四", "五",
			"六" };

	/**
	 * yyyy-MM-dd HH:mm:ss
	 */
	public static final String YYYYMMDDHHMMSS = "yyyy-MM-dd HH:mm:ss";
	/**
	 * new SimpleDateFormat("yyyy-MM-dd");
	 * */
	public final static SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat(
			"yyyy-MM-dd");;
	/**
	 * new SimpleDateFormat("yyyy-MM-dd HH:mm");
	 * */
	public final static SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm");;
	/**
	 * new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	 * */
	public final static SimpleDateFormat simpleDateFormat3 = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");;
	/**
	 * new SimpleDateFormat("yyyyMMdd");
	 * */
	public final static SimpleDateFormat simpleDateFormat4 = new SimpleDateFormat(
			"yyyyMMdd");;
	/**
	 * new SimpleDateFormat("yyyyMMddHHmmss")
	 * */
	public final static SimpleDateFormat simpleDateFormat5 = new SimpleDateFormat(
			"yyyyMMddHHmmss");;

	/**
	 * new SimpleDateFormat("yyyyMMddHHmm")
	 * */
	public final static SimpleDateFormat simpleDateFormat6 = new SimpleDateFormat(
			"yyyyMMddHHmm");

	/**
	 * 将日期转换为字符串时间
	 * 
	 * @param date
	 *            //日期
	 * @param dateFormat
	 *            //格式
	 * @return
	 */
	public static String date2String(Date date, SimpleDateFormat dateFormat) {
		return dateFormat.format(date);
	}

	public static String date2String(Date date, String format) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.format(date);
	}

	public static Date string2Date(String source, SimpleDateFormat dateFormat) {
		try {
			return dateFormat.parse(source);
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}

		return null;
	}

	public static Date string2Date(String source, String format) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		try {
			return dateFormat.parse(source);
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}

		return null;
	}

	public static Date format(Date date, SimpleDateFormat dateFormat) {
		try {
			return dateFormat.parse(dateFormat.format(date));
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}

		return date;
	}

	public static Date format(Date date, String f) {
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(f);
			return dateFormat.parse(dateFormat.format(date));
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}

		return date;
	}

	public static boolean isSameMinute(Date d1, Date d2) {
		return simpleDateFormat2.format(d1)
				.equals(simpleDateFormat2.format(d2));
	}

	/**
	 * 英文操作系统下 强制得到中文yyyy-MM-dd 星期 以上午10点为分界
	 * */
	public static String getChineseYMDWeek(Date d) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		int hour = c.get(Calendar.HOUR_OF_DAY);
		if (hour < 10)
			c.add(Calendar.DAY_OF_MONTH, -1);
		return simpleDateFormat1.format(c.getTime()) + " 星期"
				+ ChineseWeek[c.get(Calendar.DAY_OF_WEEK) - 1];
	}

	/**
	 * 英文操作系统下 强制得到中文yyyy-MM-dd 星期 标准
	 * */
	public static String getChineseYMDWeek_(Date d) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		return simpleDateFormat1.format(c.getTime()) + " 星期"
				+ ChineseWeek[c.get(Calendar.DAY_OF_WEEK) - 1];
	}

	public static String dateadd(Date d, int field, int num, String format) {
		SimpleDateFormat dateFormat = null;
		if (format == null)
			dateFormat = simpleDateFormat1;
		else
			dateFormat = new SimpleDateFormat(format);
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		c.add(field, num);
		return dateFormat.format(c.getTime());
	}

	/**
	 * @author wyong
	 * @version 1.0
	 * @2011-5-17
	 * @description 计算二个时间相差天数 同一天算做 0 .
	 * @path 
	 * @param othertime
	 * @return int
	 */
	public static int deduction(long othertime) {
		long nowtime = System.currentTimeMillis();
		long d = Math.abs(nowtime - othertime);
		int day = (int) (d / 1000 / 60 / 60 / 24);
		return day;
	}

	/**
	 * 得到最近一个月的日期时间数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-06-06 12:10:10','2011-07-06 12:10:10']
	 */
	public static String[] getNearMonthDateTimeStr() {
		Calendar cal = Calendar.getInstance();
		String begin = simpleDateFormat3.format(cal.getTime());
		cal.add(Calendar.MONTH, -1);
		String end = simpleDateFormat3.format(cal.getTime());
		return new String[] { end, begin };
	}

	/**
	 * 得到最近一个月的日期数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-06-06','2011-07-06']
	 */
	public static String[] getNearMonthDateStr() {
		Calendar cal = Calendar.getInstance();
		String begin = simpleDateFormat1.format(cal.getTime());
		cal.add(Calendar.MONTH, -1);
		String end = simpleDateFormat1.format(cal.getTime());
		return new String[] { end, begin };
	}

	/**
	 * 得到最近一周的日期时间数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-06-29 09:33:12','2011-07-06 09:33:12']
	 */
	public static String[] getNearWeekDateTimeStr() {
		Calendar cal = Calendar.getInstance();
		String begin = simpleDateFormat3.format(cal.getTime());
		cal.add(Calendar.DAY_OF_WEEK_IN_MONTH, -1);
		String end = simpleDateFormat3.format(cal.getTime());
		return new String[] { end, begin };
	}

	/**
	 * 得到最近三天的日期时间数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-07-03 09:33:12','2011-07-06 09:33:12']
	 */
	public static String[] getNearThreeDayDateTimeStr() {
		Calendar cal = Calendar.getInstance();
		String begin = simpleDateFormat3.format(cal.getTime());
		cal.add(Calendar.DAY_OF_MONTH, -3);
		String end = simpleDateFormat3.format(cal.getTime());
		return new String[] { end, begin };
	}

	/**
	 * 得到今明后天
	 * 
	 * @param format
	 * @return
	 */
	public static String[] getThreeday(String format) {
		String[] theDate = new String[3];
		try {
			DateFormat dateFormat = new SimpleDateFormat(format);
			Date inputDate = new Date();
			Calendar cal = Calendar.getInstance();
			cal.setTime(inputDate);
			int inputDayOfYear = cal.get(Calendar.DAY_OF_YEAR);

			cal.set(Calendar.DAY_OF_YEAR, inputDayOfYear + 0);
			theDate[0] = dateFormat.format(cal.getTime());

			cal.set(Calendar.DAY_OF_YEAR, inputDayOfYear + 1);
			theDate[1] = dateFormat.format(cal.getTime());

			cal.set(Calendar.DAY_OF_YEAR, inputDayOfYear + 2);
			theDate[2] = dateFormat.format(cal.getTime());

		} catch (Exception e) {
		}
		return theDate;
	}

	public static void main(String[] args) {
		String[] a = DateUtils.getThreeday("yyyyMMdd");
		for (String s : a) {
			System.out.println(s);
		}

	}

	/**
	 * 得到今天的日期时间数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-07-03 00:00:00','2011-07-03 23:59:59']
	 */
	public static String[] getNearTodayDateTimeStr() {
		Calendar cal = Calendar.getInstance();
		String today = simpleDateFormat1.format(cal.getTime());
		return new String[] { today + " 00:00:00", today + " 23:59:59" };
	}

	/**
	 * 得到昨天的日期时间数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-07-03 00:00:00','2011-07-03 23:59:59']
	 */
	public static String[] getNearYesterdayDateTimeStr() {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DAY_OF_MONTH, -1);
		String today = simpleDateFormat1.format(cal.getTime());
		return new String[] { today + " 00:00:00", today + " 23:59:59" };
	}

	/**
	 * 取得该月的第一天
	 * 
	 * @param date
	 *            传入null时,默认取当前时间
	 * @return
	 * @author
	 */
	public static Date getCurrentMonthFirstDay(Date date) {
		Calendar cal = Calendar.getInstance();

		if (null != date) {
			cal.setTime(date);
		}
		cal.set(Calendar.DATE, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);

		return cal.getTime();
	}

	/**
	 * 取得下月的第一天
	 * 
	 * @param date
	 *            传入null时,默认取当前时间
	 * @return
	 * @author feng.li 2011-07-05
	 */
	public static Date getNextMonthFirstDay(Date date) {
		Calendar cal = Calendar.getInstance();

		if (null != date) {
			cal.setTime(date);
		}
		cal.set(Calendar.DATE, 1);
		cal.roll(Calendar.MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);

		return cal.getTime();
	}

	/**
	 * 取得在当天0时0分0秒的基础增加或减少N天的时间
	 * 
	 * @param add
	 *            增加或减少的偏移量
	 * @return
	 */
	public static Date getSetTime(int add) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);

		calendar.add(Calendar.DAY_OF_MONTH, add);

		return calendar.getTime();
	}

	public static Timestamp stringToTimestamp(String date) {
		Timestamp ts = null;
		try {
			DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			ts = new Timestamp(format.parse(date).getTime());
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}
		return ts;
	}

	/**
	 * Date转化为字符串
	 * 
	 * @param Date
	 *            日期
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getDateToStr(Date date) {
		if (date == null) {
			return null;
		} else {
			SimpleDateFormat sdf = new SimpleDateFormat(YYYYMMDDHHMMSS);
			return sdf.format(date);
		}
	}

	/**
	 * Date转化为字符串
	 * 
	 * @param Date
	 *            日期
	 * @param format
	 *            格式
	 * @return String
	 */
	public static String getDateToStr(Date date, String format) {
		if (date == null) {
			return null;
		} else {
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return sdf.format(date);
		}
	}
	
	/**String 转化date 验证
	 * <pre>
	 * @param date
	 *         时间
	 * @return
	 * </pre>
	 */
	public static boolean isDateMatch(String date) {
        String regex = "^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d$";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(date);
        return m.matches();
    }
	
}

java基础篇-字符串编码转化 有更新!

原文 http://blog.xuahua.com/articles/2016/03/09/1457510183958.html

	/**
	 * GBK格式转换成utf-8编码
	 * @param str
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static String gbToUtf8(String str)
			throws UnsupportedEncodingException {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < str.length(); i++) {
			String s = str.substring(i, i + 1);
			if (s.charAt(0) > 0x80) {
				byte[] bytes = s.getBytes("Unicode");
				String binaryStr = "";
				for (int j = 2; j < bytes.length; j += 2) {
					// the first byte
					String hexStr = getHexString(bytes[j + 1]);
					String binStr = getBinaryString(Integer.valueOf(hexStr, 16));
					binaryStr += binStr;
					// the second byte
					hexStr = getHexString(bytes[j]);
					binStr = getBinaryString(Integer.valueOf(hexStr, 16));
					binaryStr += binStr;
				}
				// convert unicode to utf-8
				String s1 = "1110" + binaryStr.substring(0, 4);
				String s2 = "10" + binaryStr.substring(4, 10);
				String s3 = "10" + binaryStr.substring(10, 16);
				byte[] bs = new byte[3];
				bs[0] = Integer.valueOf(s1, 2).byteValue();
				bs[1] = Integer.valueOf(s2, 2).byteValue();
				bs[2] = Integer.valueOf(s3, 2).byteValue();
				String ss = new String(bs, "UTF-8");
				sb.append(ss);
			} else {
				sb.append(s);
			}
		}
		return sb.toString();
	}

	private static String getHexString(byte b) {
		String hexStr = Integer.toHexString(b);
		int m = hexStr.length();
		if (m < 2) {
			hexStr = "0" + hexStr;
		} else {
			hexStr = hexStr.substring(m - 2);
		}
		return hexStr;
	}

	private static String getBinaryString(int i) {
		String binaryStr = Integer.toBinaryString(i);
		int length = binaryStr.length();
		for (int l = 0; l < 8 - length; l++) {
			binaryStr = "0" + binaryStr;
		}
		return binaryStr;
	}

	/**
	 * UTF-8格式的字符串,转换成GB2312
	 * 
	 * @param str
	 * @return
	 */
	public static String utf8Togb2312(String str) {
		String utf8 = "";
		String unicode = "";
		String gbk = "";
		try {
			utf8 = new String(str.getBytes("UTF-8"));
			// System.out.println(utf8);
			unicode = new String(utf8.getBytes(), "UTF-8");
			// System.out.println(unicode);
			gbk = new String(unicode.getBytes("GBK"));
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		return gbk;
	}

	/**
	 * 将 GB2312 编码格式的字符串转换为 UTF-8 格式的字符串:
	 * 
	 * @param str
	 * @return
	 */
	public static String gb2312ToUtf8(String str) {
		String urlEncode = "";
		try {
			urlEncode = URLEncoder.encode(str, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return urlEncode;
	}

tomcat7+自带的jdbc连接池 有更新!

原文 :/articles/2016/03/09/1457487972614.html

官方文档资料:https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

一,优点

Tomcat jdbc pool的优点:

(1)    tomcat jdbc pool 近乎兼容 dbcp ,性能更高

(2)    异步方式获取连接

(3)    tomcat jdbc pool 是 tomcat 的一个模块,基于 tomcat JULI,使用 Tomcat 的日志框架

(4)    使用 javax.sql.PooledConnection 接口获取连接

(5)    支持高并发应用环境

(6)    超简单,核心文件只有8个,比 c3p0 还

(7)    更好的空闲连接处理机制

(8)    支持 JMX

(9)    支持 XA Connection

Tomcat jdbc pool的使用仅需2个jar包,分别为tomcat-jdbc.jar和tomcat-juli.jar,这两个jar包都可以在tomcat7中找到,tomcat-jdbc.jar在tomcat的lib目录下,tomcat-juli.jar在bin目录下。

二,配置代码

<Resource name="jdbc/bdbvip" auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="100"
minIdle="10"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="user"
password="pwd"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.0.105:3306/abc?sendStringParametersAsUnicode=false"/>

 

java基础篇-字符串首字母大写 有更新!

1,需求

  字符串首字母大写

2,代码

 

public static String toUpFirstChar(String str) {
		if (StringUtils.isNotEmpty(str)) {
			return str.substring(0, 1).toUpperCase() + str.substring(1);
		}
		return null;
}

java基础篇-字符串隐藏2 有更新!

1,需求

   

* 名称格式化,名称隐藏 <s:property
* value="@com.ecp.common.helper.StringUtil@formatStr(name)"/>
*
* @param name
* @param myname
* 没有传null
* @return 若:中文名称 (name为空:*** name为一位:name+*** name为两位或者以下:张***
* name为两位以上:张***三 )
*
* 若:英文名称 (name为空:*** name为一位:name+***
* name为四位或者以下:长度减一+***+最后一位 name为四位以上:前四位+***+最后一位 )
*/

2,代码

public static String formatStr(String name, String myname) {

		if (StringUtils.isBlank(name)) {
			return "***";
		}
		if (name.equals(myname)) {
			return name;
		}
		if (name.length() < 2) {
			return name + "***";
		}
		String lastname  = name.substring(name.length()-1);
		String regEx = "[\u4e00-\u9fa5]";
		Matcher matcher = Pattern.compile(regEx).matcher(name);
		if (matcher.find())
			name = name.length() <= 2 ? name.substring(0, name.length() - 1)
					: name.substring(0, 2);
		else
			name = name.length() <= 4 ? name.substring(0, name.length() - 1)
					: name.substring(0, 4);
		return name + "***"+lastname;
	}

java基础篇-字符串隐藏1 有更新!

一,字符串隐藏替换

     1,需求

         长度为二位以下者,还回原串
         长度为二位以上到四位者,保留前前一位与最后一位中间以***替换
         长度为四位以上者到八位者,保留前二位与最最后二位,中间以***替换
         长度为八位以上者,保留以前三位与后三位,中间以***替换。

     2,适用场景

         针对用户名,姓名等敏感信息,做隐藏处理。

    3,代码实现 

   

/**
	 * 长度为二位以下者,还回原串
	 * 长度为二位以上到四位者,保留前前一位与最后一位中间以***替换
	 * 长度为四位以上者到八位者,保留前二位与最最后二位,中间以***替换
	 * 长度为八位以上者,保留以前三位与后三位,中间以***替换。
	 * @param number
	 * @return
	 */
	public static String formatNumber(String number){
		if(StringUtils.isBlank(number)) return "";
		if(number.length()<=2) return number;
		if(number.length()<=4) return number.substring(0,1)+"***"+number.substring(number.length()-1);
		if(number.length()<8) return number.substring(0,2)+"***"+number.substring(number.length()-2);
		return number.substring(0,3)+"***"+number.substring(number.length()-3);
	}

开源并且安全使用很多年的后台权限登录系统 有更新!

曾经的我们,也为企业使用后台的权限管理系统头疼了好久,后来发现有套源码叫acegi的spring自带开源的权限管理系统。

现在共享出来给大家使用。

源码下载地址为: http://www.xuahua.com/download/blog/t_Vcasmin.tar.gz

nginx在liunx中的编译,安装

一,nginx 安装布署
 
1,nginx下载
 
wget  http://nginx.org/download/nginx-1.9.9.tar.gz
先 安装pcre,libevent, OpenSSL
>yum install pcre*
>yum install libevent*
>yum install openssl*
 
解压nginx,进入目录。
>./configure   --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module   --with-pcre=pcre源目录
pcre 指向源文件目录,而不是编译后的目录

                        # --with-http_stub_status_module:这个模块用于获取nginx自上次启动以来的工作状态,非核心模块

                       # --with-http_ssl_module     :HTTPS 使用

                     

 

> make && make install

pcre-7.8-7.el6.x86_64
pcre-devel-7.8-7.el6.x86_64
pcre-static-7.8-7.el6.x86_64

代理配置

  proxy_redirect off ;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header REMOTE-HOST $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             client_max_body_size 50m;
             client_body_buffer_size 256k;
             proxy_connect_timeout 30;
             proxy_send_timeout 30;
             proxy_read_timeout 60;
             proxy_buffer_size 256k;
             proxy_buffers 4 256k;
             proxy_busy_buffers_size 256k;
             proxy_temp_file_write_size 256k;
             proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
             proxy_max_temp_file_size 128m;

 

        2.1 pcre 编译安装  安装pcre 让nginx支持rewrite 方便以后所需

 

        wget ftp://ftp.csx.cam.ac.uk//pub/software/programming/pcre/pcre-8.37.tar.gz
        tar zxvf pcre-8.37.tar.gz
        cd pcre-8.37/
       ./configure --prefix=/usr/local/pcre
编译完后可以执行make check进行测试(这一步非必须)
        make
  1. Skipping pcregrep UTF-8 tests: no UTF-8 support in PCRE library  
  2. Testing pcregrep newline settings  
  3. PASS: RunGrepTest  
  4. ==================  
  5. All 5 tests passed  
  6. ==================  
  7. make[2]: Leaving directory `/usr/local/pcre-8.32'  
  8. make[1]: Leaving directory `/usr/local/pcre
    加上对utf-8的支持可以在./configuration时加上参数: ./configure --enable-utf8  
make install
 
nginx -t -c /usr/local/nginx/conf/nginx.conf
 
    2.2 libevent 编译安装

        # wget http://www.monkey.org/~provos/libevent-2.0.12-stable.tar.gz
        # tar zxf libevent-2.0.12-stable.tar.gz 
        # cd libevent-2.0.12-stable
        #./configure  --prefix=/usr/local/lib
        # make && make install
     

使用ngrok将本地Web服务映射到外网-内网映射 有更新!

Step 1: Download ngrok

下载地址 https://ngrok.com/

Step 2: Unzip it

On Linux or OSX you can unzip ngrok from a terminal with the following command. On Windows, just double click ngrok.zip.

$ unzip /path/to/ngrok.zip

Step 3: Run it!

Read the Usage Guide for documentation on how to use ngrok. Try it out by running it from the command line:

$ ./ngrok -help
 
下面是我自己启动的服务
我再3000端口启动本地的服务:
可以看到 ngrok会产生一个Forwarding  http://6cdecc48.ngrok.com -> 127.0.0.1:3000
 
我们访问这个url,可以看到

公告

喧哗博客--繁华过后的沉寂--技术经验分享^-^
Copyright (c) 2009-2019, b3log.org & hacpai.com