#
private Label doneLabel;
private Timer timer;
public class ATask extends TimerTask {
@Override
public void run() {
showScrollText(doneLabel);
}
}
/**
* 滚动显示字幕
*
* @param toDoLabel
*/
private void showScrollText(final Label toDoLabel) {
if (toDoLabel != null) {
if (toDoLabel.isDisposed()) {
timer.cancel();
return;
}
shell.getDisplay().asyncExec(new Runnable() {
// @Override
public void run() {
String txt = toDoLabel.getText();
if (txt != null && txt.length() > 50) {
txt = txt.substring(1, txt.length())
+ txt.substring(0, 1);
toDoLabel.setText(txt);
}
}
});
}
}
构造的时候
// 滚动显示字幕
timer = new Timer();
timer.schedule(new ATask(), 0, 500);
//
}
// @Override
public void dispose() {
timer.cancel();
super.dispose();
}
private Timer timer;
public class ATask extends TimerTask {
@Override
public void run() {
showScrollText(doneLabel);
}
}
/**
* 滚动显示字幕
*
* @param toDoLabel
*/
private void showScrollText(final Label toDoLabel) {
if (toDoLabel != null) {
if (toDoLabel.isDisposed()) {
timer.cancel();
return;
}
shell.getDisplay().asyncExec(new Runnable() {
// @Override
public void run() {
String txt = toDoLabel.getText();
if (txt != null && txt.length() > 50) {
txt = txt.substring(1, txt.length())
+ txt.substring(0, 1);
toDoLabel.setText(txt);
}
}
});
}
}
构造的时候
// 滚动显示字幕
timer = new Timer();
timer.schedule(new ATask(), 0, 500);
// @Override
public void dispose() {
timer.cancel();
super.dispose();
}
What the Job Post Says |
What it Really Means |
Standard work hours are 40-50 hours a week |
We expect developers to live in their tiny tiny cubes 24-7
我们希望程序员7*24小时工作在自己的小隔间里面
|
This is a support position |
We don’t allow our developers to have a life outside of work
我们不希望员工有工作之外的生活
|
You will work closely with the PM, DBA and QA |
Our environment is highly political, riddled with ridiculous rules
made by people who don’t understand software, and we get very little
done
我们的环境是高政治的,由很多不懂软件的人制定了很多荒谬的制度。我们还有很多没有达标。
|
This position involves working with our real-time application |
I don’t know what real-time means but it sounds good |
Great opportunity for growth |
Only a desperate person would deal with this shit
只有绝望的人才会做这种狗屎的工作。
|
Job candidate must be resourceful, responsible and able to work well
under pressure. |
Our corporate culture is basically the ‘Lord of the Flies
我们的管理方式就是“蚁王和工蚁”的方式。
|
http://blog.csdn.net/xiaxiaorui2003/archive/2009/07/29/4390401.aspx
我现在在编写一个JAVA工程,是提供给客户调用的API,但是我的API中大约需要依赖10个.JAR,
以前我都是使用ECLIPSE 的 EXPORT JAR file功能导出 JAR,这样的JAR可以使用,但是我的API种依赖的包客户还是需要导入,这样一共就需要导入11个包了,太麻烦了,现在就是想包括API和依赖的JAR打成一个JAR,这样子就方便多了,
现在找到了,使用ECLIPSE3.4的EXPORT Runnable JAR file功能导出的JAR就是包含了依赖的JAR,导入这一个JAR就可以了,具体操作如下,
1. 先找到你的工程中提供接口的类(要包含MAIN方法),
2. 在该类中右键选择 RUN as
3. 选择 Run configurations
4. 在main窗口中选择main class为本类
5. 点击RUN
6. 选择你的工程,右键选择 EXPORT
7. 在弹出的窗口中选择 runnable jar file
8. 在弹出的 runnable jar file export窗口中第一个launch configuration 中选择你刚才配置的类,
第二个窗口中选择你要导出的路径
9. 然后选择下一步就OK了
http://extjs2.javaeye.com/blog/394128
正则表达式在字符串处理中经常使用,关于正则简单的用法相信有一点程序基础的人都懂得一些,这里就不介绍简单基础了。这里主要讲解一下在JAVA中实现了的正则的高级用法-分组与捕获。
对于要重复单个字符,非常简单,直接在字符后卖弄加上限定符即可,例如 a+ 表示匹配1个或一个以上的a,a?表示匹配0个或1个a。这些限定符如下所示:
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
但是我们如果要对多个字符进行重复怎么办呢?此时我们就要用到分组,我们可以使用小括号"()"来指定要重复的子表达式,然后对这个子表达式进行重复,例如:(abc)? 表示0个或1个abc 这里一个括号的表达式就表示一个分组。
分组可以分为两种形式,捕获组和非捕获组。
捕获组
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 "A
3 (B(C))
4 (C)
组零始终代表整个表达式
之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。
Back 引用 是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列(是文本不是正则)。
例如 ([" ']).* "1
其中使用了分组,"1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,"abc" 或 " ' " 或 ' "
' ,但是请注意,它并不会对" a'或者 'a"匹配。原因上面已经说明,Back引用只是引用文本而不是表达式。
非捕获组
以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在Back 引用。
在Java中,支持的非捕获组,有如下几种:
(?=X) X,通过零宽度的正 lookahead
(?!X) X,通过零宽度的负 lookahead
(?<=X) X,通过零宽度的正 lookbehind
(?<!X) X,通过零宽度的负 lookbehind
这四个非捕获组用于匹配表达式X,但是不包含表达式的文本。
(?=X ) 零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,"w+(?="d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
(?!X) 零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,"w+(?!"d) 与后不跟数字的单词匹配,而不与该数字匹配。
(?<=X) 零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。
(?<!X) 零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配
举例:
上面都是理论性的介绍,这里就使用一些例子来说明一下问题:
1、测试匹配性 (?<!4)56(?=9) 这里的含义就是匹配后面的文本56前面不能是4,后面必须是9组成。因此,可以匹配如下文本 5569 ,与4569不匹配。
2 、提取字符串 提取 da12bka3434bdca4343bdca234bm 提取包含在字符a和b之间的数字,但是这个a之前的字符不能是c,b后面的字符必须是d才能提取。
例如这里就只有3434这个数字满足要求。那么我们怎么提取呢?
首先我们写出提取这个字符串的表达式: (?<!c)a("d+)bd 这里就只有一个捕获组("d+)
JAVA代码片段如下:
Pattern p = Pattern.compile("(?<!c)a(""d+)bd");
Matcher m = p.matcher("da12bca3434bdca4343bdca234bm");
while(m.find()){
System.out.println(m.group(1)); //我们只要捕获组1的数字即可。结果 3434
System.out.println(m.group(0)); // 0组是整个表达式,看这里,并没有提炼出(?<!c)的字符 。结果 a3434bd
}
可以看到,非捕获组,最后是不会返回结果的,因为它本身并不捕获文本。
正则表达式功能其实非常强大,这里只是对高级用法的简单探讨。有兴趣的朋友和本人共同讨论。
众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。
大 家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
自从jdk1.4推出java.util.regex包,就为我们提供了很好的JAVA正则表达式应用平台。
因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。
\\ 反斜杠
\t 间隔 ('\u0009')
\n 换行 ('\u000A')
\r 回车 ('\u000D')
\d 数字 等价于[0-9]
\D 非数字 等价于[^0-9]
\s 空白符号 [\t\n\x0B\f\r]
\S 非空白符号 [^\t\n\x0B\f\r]
\w 单独字符 [a-zA-Z_0-9]
\W 非单独字符 [^a-zA-Z_0-9]
\f 换页符
\e Escape
\b 一个单词的边界
\B 一个非单词的边界
\G 前一个匹配的结束
^为限制开头
^java 条件限制为以Java为开头字符
$为限制结尾
java$ 条件限制为以java为结尾字符
. 条件限制除\n以外任意一个单独字符
java.. 条件限制为java后除换行外任意两个字符
加入特定限制条件「[]」
[a-z] 条件限制在小写a to z范围中一个字符
[A-Z] 条件限制在大写A to Z范围中一个字符
[a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符
[0-9] 条件限制在小写0 to 9范围中一个字符
[0-9a-z] 条件限制在小写0 to 9或a to z范围中一个字符
[0-9[a-z]] 条件限制在小写0 to 9或a to z范围中一个字符(交集)
[]中加入^后加再次限制条件「[^]」
[^a-z] 条件限制在非小写a to z范围中一个字符
[^A-Z] 条件限制在非大写A to Z范围中一个字符
[^a-zA-Z] 条件限制在非小写a to z或大写A to Z范围中一个字符
[^0-9] 条件限制在非小写0 to 9范围中一个字符
[^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符
[^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集)
在限制条件为特定字符出现0次以上时,可以使用「*」
J* 0个以上J
.* 0个以上任意字符
J.*D J与D之间0个以上任意字符
在限制条件为特定字符出现1次以上时,可以使用「+」
J+ 1个以上J
.+ 1个以上任意字符
J.+D J与D之间1个以上任意字符
在限制条件为特定字符出现有0或1次以上时,可以使用「?」
JA? J或者JA出现
限制为连续出现指定次数字符「{a}」
J{2} JJ
J{3} JJJ
文字a个以上,并且「{a,}」
J{3,} JJJ,JJJJ,JJJJJ,???(3次以上J并存)
文字个以上,b个以下「{a,b}」
J{3,5} JJJ或JJJJ或JJJJJ
两者取一「|」
J|A J或A
Java|Hello Java或Hello
「()」中规定一个组合类型
比如,我查询<a href=\"index.html\">index</a>中<a href></a>间的数据,可写作<a.*href=\".*\">(.+?)</a>
在使用Pattern.compile函数时,可以加入控制正则表达式的匹配行为的参数:
Pattern Pattern.compile(String regex, int flag)
flag的取值范围如下:
Pattern.CANON_EQ 当且仅当两个字符的"正规分解(canonical decomposition)"都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式"a\u030A"会匹配"?"。默认情况下,不考虑"规 范相等性(canonical equivalence)"。
Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹 配,只要将UNICODE_CASE与这个标志合起来就行了。
Pattern.COMMENTS(?x) 在这种模式下,匹配时会忽略(正则表达式里的)空格字符(译者注:不是指表达式里的"\\s",而是指表达式里的空格,tab,回车之类)。注释从#开始,一直到这行结束。可以通过嵌入式的标志来启用Unix行模式。
Pattern.DOTALL(?s) 在这种模式下,表达式'.'可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式'.'不匹配行的结束符。
Pattern.MULTILINE
(?m) 在这种模式下,'^'和'$'分别匹配一行的开始和结束。此外,'^'仍然匹配字符串的开始,'$'也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。
Pattern.UNICODE_CASE
(?u) 在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配。默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集。
Pattern.UNIX_LINES(?d) 在这个模式下,只有'\n'才被认作一行的中止,并且与'.','^',以及'$'进行匹配。
抛开空泛的概念,下面写出几个简单的Java正则用例:
◆比如,在字符串包含验证时
//查找以Java开头,任意结尾的字符串
Pattern pattern = Pattern.compile("^Java.*");
Matcher matcher = pattern.matcher("Java不是人");
boolean b= matcher.matches();
//当条件满足时,将返回true,否则返回false
System.out.println(b);
◆以多条件分割字符串时
Pattern pattern = Pattern.compile("[, |]+");
String[] strs = pattern.split("Java Hello World Java,Hello,,World|Sun");
for (int i=0;i<strs.length;i++) {
System.out.println(strs[i]);
}
◆文字替换(首次出现字符)
Pattern pattern = Pattern.compile("正则表达式");
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World");
//替换第一个符合正则的数据
System.out.println(matcher.replaceFirst("Java"));
◆文字替换(全部)
Pattern pattern = Pattern.compile("正则表达式");
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World");
//替换第一个符合正则的数据
System.out.println(matcher.replaceAll("Java"));
◆文字替换(置换字符)
Pattern pattern = Pattern.compile("正则表达式");
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World ");
StringBuffer sbr = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sbr, "Java");
}
matcher.appendTail(sbr);
System.out.println(sbr.toString());
◆验证是否为邮箱地址
String str="ceponline@yahoo.com.cn";
Pattern pattern = Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());
◆去除html标记
Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);
Matcher matcher = pattern.matcher("<a href=\"index.html\">主页</a>");
String string = matcher.replaceAll("");
System.out.println(string);
◆查找html中对应条件字符串
Pattern pattern = Pattern.compile("href=\"(.+?)\"");
Matcher matcher = pattern.matcher("<a href=\"index.html\">主页</a>");
if(matcher.find())
System.out.println(matcher.group(1));
}
◆截取http://地址
//截取url
Pattern pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:]+");
Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){
buffer.append(matcher.group());
buffer.append("\r\n");
System.out.println(buffer.toString());
}
◆替换指定{}中文字
String str = "Java目前的发展史是由{0}年-{1}年";
String[][] object={new String[]{"\\{0\\}","1995"},new String[]{"\\{1\\}","2007"}};
System.out.println(replace(str,object));
public static String replace(final String sourceString,Object[] object) {
String temp=sourceString;
for(int i=0;i<object.length;i++){
String[] result=(String[])object[i];
Pattern pattern = Pattern.compile(result[0]);
Matcher matcher = pattern.matcher(temp);
temp=matcher.replaceAll(result[1]);
}
return temp;
}
◆以正则条件查询指定目录下文件
//用于缓存文件列表
private ArrayList files = new ArrayList();
//用于承载文件路径
private String _path;
//用于承载未合并的正则公式
private String _regexp;
class MyFileFilter implements FileFilter {
/**
* 匹配文件名称
*/
public boolean accept(File file) {
try {
Pattern pattern = Pattern.compile(_regexp);
Matcher match = pattern.matcher(file.getName());
return match.matches();
} catch (Exception e) {
return true;
}
}
}
/**
* 解析输入流
* @param inputs
*/
FilesAnalyze (String path,String regexp){
getFileName(path,regexp);
}
/**
* 分析文件名并加入files
* @param input
*/
private void getFileName(String path,String regexp) {
//目录
_path=path;
_regexp=regexp;
File directory = new File(_path);
File[] filesFile = directory.listFiles(new MyFileFilter());
if (filesFile == null) return;
for (int j = 0; j < filesFile.length; j++) {
files.add(filesFile[j]);
}
return;
}
/**
* 显示输出信息
* @param out
*/
public void print (PrintStream out) {
Iterator elements = files.iterator();
while (elements.hasNext()) {
File file=(File) elements.next();
out.println(file.getPath());
}
}
public static void output(String path,String regexp) {
FilesAnalyze fileGroup1 = new FilesAnalyze(path,regexp);
fileGroup1.print(System.out);
}
public static void main (String[] args) {
output("C:\\","[A-z|.]*");
}
Java正则的功用还有很多,事实上只要是字符处理,就没有正则做不到的事情存在。(当然,正则解释时较耗时间就是了|||……)
1byte
= 8 bit
|
一比特 bit
|
高4位
|
|
低四位
|
|
R
|
G
|
B
|
|
|
R
|
G
|
B
|
|
|
|
|
|
|
|
|
|
1.jhttp
2.javanetlib
在看源代码的时候,看到一个设计简单的线程池
package cs519.proxy.tpool;
import java.util.*;
/**
* Thread Pool Manager.
*
* Use a fixed number of threads and process requests.
*/
public class ThreadPool
{
/**
* @param nThread
* number of threads to create.
*/
public ThreadPool( int nThread ) {
for( int i=0; i<nThread; i++ )
new WorkerThread().start();
}
/** list of tasks waiting for execution */
private final List tasks = new LinkedList();
/** list of lower-priority tasks waiting for execution */
private final List backgroundTasks = new LinkedList();
/**
* Adds a new 'task' to the pool.
* Assigned task will be eventually processed by one of the threads
* in the pool.
*/
public synchronized void addTask( Runnable task ) {
tasks.add(task);
notify(); // notify any thread waiting for a task
}
/**
* Adds a new low-priority 'task' to the pool.
* Assigned task will be eventually processed by one of the threads
* in the pool.
*/
public synchronized void addBackgroundTask( Runnable task ) {
backgroundTasks.add(task);
}
/**
* Obtains a task from the queue.
*/
private synchronized Runnable getTask() {
while(true) {
if(!tasks.isEmpty())
return (Runnable)tasks.remove(0);
if(!backgroundTasks.isEmpty())
return (Runnable)backgroundTasks.remove(0);
try {
wait(); // wait for a new task
} catch( InterruptedException e ) {
System.err.println("thread interrupted");
throw new InternalError();
}
}
}
/** destructs the pool. */
public void dispose() {
suicideSignal = true;
}
private boolean suicideSignal = false;
private class WorkerThread extends Thread {
public void run() {
while(!suicideSignal)
getTask().run();
}
}
}
并且提供了缓存管理
package cs519.proxy.cache;
import java.io.*;
import java.util.*;
import java.text.ParseException;
import cs519.proxy.http.*;
public class CacheManagerImpl implements CacheManager
{
/**
* Set to non-null to see debug traces.
*/
private PrintStream debug = System.out;
/**
* The number of bytes in the cache.
* This field is accessed by the Janitor.
*/
long usedCacheSize = 0;
private Object usedCacheSizeLock = new Object();
/** Atomically modify the value of usedCacheSize. */
private void modifyUsedCacheSize( long offset ) {
synchronized(usedCacheSizeLock) {
usedCacheSize += offset;
}
}
private final long cacheLimit;
protected final TreeMap map=new TreeMap();
protected final TreeSet fileSet=new TreeSet();
/** The directory in which all cached objects are placed. */
private final File dir = new File("cache");
public final File getCacheDir() { return dir; }
private final CachePolicy policy;
/**
* Constructor:
* Load cache file information into CacheFileInfo objects.
* Include: filename, lastModified time, file length in byte.
* Add these objects to a TreeSet object, make them ordered
* by lastModified time.
* get current used cache size (in Bytes)
*/
public CacheManagerImpl(long limit, CachePolicy _policy) throws IOException
{
this.policy = _policy;
this.cacheLimit=limit; //in bytes
if(!dir.exists())
dir.mkdir();
String[] files=dir.list();
for(int i=0;i<files.length;i++)
{
//System.out.println(files[i].getName());
File f=new File(dir,files[i]);
CacheFileInfo cfi = new CacheFileInfo(f);
fileSet.add(cfi);
map.put( files[i], cfi );
modifyUsedCacheSize(cfi.fsize);
}
// launch the janitor
new Thread(new CacheJanitor(this)).start();
}
/**
* Put HttpResponse object into proxy cache.
* Write HttpResponse to a cache file if it is "toBeCached":
* 1. use request URL as a base of filename
* 2. the structure of the cache file contains two parts
* a. Request URL (String)
* b. HttpResponse object
*/
public void put( HttpRequest request, HttpResponse response ) {
long reservedSize;
try {
// if(debug!=null)
// debug.println("trying to store:"+request.getPath());
if(policy.toBeCached(request,response))
{
reservedSize = response.getBodySize()+2000;
// TODO: check if this object fits into the memory
// if(...)
// return;
// allocate the space before we actually use it
modifyUsedCacheSize(reservedSize);
// allocate physical space if it's necessary
if(!compactCache()) {
if(debug!=null)
debug.println("cache compacting failure:"+request.getPath());
// we can't store this object.
// cancel this reservation
modifyUsedCacheSize(-reservedSize);
return;
}
// if(debug!=null)
// debug.println("storing "+request.getPath());
File f = getCacheFileName(request);
ObjectOutputStream fileOut=new ObjectOutputStream(
new FileOutputStream(f));
fileOut.writeObject(request.getPath());
try {
fileOut.writeObject(response.getHeaderAsDate("Expires"));
} catch( java.text.ParseException e ) {
fileOut.writeObject(null); // write a dummy
}
fileOut.writeObject(response);
fileOut.close();
long actualSize = f.length();
synchronized(fileSet) { // use one lock for both objects
CacheFileInfo cfi = new CacheFileInfo(f);
fileSet.add( cfi );
map.put( cfi.fname, cfi );
}
modifyUsedCacheSize(actualSize-reservedSize);
if(debug!=null)
debug.println("stored :"+request.getPath());
}
} catch( IOException e ) {
// TODO: possibly return the reservedSize.
reservedSize=-0;
modifyUsedCacheSize(reservedSize);
e.printStackTrace();
// TODO: remove any corrupted file
}
}
/**
* Get requested object from proxy cache.
* if (URL in file)==(request URL), and object not expired, then
* return object to callee. else return null
*/
public HttpResponse get( HttpRequest request )
{
try {
File f = getCacheFileName(request);
if(f.exists()) {
ObjectInputStream oi=new ObjectInputStream(
new FileInputStream(f));
String fURL=(String)oi.readObject();
if(fURL.equals(request.getPath())) {
Date now = new Date();
// we won't use it, but we need to read this object
// to get to the body
Date expires = (Date)oi.readObject();
// parse the body
HttpResponse resp=(HttpResponse)oi.readObject();
oi.close();
if(debug!=null)
debug.println("hit :"+request.getPath());
//check if the object expired
try {
Date d = resp.getHeaderAsDate("Expires");
if(d==null || d.after(now)) {
// not expired. use this object.
// touch this file for LRU purpose, and
// modify fileSet and map content
Util.setLastModified(f,now.getTime());
// maintain the control data structure
synchronized(fileSet) {
//remove this object first
fileSet.remove(map.get(f.getName()));
map.remove(f.getName());
//add this object with current attributes
CacheFileInfo new_cfi=new CacheFileInfo(f);
fileSet.add(new_cfi);
map.put(f.getName(),new_cfi);
}
return resp;
}
} catch( ParseException e ) { ; }
// we'll return null, so the caller will go ahead
// and fetch a new one, then store that new object
// into the cache.
// so we don't need to remove the old item now.
}
oi.close();
}
} catch( IOException e ) {
e.printStackTrace();
} catch( ClassNotFoundException e ) {
e.printStackTrace();
}
if(debug!=null)
debug.println("miss :"+request.getPath());
return null;
}
public boolean contains( HttpRequest request ) {
try {
File f = getCacheFileName(request);
if(!f.exists()) return false;
ObjectInputStream oi=new ObjectInputStream(
new FileInputStream(f));
String fURL=(String)oi.readObject();
boolean r = fURL.equals(request.getPath());
oi.close();
return r;
} catch( Exception e ) {
return false;
}
}
private File getCacheFileName( HttpRequest msg ) {
return new File( dir, Integer.toHexString( msg.getPath().hashCode() ) );
}
/**
* Compacts the cache so that the total size fell below the limit.
*
* @return
* true if the operation is successful and our used size is
* now lower then the limit.
*/
public boolean compactCache() {
synchronized(fileSet) {
/**
* Remove LRU cache file until get enough free space
* LRU strategy
*/
CacheFileInfo cFile;
while(cacheLimit<usedCacheSize && !fileSet.isEmpty()) {
cFile=(CacheFileInfo)fileSet.first(); //the LRU cache file
removeCacheItem(cFile);
}
return cacheLimit>=usedCacheSize;
}
}
/**
* Deletes the object represented by a given CacheFileInfo.
*
* To remove something from the cache, you need to call this method
* so that the cache manager can maintain the proper data structure.
*/
protected void removeCacheItem( CacheFileInfo cfi ) {
synchronized(fileSet) {
fileSet.remove(cfi);
map.remove(cfi.fname);
}
File tmp = new File(dir,"_"+cfi.fname);
new File(dir,cfi.fname).renameTo(tmp);
if(debug!=null) {
try {
// open the file just to print the name of URL
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(tmp));
debug.println("delete :"+ois.readObject());
ois.close();
} catch( Exception e ) {
// it's OK if we fail to print the debug message.
// so just ignore the error
}
}
tmp.delete();
modifyUsedCacheSize(-cfi.fsize);
}
}
摘要: rfc2616
对于返回是chunked格式的字节流的处理
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
import java.io.IOException;
import java.io.In... 阅读全文
String cmd = "ping 127.0.0.1 -t";
Runtime rt = Runtime.getRuntime();
System.out.println(""+cmd );
Process process = rt.exec(cmd );
InputStream stdin = process.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
String line;
StringBuffer buf = new StringBuffer();
while ((line = br.readLine()) != null) {
buf.append(line);
System.out.println(line);
}
int exitVal = process.waitFor();
System.out.println("Process exitValue: " + exitVal);
<extension
id="product"
point="org.eclipse.core.runtime.products">
<product
application="org.test.a.application"
name="%productName">
<property
name="windowImages"
value="icons/a.16.gif"/>
<property
name="appName"
value="Test">
</property>
<property
name="preferenceCustomization"
value="plugin_customization.ini">
</property>
plugin_customization.ini
# new-style tabs by default
org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false
# put the perspective switcher on the top right
org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight
# show progress on startup
org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP=false
org.eclipse.ui/SHOW_TEXT_ON_PERSPECTIVE_BAR=true
1. public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
2. /* (non-Javadoc)
3. * @see org.eclipse.ui.application.WorkbenchAdvisor#initialize(org.eclipse.ui.application.IWorkbenchConfigurer)
4. */
5. public void initialize(IWorkbenchConfigurer configurer) {
6. PlatformUI.getPreferenceStore().setDefault(
7. IWorkbenchPreferenceConstants.SHOW_PROGRESS_ON_STARTUP, true);
8. PlatformUI.getPreferenceStore().setDefault(
9. IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS, false);
10. }
11. }
-
SHOW_PROGRESS_ON_STARTUP
在splash的画面中, 是否显示进度条
-
DISABLE_NEW_FAST_VIEW
是否禁止左下角的Show View As a Fast View按钮
-
SHOW_MEMORY_MONITOR
是否显示内存情况, 并可进行GC操作, 这个比较有意思
-
SHOW_OPEN_ON_PERSPECTIVE_BAR
在PerspectiveBar上,是否显示New Perspective按钮
-
SHOW_TEXT_ON_PERSPECTIVE_BAR
在PerspectiveBar上,是否显示Perspective的名称
-
SHOW_TRADITIONAL_STYLE_TABS
Editor或ViewPart是否使用传统的Tab的样式. 这个肯定用true, false的太老土了.
-
DOCK_PERSPECTIVE_BAR
PerspectiveBar的显示位置, 左上 还是 右上.
|