人若无名,便可专心练剑

 Java 标签

FastDfs Java Client 的使用

  |   0 评论   |   5,440 浏览

1,获取配置 

String configFilePath = classPath + File.separator + "client.conf";
2,全局初始化配置
 ClientGlobal.init(configFilePath);  
3,获取一个跟踪节点实例
TrackerClient trackerClient = new TrackerClient();  
TrackerServer trackerServer = trackerClient.getConnection();
4,根据跟踪节点获取存储节点实例
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
说明:
如果需要获取所有存储节点:
String group_name = null;  
StorageServer[] storageServers = trackerClient.getStoreStorages(trackerServer, group_name);
5,上传文件
NameValuePair[] meta_list = new NameValuePair[1];  //添加文件属性
File file = new File("D:/mzl/工作资料/fastDFS/testFile/500fd9f9d72a6059496335a02b34349b033bba1d.jpg");  
FileInputStream fis = new FileInputStream(file);  
byte[] file_buff = null;  
if(fis != null){  
int len = fis.available();  
file_buff = new byte[len];  
fis.read(file_buff);  
}
String[] results = storageClient.upload_file(file_buff, "jpg", meta_list);
results 结果中包含有文件名所在组名,及文件保存路径名
格式:upload_file(字节流,拓展名,文件属性);
6,获取上传文件相关信息


storageClient.get_file_info(group_name, remote_filename)



具体代码已经托管Github, 传送门:https://github.com/c2y2/fastDFSDemo



[转]推荐!国外程序员整理的Java资源大全

  |   0 评论   |   4,450 浏览

构建

这里搜集了用来构建应用程序的工具。

  • Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建。Maven优于Apache Ant。后者采用了一种过程化的方式进行配置,所以维护起来相当困难。
  • Gradle:Gradle采用增量构建。Gradle通过Groovy编程而不是传统的XML声明进行配置。Gradle可以很好地配合Maven进行依赖管理,并且把Ant脚本当作头等公民。

字节码操作

编程操作Java字节码的函数库。

  • ASM:通用底层字节码操作及分析。
  • Javassist:尝试简化字节码编辑。
  • Byte Buddy:使用“流式API”进一步简化字节码生成。

代码分析

软件度量和质量评估工具。

  • Checkstyle:对编程规范和标准进行静态分析。
  • FindBugs:通过字节码静态分析找出潜在Bug。
  • PMD:对源代码中不良编程习惯进行分析。
  • SonarQube:通过插件集成其它分析组件,提供评估最终结果报告。

编译器

创建分析器、解释器和编译器的框架。

  • ANTLR:功能完备的自顶向下分析复杂框架。
  • JavaCC:相对ANTLR更具体,上手略为简单。支持语法语法超前预测(syntactic lookahead)。

持续集成

支持持续集成、测试和应用发布的工具。

  • Bamboo:Atlassian的持续集成(CI)解决方案,包含很多其它产品。
  • CircleCI:提供托管服务,可免费试用。
  • Codeship:提供托管服务,提供有限免费计划。
  • Go:ThoughtWork开源持续集成解决方案。
  • Jenkins:提供基于服务器的部署服务。
  • TeamCity:JetBrain持续集成方案,提供免费版。
  • Travis:提供托管服务,常用于开源项目。

数据库

简化数据库交互的工具、库。

  • Flyway:使用Java API轻松完成数据库迁移。
  • H2:小型SQL数据库,以内存操作著称。
  • JDBI:便捷的JDBC抽象。
  • jOOQ:基于SQL schema生成类型安全代码。
  • Presto:针对大数据的分布式SQL查询引擎。
  • Querydsl:针对Java的类型安全统一查询。

日期和时间

处理日期和时间的函数库。

  • Joda-Time:Java 8出现之前,它是日期、时间处理的标准函数库。
  • Time4J:Java高级日期、时间函数库。

依赖注入

帮助代码实现控制反转模式的函数库。

  • Dagger :编译期的注入框架,没有使用反射,主要用于Android开发。
  • Guice:轻量级注入框架,功能强大可与Dagger媲美。

开发库

从基础层次上改进开发流程。

  • AspectJ:面向切面编程扩展,与程序无缝连接。
  • Auto:源代码生成器集合。
  • DCEVM:通过修改JVM,在运行时可无限次重定义已加载的类。OpenJDK 7、8已提供支持,详情可查看这个分支(fork)
  • JRebel:商用软件,无需重新部署可即时重新加载代码及配置。
  • Lombok:代码生成器,旨在减少Java冗余代码。
  • RxJava:使用JVM中可观察序列,创建异步、基于事件应用程序的函数库。
  • Spring Loaded:另一个JVM类重载代理。
  • vert.x:JVM多语言事件驱动应用框架。

分布式应用

用来开发分布式、具有容错性应用程序的函数库和框架。

  • Akka:构建并发、分布式和具有容错功能的事件驱动应用程序所需的工具包和运行时。
  • Apache Storm:分布式实时计算系统。
  • Apache ZooKeeper:为大型分布式系统,使用分布式配置、同步和命名注册提供协调服务。
  • Hazelcast:分布式、高可扩展性内存网格。
  • Hystrix:为分布式系统提供延迟和容错处理。
  • JGroups:一组提供可靠消息传输的工具包,可用来创建集群。集群中的节点可互相发送消息。
  • Quasar:为JVM提供轻量级线程和Actor。

更多点击标题查看详细。。。。。。

from:http://javaweb.org/?p=1649


java unicode 转字符

  |   1 评论   |   2,565 浏览

当我们做一些手动测试时,目标网站给你返回一串unicode编码,很难目测出来具体意义,而网上搜工具又很麻烦

于是基于网上搜索然后总结了如下java方法:

public static String UnicodeToString(String str) {
        Pattern pattern = Pattern. compile("(\\\\u(\\p{XDigit}{4}))");  
        Matcher matcher = pattern.matcher(str);
        char ch;
        while (matcher.find()) {
            ch = ( char) Integer.parseInt(matcher.group(2), 16);
            str = str.replace(matcher.group(1), ch + "");  
        }
        return str;
 }
jar包源码:
package org.c2y2;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringEscapeUtils;

public class UnicodeToString {
	public static void main(String[] args) {
		String source = ""
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入你要转换的unicode编码");
		source = scanner.nextLine();
		while(true){
			if(!source.equals("exit")){
				System.out.println(UnicodeToStringMethod(source));
				System.out.println("请输入需要转换的unicode编码或输入:exit ");
				source = scanner.nextLine();
			}else{
				scanner.close();
				break;
			}
		}
		System.out.println(StringEscapeUtils.unescapeJavaScript(source));
	}
	
	public static String UnicodeToStringMethod(String str) {
        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");   
        Matcher matcher = pattern.matcher(str);
        char ch;
        while (matcher.find()) {
            ch = (char) Integer.parseInt(matcher.group(2), 16);
            str = str.replace(matcher.group(1), ch + "");   
        }
        return str;
    }
}

可执行jar包下载地址:UnicodeToString.jar

使用效果:


root@c2y2:~/Dropbox$ java -jar UnicodeToString.jar 
请输入你需要转换的unicode编码
?({"result":"0","status":"-2","message":"\u5b89\u5168\u9a8c\u8bc1\u4e0d\u901a\u8fc7\uff0c\u4e0d\u7b26\u5408\u53c2\u6570\u89c4\u8303"})
?({"result":"0","status":"-2","message":"安全验证不通过,不符合参数规范"})
请输入需要转换的unicode编码或者输入:exit 退出=======>


java 打包工具jar的使用

  |   0 评论   |   2,459 浏览

虽说工作以来一直都搞java开发,但对于java打包工具jar的使用却相对较少(平时大多使用ide解决),

因此觉得自己很有必要总结总结

root@c2y2:/home/exp# jar --help


非法选项:-
用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项包括:
    -c  创建新的归档文件
    -t  列出归档目录
    -x  解压缩已归档的指定(或所有)文件
    -u  更新现有的归档文件
    -v  在标准输出中生成详细输出
    -f  指定归档文件名
    -m  包含指定清单文件中的清单信息
    -e  为捆绑到可执行 jar 文件的独立应用程序
        指定应用程序入口点
    -0  仅存储;不使用任何 ZIP 压缩
    -M  不创建条目的清单文件
    -i  为指定的 jar 文件生成索引信息
    -C  更改为指定的目录并包含其中的文件
如果有任何目录文件,则对其进行递归处理。
清单文件名、归档文件名和入口点名的指定顺序
与 "m"、"f" 和 "e" 标志的指定顺序相同。

示例 1:将两个类文件归档到一个名为 classes.jar 的归档文件中:
       jar cvf classes.jar Foo.class Bar.class 
示例 2:使用现有的清单文件 "mymanifest" 并
           将 foo/ 目录中的所有文件归档到 "classes.jar" 中:
       jar cvfm classes.jar mymanifest -C foo/ .
具体使用实例:


ox01:jar 打成普通jar包的使用方法


root@c2y2:/media/work/javaExamples/java/HttpConnectTest$ jar -cvf c2y2.jar bin lib src
added manifest
adding: bin/(in = 0) (out= 0)(stored 0%)
adding: bin/META-INF/(in = 0) (out= 0)(stored 0%)
adding: bin/META-INF/MANIFEST.MF(in = 75) (out= 74)(deflated 1%)
adding: bin/META-INF/MANIFEST.MF~(in = 61) (out= 62)(deflated -1%)
adding: bin/org/(in = 0) (out= 0)(stored 0%)
adding: bin/org/c2y2/(in = 0) (out= 0)(stored 0%)
adding: bin/org/c2y2/test/(in = 0) (out= 0)(stored 0%)
adding: bin/org/c2y2/test/HttpConnectTestCase.class(in = 3507) (out= 1954)(deflated 44%)
adding: bin/org/c2y2/test/MultiThread.class(in = 1441) (out= 863)(deflated 40%)
adding: bin/org/c2y2/test/MultiThreadGetHash.class(in = 5789) (out= 3225)(deflated 44%)
adding: bin/org/c2y2/test/RegexGetString.class(in = 11207) (out= 2221)(deflated 80%)
adding: bin/org/c2y2/test/writeLog.class(in = 9335) (out= 4985)(deflated 46%)
adding: lib/(in = 0) (out= 0)(stored 0%)
adding: lib/json-lib-2.4-jdk15.jar(in = 159123) (out= 145395)(deflated 8%)
adding: src/(in = 0) (out= 0)(stored 0%)
adding: src/org/(in = 0) (out= 0)(stored 0%)
adding: src/org/c2y2/(in = 0) (out= 0)(stored 0%)
adding: src/org/c2y2/test/(in = 0) (out= 0)(stored 0%)
adding: src/org/c2y2/test/HttpConnectTestCase.java(in = 2517) (out= 947)(deflated 62%)
adding: src/org/c2y2/test/MultiThreadGetHash.java(in = 5177) (out= 1848)(deflated 64%)
adding: src/org/c2y2/test/RegexGetString.java(in = 10783) (out= 1766)(deflated 83%)
adding: src/org/c2y2/test/writeLog.java(in = 9241) (out= 2474)(deflated 73%)
ox02,可执行jar包的使用:


这个可能稍微麻烦点:

要很两部,第一步需要建立

manifest.mf 文件(对jar执行路径,及主函数等相关设置)

常见如:

Manifest-Version: 1.0
Main-Class: org.c2y2.test.writeLog
Class-Path: .

我们一般会在项目的主文件夹建立META-INF文件夹,并将manifest.mf文件放到下面

如:

exp@c2y2:/media/work/javaExamples/java/HttpConnectTest/bin$ ls
META-INF  org
exp@c2y2:/media/work/javaExamples/java/HttpConnectTest/bin$ ls META-INF/
MANIFEST.MF 
那么我们怎么打成可运行的jar包呢

:-),next -》

exp@kali:/media/work/javaExamples/java/HttpConnectTest/bin$ jar -cvfm writeLog.jar META-INF/MANIFEST.MF org/c2y2/test/writeLog.class 
added manifest
adding: org/c2y2/test/writeLog.class(in = 9335) (out= 4985)(deflated 46%)
exp@kali:/media/work/javaExamples/java/HttpConnectTest/bin$ java -jar writeLog.jar 
请输入用户名

其中有个值的注意的地方:参数 -cvfm 中fm的顺序不能改变,改变了就会报错(我这是这样,具体情况具体而言吧)


特别提示:这些都是建立在已编译的基础上的。

java 提取xx论坛种子哈希(多线程版本)

  |   0 评论   |   2,361 浏览

多线程提取hash


package org.c2y2.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MultiThreadGetHash {

	public static List<URL> taskList = Collections.synchronizedList(new ArrayList<URL>()) ;//需要执行的url
	public static List<String> resultList =Collections.synchronizedList(new ArrayList<String>());//执行后存错结果
	public static int maxThreads =  10;//线程数
	public static int finishCount = 0;//用于执行了的次数统计,主要用于查看所有线程是否执行完成
	
	public static void main(String[] args) {
		try {
			for (int i = 30; i < 50; i++) {
				String urlString = "http://xxx.xxx.xxx.xxx/htm_data/2/1404/1081";
				if(i<10){
					urlString +="00"+String.valueOf(i);
				}else if(i>=10 && i<100){
					urlString +="0"+String.valueOf(i);
				}else{
					urlString +=String.valueOf(i);
				}
				urlString+=".html";
				URL url = new URL(urlString);
				taskList.add(url);
			}
			int taskCount = taskList.size();
			System.out.println(taskCount+"任务数");
			System.out.println("开启线程");
			for(int i=0;i<maxThreads;i++){
				MultiThread multiThread = new MultiThread();
				Thread thread = new Thread(multiThread);
				thread.start();
			}
			System.out.println(taskCount+"=="+finishCount);
			while(taskCount!=finishCount){
				System.out.println("线程执行中。。。。。。。。。。。");
				Thread.sleep(2000);
			}
			
			File file = new File("/home/c2y2/fuckyou.txt");
			if(!file.exists()){
				file.createNewFile();
			}
			FileOutputStream fileOutputStream = new FileOutputStream(file);
			String result = "";
			for (String string : resultList) {
				result+=string+"\r\n";
			}
			fileOutputStream.write(result.getBytes());
			fileOutputStream.flush();
			fileOutputStream.close();
			System.out.println("结束========");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static synchronized void requestCount(){//同步
		finishCount++;
	}
	
	public static String regexGetString(URL url,String regex){
		//1419376984d84d9e5a056aec56f6a09af072709604
		Pattern pattern = Pattern.compile(regex);
		String returnString = null;
		HttpURLConnection  httpURLConnection = null;
		try {
			httpURLConnection = (HttpURLConnection) url.openConnection();
			httpURLConnection.connect();
			int responseCode = httpURLConnection.getResponseCode();
			if(responseCode == 200){
				System.out.println("成功");
				BufferedReader reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
				String temp;
			    while ((temp = reader.readLine()) != null) {
		        	 Matcher matcher = pattern.matcher(temp);
		 	        if(matcher.find()){
		 	        	returnString = matcher.group();
		 	        }
		       }
			    reader.close();
			}
	        httpURLConnection.disconnect();
		} catch (IOException e) {
			e.printStackTrace();
			if(httpURLConnection!=null){
				httpURLConnection.disconnect();
			}
		}finally{
			if(httpURLConnection!=null){
				httpURLConnection.disconnect();
			}
		}
		return returnString;
	}
}

class MultiThread implements Runnable{
	String regex = "[a-f0-9]{43}|[a-f0-9]{42}";//校验正则 public void run() {
		while(!MultiThreadGetHash.taskList.isEmpty()){
			URL url = MultiThreadGetHash.taskList.remove(0);
			System.out.println("当前请求url=="+url);
			String reponseString = MultiThreadGetHash.regexGetString(url,regex);
			if(reponseString!=null && !reponseString.equals("")){
				MultiThreadGetHash.resultList.add(reponseString);
			}
			MultiThreadGetHash.requestCount();
		}
	}
	
}


执行过程:



:-),这个运行起来很快的哈,收工睡觉

java 提取xx论坛种子哈希

  |   0 评论   |   2,336 浏览

后期需引入多线程,目前速度有点慢,不过可以用了,后面改进吧


package org.c2y2.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HttpConnectTestCase{
	public static void main(String[] args) {
		try {
			File file = new File("/home/c2y2/enjoy.txt");
			if(!file.exists()){
				file.createNewFile();
			}
			FileOutputStream fileOutputStream = new FileOutputStream(file);
			String hashCode = "";
			String regex = "[a-f0-9]{43}";
			for (int i = 0; i < 1000; i++) {
				String urlString = "http://xx.xx.xx.xx/htm_data/2/1404/1081";
				if(i<10){
					urlString +="00"+String.valueOf(i);
				}else if(i>=10 && i<100){
					urlString +="0"+String.valueOf(i);
				}else{
					urlString +=String.valueOf(i);
				}
				urlString+=".html";
				URL url = new URL(urlString);
				System.out.println(i);
				String reponseString = regexGetString(url,regex);
				if(reponseString!=null && !reponseString.equals("")){
					hashCode+=reponseString+"\r\n";
				}
			}
			fileOutputStream.write(hashCode.getBytes());
			fileOutputStream.flush();
			fileOutputStream.close();
			System.out.println("结束========");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	public static String regexGetString(URL url,String regex){
		//1419376984d84d9e5a056aec56f6a09af072709604
		Pattern pattern = Pattern.compile(regex);
		String returnString = null;
		HttpURLConnection  httpURLConnection = null;
		try {
			httpURLConnection = (HttpURLConnection) url.openConnection();
			httpURLConnection.connect();
			int responseCode = httpURLConnection.getResponseCode();
			if(responseCode == 200){
				System.out.println("成功");
				BufferedReader reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
				String temp;
			    while ((temp = reader.readLine()) != null) {
		        	 Matcher matcher = pattern.matcher(temp);
		 	        if(matcher.find()){
		 	        	returnString = matcher.group();
		 	        }
		       }
			    reader.close();
			}
	        httpURLConnection.disconnect();
		} catch (IOException e) {
			e.printStackTrace();
			if(httpURLConnection!=null){
				httpURLConnection.disconnect();
			}
		}finally{
			if(httpURLConnection!=null){
				httpURLConnection.disconnect();
			}
		}
		return returnString;
	}
}
运行截图(每次成功就代表你提取成功哦,并给你带来一个新的片片哈~~):


:-),我们来看看收集到的种子hash吧,^_^

:-),别看只是一串串的hash,用处可大哦,怎么使用呢请看:linux shell 让你批量上传种子到你云播空间

java web压力测试问题故障篇一

  |   0 评论   |   2,460 浏览

这几天一直配合同事进行压力测试,在其中也还是遇到了一些问题,并学习到了一些新的知识,感觉很有必要记录下。

环境:windows server2008 32bit  8G ,jre6,tomcat6.0.39
压力测试工具:loadrunner11
现象一:tomcat配置最大堆内存时,始终不能超过1608m(自己测试出来的,方法如小提示,将其配置到超过这个值时,发现tomcat无法正常启动

错误日志为:

2014-03-11 23:14:23 Commons Daemon procrun stdout initialized 
Error occurred during initialization of VM Could not reserve enough space for object heap
然后网上搜寻了哈相关的资料,这里面涉及到系统位数,jvm内存设置等方面的原因。

小提示:测试电脑的jvm能使用的最大堆内存的方法如:java -Xmx=2048M -version  如果能正常显示版本表明可以支持该大小的堆内存分配

堆内设置网上一般推荐:

-Xms JVM初始化堆大小(总内存 1/64)
-Xmx JVM最大推内存大小(总内存 1/4)
因此该测试服务器内存为8G,按照以上设置的化,那么我的tomcat -Xmx大小应该能设置为2048M,但是设置为2048时,tomcat是不能正常启动的,

具体原因我们可来看看下面这段知识


堆(Heap)和非堆(Non-heap)内存

按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。

堆内存分配

JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最 大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时, JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。


JVM内存限制(最大值)
首先JVM内存首先受限于实际的最大物理内存,假设物理内存无限 大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是 2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了

因此这下算是明白了,jvm的堆最大堆内存不仅仅受限于我们内存的大小,还跟我们操作系统,以及操作系统版本有直接关系的。


现象二:当压力达到一定程度时,程序出现莫名的空指针异常,tomcat自身日志同时显示:java.lang.OutOfMemoryError: unable to create new native thread

原因:


1,jvm创建的线程数达到了jvm能创建线程数的极限。
2,重新配置-Xmx大小,网上有说该值的大小与Jvm能创建的线程数成反比


解决方法:


1,减小-Xmx值的大小
2,减少单个线程栈的大小,在JVM启动中使用-Xss参数。目前JDK1.4中每个线程栈所大小是256K,1.5是1M.


相关知识点:

所有 32 位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 4 GB 的内存)。对于 Microsoft Windows 操作系统,应用程序可以访问 2 GB 的进程地址空间,称为用户模式虚拟地址空间。应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间。其余 2 GB 为操作系统保留(也称为内核模式地址空间)

相关链接:1,http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6316197

                     2,http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6747415

                     3,http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8031493

                     4,http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6316197

                    5,  https://blogs.oracle.com/ksrini/entry/hotspot_primordial_thread_jni_stack  有对-Xss配置的说明

                    6, http://docs.oracle.com/cd/E19957-01/817-2180-10/pt_chap5.html 官方jvm 栈内存,等内存配置说明。

                    7,http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit 官方jvm 栈内存,等内存配置说明。