﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-HotJava</title><link>http://www.blogjava.net/HotJava/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 18 Apr 2026 11:09:03 GMT</lastBuildDate><pubDate>Sat, 18 Apr 2026 11:09:03 GMT</pubDate><ttl>60</ttl><item><title>Linux 指令大全</title><link>http://www.blogjava.net/HotJava/archive/2006/11/23/83046.html</link><dc:creator>HotJava</dc:creator><author>HotJava</author><pubDate>Thu, 23 Nov 2006 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/HotJava/archive/2006/11/23/83046.html</guid><wfw:comment>http://www.blogjava.net/HotJava/comments/83046.html</wfw:comment><comments>http://www.blogjava.net/HotJava/archive/2006/11/23/83046.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/HotJava/comments/commentRss/83046.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/HotJava/services/trackbacks/83046.html</trackback:ping><description><![CDATA[
		<div>此帖送给初学LINUX的穷人们（LINUX的书太贵了）<br /><br />名称：cat <br />使用权限：所有使用者 <br />使用方式：cat [-AbeEnstTuv] [--help] [--version] fileName <br />说明：把档案串连接后传到基本输出（萤幕或加 &gt; fileName 到另一个档案） <br />参数： <br />-n 或 --number 由 1 开始对所有输出的行数编号 <br />-b 或 --number-nonblank 和 -n 相似，只不过对于空白行不编号 <br />-s 或 --squeeze-blank 当遇到有连续两行以上的空白行，就代换为一行的空白行 <br />-v 或 --show-nonprinting <br /><br />范例： <br />cat -n textfile1 &gt; textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里 <br />cat -b textfile1 textfile2 &gt;&gt; textfile3 把 textfile1 和 textfile2 的档案内容加上行号（空白行不加）之后将内容附加到 textfile3 <br /><br />名称 : cd <br />使用权限 : 所有使用者 <br /><br />使用方式 : cd [dirName] <br /><br />说明 : 变换工作目录至 dirName。 其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略，则变换至使用者的 home directory (也就是刚 login 时所在的目录)。 <br /><br />另外，"~" 也表示为 home directory 的意思，"." 则是表示目前所在的目录，".." 则表示目前目录位置的上一层目录。 <br /><br />范例 : 跳到 /usr/bin/ : <br />cd /usr/bin <br /><br />跳到自己的 home directory : <br />cd ~ <br /><br />跳到目前目录的上上两层 : <br />cd ../.. <br /><br /><br /><br />指令名称 : chmod <br />使用权限 : 所有使用者 <br /><br />使用方式 : chmod [-cfvR] [--help] [--version] mode file... <br /><br />说明 : Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所存取。 <br /><br />把计 : <br /><br />mode : 权限设定字串，格式如下 : [ugoa...][[+-=][rwxX]...][,...]，其中u 表示该档案的拥有者，g 表示与该档案的拥有者属于同一个群体(group)者，o 表示其他以外的人，a 表示这三者皆是。 <br />+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 <br />r 表示可读取，w 表示可写入，x 表示可执行，X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 <br />-c : 若该档案权限确实已经更改，才显示其更改动作 <br />-f : 若该档案权限无法被更改也不要显示错误讯息 <br />-v : 显示权限变更的详细资料 <br />-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) <br />--help : 显示辅助说明 <br />--version : 显示版本 <br /><br />范例 :将档案 file1.txt 设为所有人皆可读取 : <br />chmod ugo+r file1.txt <br /><br />将档案 file1.txt 设为所有人皆可读取 : <br />chmod a+r file1.txt <br /><br />将档案 file1.txt 与 file2.txt 设为该档案拥有者，与其所属同一个群体者可写入，但其他以外的人则不可写入 : <br />chmod ug+w,o-w file1.txt file2.txt <br /><br />将 ex1.py 设定为只有该档案拥有者可以执行 : <br />chmod u+x ex1.py <br /><br />将目前目录下的所有档案与子目录皆设为任何人可读取 : <br />chmod -R a+r * <br /><br />此外chmod也可以用数字来表示权限如 chmod 777 file <br />语法为：chmod abc file <br /><br />其中a,b,c各为一个数字，分别表示User、Group、及Other的权限。 <br /><br />r=4，w=2，x=1 <br />若要rwx属性则4+2+1=7； <br />若要rw-属性则4+2=6； <br />若要r-x属性则4+1=7。 <br /><br />范例： <br />chmod a=rwx file <br /><br />和 <br />chmod 777 file <br /><br />效果相同 <br />chmod ug=rwx,o=x file <br /><br />和 <br />chmod 771 file <br /><br />效果相同 <br /><br /><br /><br /><br /><br />若用chmod 4755 filename可使此程式具有root的权限 <br /><br /><br />指令名称 : chown <br />使用权限 : root <br /><br />使用方式 : chmod [-cfhvR] [--help] [--version] user[:group] file... <br /><br />说明 : Linux/Unix 是多人多工作业系统，所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说，这个指令只有是由系统管理者(root)所使用，一般使用者没有权限可以改变别人的档案拥有者，也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。 <br /><br />把计 : <br /><br />user : 新的档案拥有者的使用者 IDgroup : 新的档案拥有者的使用者群体(group)-c : 若该档案拥有者确实已经更改，才显示其更改动作-f : 若该档案拥有者无法被更改也不要显示错误讯息-h : 只对于连结(link)进行变更，而非该 link 真正指向的档案-v : 显示拥有者变更的详细资料-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)--help : 显示辅助说明--version : 显示版本 <br /><br />范例 : <br />将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie : <br />chown jessie:users file1.txt <br /><br />将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport : <br />chmod -R lamport:users * <br /><br /><br />名称：cp <br />使用权限：所有使用者 <br /><br />使用方式： <br /><br />cp [options] source dest <br />cp [options] source... directory <br /><br />说明：将一个档案拷贝至另一档案，或将数个档案拷贝至另一目录。 <br /><br />把计 <br /><br />-a 尽可能将档案状态、权限等资料都照原状予以复制。 <br />-r 若 source 中含有目录名，则将目录下之档案亦皆依序拷贝至目的地。 <br />-f 若目的地已经有相同档名的档案存在，则在复制前先予以删除再行复制。 <br />范例： <br />将档案 aaa 复制(已存在)，并命名为 bbb : <br />cp aaa bbb <br /><br />将所有的C语言程式拷贝至 Finished 子目录中 : <br />cp *.c Finished <br /><br /><br /><br />名称：cut <br /><br />使用权限：所有使用者 <br /><br />用法：cut -cnum1-num2 filename <br /><br />说明：显示每行从开头算起 num1 到 num2 的文字。 <br /><br />范例： <br /><br />shell&gt;&gt; cat example <br />test2 <br />this is test1 <br />shell&gt;&gt; cut -c0-6 example ## print 开头算起前 6 个字元 <br />test2 <br />this i <br /><br /><br />名称 : find <br />用法 : find <br />使用说明 : <br /><br />将档案系统内符合 expression 的档案列出来。你可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合，只有完全相符的才会被列出来。 <br /><br />find 根据下列规则判断 path 和 expression，在命令列上第一个 - ( ) , ! 之前的部份为 path，之后的是 expression。如果 path 是空字串则使用目前路径，如果 expression 是空字串则使用 -print 为预设 expression <br /><br />expression 中可使用的选项有二三十个之多，在此只介绍最常用的部份。 <br /><br />-mount, -xdev : 只检查和指定目录在同一个档案系统下的档案，避免列出其它档案系统中的档案 <br />-amin n : 在过去 n 分钟内被读取过 <br />-anewer file : 比档案 file 更晚被读取过的档案 <br />-atime n : 在过去 n 天过读取过的档案 <br />-cmin n : 在过去 n 分钟内被修改过 <br />-cnewer file :比档案 file 更新的档案 <br />-ctime n : 在过去 n 天过修改过的档案 <br />-empty : 空的档案-gid n or -group name : gid 是 n 或是 group 名称是 name <br />-ipath p, -path p : 路径名称符合 p 的档案，ipath 会忽略大小写 <br />-name name, -iname name : 档案名称符合 name 的档案。iname 会忽略大小写 <br />-size n : 档案大小 是 n 单位，b 代表 512 位元组的区块，c 表示字元数，k 表示 kilo bytes，w 是二个位元组。-type c : 档案类型是 c 的档案。 <br />d: 目录 <br />c: 字型装置档案 <br />b: 区块装置档案 <br />p: 具名贮列 <br />f: 一般档案 <br />l: 符号连结 <br />s: socket <br />-pid n : process id 是 n 的档案 <br /><br />你可以使用 ( ) 将运算式分隔，并使用下列运算。 <br />exp1 -and exp2 <br />! expr <br />-not expr <br />exp1 -or exp2 <br />exp1, exp2 <br />范例: <br />将目前目录及其子目录下所有延伸档名是 c 的档案列出来。 <br /># find . -name "*.c" <br /><br /><br />将目前目录其其下子目录中所有一般档案列出 <br /># find . -ftype f <br /><br /><br />将目前目录及其子目录下所有最近 20 分钟内更新过的档案列出 <br /># find . -ctime -20 <br /><br /><br /><br />名称：less <br /><br />使用权限：所有使用者 <br /><br />使用方式： <br /><br />less [Option] filename <br /><br />说明： <br />less 的作用与 more 十分相似，都可以用来浏览文字档案的内容，不同的是 less 允许使用者往回卷动 <br />以浏览已经看过的部份，同时因为 less 并未在一开始就读入整个档案，因此在遇上大型档案的开启时，会比一般的文书编辑器(如 vi)来的快速。 <br /><br /><br />范例： <br /><br /><br />指令名称 : ln <br />使用权限 : 所有使用者 <br /><br />使用方式 : ln [options] source dist，其中 option 的格式为 : <br /><br />[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}] <br />[--help] [--version] [--] <br />说明 : Linux/Unix 档案系统中，有所谓的连结(link)，我们可以将其视为档案的别名，而连结又可分为两种 : 硬连结(hard link)与软连结(symbolic link)，硬连结的意思是一个档案可以有多个名称，而软连结的方式则是产生一个特殊的档案，该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中，而软连结却可以跨越不同的档案系统。 <br />ln source dist 是产生一个连结(dist)到 source，至于使用硬连结或软链结则由参数决定。 <br /><br />不论是硬连结或软链结都不会将原本的档案复制一份，只会占用非常少量的磁碟空间。 <br /><br /><br />-f : 链结时先将与 dist 同档名的档案删除-d : 允许系统管理者硬链结自己的目录-i : 在删除与 dist 同档名的档案时先进行询问-n : 在进行软连结时，将 dist 视为一般的档案-s : 进行软链结(symbolic link)-v : 在连结之前显示其档名-b : 将在链结时会被覆写或删除的档案进行备份-S SUFFIX : 将备份的档案都加上 SUFFIX 的字尾-V METHOD : 指定备份的方式--help : 显示辅助说明--version : 显示版本 <br />范例 : <br />将档案 yy 产生一个 symbolic link : zz <br />ln -s yy zz <br /><br />将档案 yy 产生一个 hard link : zz <br />ln yy xx <br /><br /><br /><br />名称：locate <br />使用权限：所有使用者 <br />使用方式： locate [-q] [-d ] [--database=] <br />locate [-r ] [--regexp=] <br />locate [-qv] [-o ] [--output=] <br />locate [-e ] [-f ] &lt;[-l ] [-c] <br />&lt;[-U ] [-u]&gt; <br />locate [-Vh] [--version] [--help] <br />说明： <br />locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的资料库，之后当寻找时就只需查询这个资料库，而不必实际深入档案系统之中了。 <br /><br />在一般的 distribution 之中，资料库的建立都被放在 contab 中自动执行。一般使用者在使用时只要用 <br /><br /># locate your_file_name <br /><br />的型式就可以了。 参数： <br />-u <br />-U <br /><br />建立资料库，-u 会由根目录开始，-U 则可以指定开始的位置。 <br /><br />-e <br /><br />将 <br />排除在寻找的范围之外。 <br /><br />-l <br />如果 是 1．则启动安全模式。在安全模式下，使用者不会看到权限无法看到的档案。这会始速度减慢，因为 locate 必须至实际的档案系统中取得档案的权限资料。 <br /><br />-f <br />将特定的档案系统排除在外，例如我们没有到理要把 proc 档案系统中的档案放在资料库中。 <br /><br />-q <br />安静模式，不会显示任何错误讯息。 <br /><br />-n <br />至多显示 个输出。 <br /><br />-r <br />使用正规运算式 做寻找的条件。 <br /><br />-o <br />指定资料库存的名称。 <br /><br />-d <br /><br />指定资料库的路径 <br /><br />-h <br />显示辅助讯息 <br /><br />-v <br />显示更多的讯息 <br /><br />-V <br />显示程式的版本讯息 范例： <br /><br />locate chdrv : 寻找所有叫 chdrv 的档案 <br />locate -n 100 a.out : 寻找所有叫 a.out 的档案，但最多只显示 100 个 <br />locate -u : 建立资料库 <br /><br /><br />名称 : ls <br />使用权限 : 所有使用者 <br /><br />使用方式 : ls [-alrtAFR] [name...] <br /><br />说明 : 显示指定工作目录下之内容（列出目前工作目录所含之档案及子目录)。 <br /><br /><br />-a 显示所有档案及目录 (ls内定将档案名或目录名称开头为"."的视为隐藏档，不会列出) <br />-l 除档案名称外，亦将档案型态、权限、拥有者、档案大小等资讯详细列出 <br />-r 将档案以相反次序显示(原定依英文字母次序) <br />-t 将档案依建立时间之先后次序列出 <br />-A 同 -a ，但不列出 "." (目前目录) 及 ".." (父目录) <br />-F 在列出的档案名称后加一符号；例如可执行档则加 "*", 目录则加 "/" <br />-R 若目录下有档案，则以下之档案亦皆依序列出 <br /><br />范例： <br />列出目前工作目录下所有名称是 s 开头的档案，愈新的排愈后面 : <br />ls -ltr s* <br /><br />将 /bin 目录以下所有目录及档案详细资料列出 : <br />ls -lR /bin <br /><br />列出目前工作目录下所有档案及目录；目录于名称后加 "/", 可执行档于名称后加 "*" : <br />ls -AF <br /><br />名称：more <br />使用权限：所有使用者 <br />使用方式：more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..] <br />说明：类似 cat ，不过会以一页一页的显示方便使用者逐页阅读，而最基本的指令就是按空白键（space）就往下一页显示，按 b 键就会往回（back）一页显示，而且还有搜寻字串的功能（与 vi 相似），使用中的说明文件，请按 h 。 <br />参数：-num 一次显示的行数 <br />-d 提示使用者，在画面下方显示 [Press space to continue, q to quit.] ，如果使用者按错键，则会显示 [Press h for instructions.] 而不是 哔 声 <br />-l 取消遇见特殊字元 ^L（送纸字元）时会暂停的功能 <br />-f 计算行数时，以实际上的行数，而非自动换行过后的行数（有些单行字数太长的会被扩展为两行或两行以上） <br />-p 不以卷动的方式显示每一页，而是先清除萤幕后再显示内容 <br />-c 跟 -p 相似，不同的是先显示内容再清除其他旧资料 <br />-s 当遇到有连续两行以上的空白行，就代换为一行的空白行 <br />-u 不显示下引号 （根据环境变数 TERM 指定的 terminal 而有所不同） <br />+/ 在每个档案显示前搜寻该字串（pattern），然后从该字串之后开始显示 <br />+num 从第 num 行开始显示 <br />fileNames 欲显示内容的档案，可为复数个数 <br />范例： <br />more -s testfile 逐页显示 testfile 之档案内容，如有连续两行以上空白行则以一行空白行显示。 <br />more +20 testfile 从第 20 行开始显示 testfile 之档案内容。 <br /><br /><br />名称：mv <br />使用权限：所有使用者 <br /><br />使用方式： <br /><br />mv [options] source dest <br />mv [options] source... directory <br />说明：将一个档案移至另一档案，或将数个档案移至另一目录。 <br />参数：-i 若目的地已有同名档案，则先询问是否覆盖旧档。 <br /><br />范例： <br /><br />将档案 aaa 更名为 bbb : <br />mv aaa bbb <br /><br />将所有的C语言程式移至 Finished 子目录中 : <br />mv -i *.c <br /><br /><br /><br />名称：rm <br />使用权限：所有使用者 <br /><br />使用方式：rm [options] name... <br /><br />说明：删除档案及目录。 <br /><br />把计 <br /><br />-i 删除前逐一询问确认。 <br />-f 即使原档案属性设为唯读，亦直接删除，无需逐一确认。 <br />-r 将目录及以下之档案亦逐一删除。 <br />范例： <br />删除所有C语言程式档；删除前逐一询问确认 : <br />rm -i *.c <br /><br />将 Finished 子目录及子目录中所有档案删除 : <br />rm -r Finished <br /><br /><br /><br />名称：rmdir <br />使用权限：于目前目录有适当权限的所有使用者 <br /><br />使用方式： rmdir [-p] dirName <br /><br />说明： 删除空的目录。 <br /><br />参数： -p 是当子目录被删除后使它也成为空目录的话，则顺便一并删除。 <br /><br />范例： <br /><br />将工作目录下，名为 AAA 的子目录删除 : <br />rmdir AAA <br /><br />在工作目录下的 BBB 目录中，删除名为 Test 的子目录。若 Test 删除后，BBB 目录成为空目录，则 BBB 亦予删除。 <br />rmdir -p BBB/Test <br /><br /><br /><br />名称：split <br />使用权限：所有使用者 <br /><br />使用方式：split [OPTION] [INPUT [PREFIX]] <br /><br />说明： <br /><br />将一个档案分割成数个。而从 INPUT 分割输出成固定大小的档案，其档名依序为 PREFIXaa, PREFIXab...；PREFIX 预设值为 `x。若没有 INPUT 档或为 `-，则从标准输入读进资料。 <br /><br />匡兜 <br /><br />-b, --bytes=SIZE <br /><br />SIZE 值为每一输出档案的大小，单位为 byte。 <br />-C, --line-bytes=SIZE <br /><br />每一输出档中，单行的最大 byte 数。 <br />-l, --lines=NUMBER <br /><br />NUMBER 值为每一输出档的列数大小。 <br />-NUMBER <br /><br />与 -l NUMBER 相同。 <br />--verbose <br /><br />于每个输出档被开启前，列印出侦错资讯到标准错误输出。 <br />--help <br /><br />显示辅助资讯然后离开。 <br />--version <br /><br />列出版本资讯然后离开。 <br />SIZE 可加入单位: b 代表 512， k 代表 1K， m 代表 1 Meg。 <br /><br />范例： <br /><br />PostgresSQL 大型资料库备份与回存： <br /><br />因 Postgres 允许表格大过你系统档案的最大容量，所以要将表格 dump 到单一的档案可能会有问题，使用 split进行档案分割。 <br /><br /><br />% pg_dump dbname | split -b 1m - filename.dump. <br /><br /><br /><br />重新载入 <br /><br /><br />% createdb dbname <br />% cat filename.dump.* | pgsql dbname <br /><br /><br /><br />名称：touch <br />使用权限：所有使用者 <br /><br />使用方式： <br />touch [-acfm] <br />[-r reference-file] [--file=reference-file] <br />[-t MMDDhhmm[[CC]YY][.ss]] <br />[-d time] [--date=time] [--time={atime,access,use,mtime,modify}] <br />[--no-create] [--help] [--version] <br />file1 [file2 ...] <br /><br /><br />说明： <br />touch 指令改变档案的时间记录。 ls -l 可以显示档案的时间记录。 <br /><br /><br />参数： <br />a 改变档案的读取时间记录。 <br />m 改变档案的修改时间记录。 <br />c 假如目的档案不存在，不会建立新的档案。与 --no-create 的效果一样。 <br />f 不使用，是为了与其他 unix 系统的相容性而保留。 <br />r 使用参考档的时间记录，与 --file 的效果一样。 <br />d 设定时间与日期，可以使用各种不同的格式。 <br />t 设定档案的时间记录，格式与 date 指令相同。 <br />--no-create 不会建立新档案。 <br />--help 列出指令格式。 <br />--version 列出版本讯息。 <br /><br /><br />范例： <br /><br /><br />最简单的使用方式，将档案的时候记录改为现在的时间。若档案不存在，系统会建立一个新的档案。 <br /><br />touch file <br />touch file1 file2 <br /><br />将 file 的时间记录改为 5 月 6 日 18 点 3 分，公元两千年。时间的格式可以参考 date 指令，至少需输入 MMDDHHmm ，就是月日时与分。 <br /><br />touch -c -t 05061803 file <br />touch -c -t 050618032000 file <br /><br />将 file 的时间记录改变成与 referencefile 一样。 <br /><br />touch -r referencefile file <br /><br />将 file 的时间记录改成 5 月 6 日 18 点 3 分，公元两千年。时间可以使用 am, pm 或是 24 小时的格式，日期可以使用其他格式如 6 May 2000 。 <br /><br />touch -d "6:03pm" file <br />touch -d "05/06/2000" file <br />touch -d "6:03pm 05/06/2000" file <br />名称 : at <br />使用权限 : 所有使用者 <br /><br />使用方式 : at -V [-q queue] [-f file] [-mldbv] TIME <br /><br />说明 : at 可以让使用者指定在 TIME 这个特定时刻执行某个程式或指令，TIME 的格式是 HH:MM其中的 HH 为小时，MM 为分钟，甚至你也可以指定 am, pm, midnight, noon, teatime(就是下午 4 点锺)等口语词。 <br /><br />如果想要指定超过一天内的时间，则可以用 MMDDYY 或者 MM/DD/YY 的格式，其中 MM 是分钟，DD 是第几日，YY 是指年份。另外，使用者甚至也可以使用像是 now + 时间间隔来弹性指定时间，其中的时间间隔可以是 minutes, hours, days, weeks <br /><br />另外，使用者也可指定 today 或 tomorrow 来表示今天或明天。当指定了时间并按下 enter 之后，at 会进入交谈模式并要求输入指令或程式，当你输入完后按下 ctrl+D 即可完成所有动作，至于执行的结果将会寄回你的帐号中。 <br /><br />把计 : <br /><br />-V : 印出版本编号 <br />-q : 使用指定的伫列(Queue)来储存，at 的资料是存放在所谓的 queue 中，使用者可以同时使用多个 queue，而 queue 的编号为 a, b, c... z 以及 A, B, ... Z 共 52 个 <br />-m : 即使程式/指令执行完成后没有输出结果, 也要寄封信给使用者 <br />-f file : 读入预先写好的命令档。使用者不一定要使用交谈模式来输入，可以先将所有的指定先写入档案后再一次读入 <br />-l : 列出所有的指定 (使用者也可以直接使用 atq 而不用 at -l) <br />-d : 删除指定 (使用者也可以直接使用 atrm 而不用 at -d) <br />-v : 列出所有已经完成但尚未删除的指定 <br /><br />例子 : <br />三天后的下午 5 点锺执行 /bin/ls : <br />at 5pm + 3 days /bin/ls <br /><br />三个星期后的下午 5 点锺执行 /bin/ls : <br />at 5pm + 2 weeks /bin/ls <br /><br />明天的 17:20 执行 /bin/date : <br />at 17:20 tomorrow /bin/date <br /><br />1999 年的最后一天的最后一分钟印出 the end of world ! <br />at 23:59 12/31/1999 echo the end of world ! <br /><br /><br /><br /><br />名称：cal <br /><br />使用权限：所有使用者 <br /><br />使用方式：cal [-mjy] [month [year]] <br /><br />说明： <br /><br />显示日历。若只有一个参数，则代表年份(1-9999)，显示该年的年历。年份必须全部写出：``cal 89\ 将不会是显示 1989 年的年历。使用两个参数，则表示月份及年份。若没有参数则显示这个月的月历。 <br />1752 年 9 月第 3 日起改用西洋新历，因这时大部份的国家都采用新历，有 10 天被去除，所以该月份的月历有些不同。在此之前为西洋旧历。 <br /><br />匡兜 <br /><br />-m : 以星期一为每周的第一天方式显示。 <br />-j : 以凯撒历显示，即以一月一日起的天数显示。 <br />-y : 显示今年年历。 <br /><br />范例： <br /><br />cal : 显示本月的月历。 <br /><br /><br /><br />[root@mylinux /root]# date <br />Tue Aug 15 08:00:18 CST 2000 <br />[root@mylinux /root]# cal <br />August 2000 <br />Su Mo Tu We Th Fr Sa <br />1 2 3 4 5 <br />6 7 8 9 10 11 12 <br />13 14 15 16 17 18 19 <br />20 21 22 23 24 25 26 <br />27 28 29 30 31 <br /><br />[root@mylinux /root]# <br /><br /><br />cal 2001 : 显示公元 2001 年年历。 <br /><br />[root@mylinux /root]# cal 2001 <br />2001 <br /><br />January February March <br />Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa <br />1 2 3 4 5 6 1 2 3 1 2 3 <br />7 8 9 10 11 12 13 4 5 6 7 8 9 10 4 5 6 7 8 9 10 <br />14 15 16 17 18 19 20 11 12 13 14 15 16 17 11 12 13 14 15 16 17 <br />21 22 23 24 25 26 27 18 19 20 21 22 23 24 18 19 20 21 22 23 24 <br />28 29 30 31 25 26 27 28 25 26 27 28 29 30 31 <br /><br />April May June <br />Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa <br />1 2 3 4 5 6 7 1 2 3 4 5 1 2 <br />8 9 10 11 12 13 14 6 7 8 9 10 11 12 3 4 5 6 7 8 9 <br />15 16 17 18 19 20 21 13 14 15 16 17 18 19 10 11 12 13 14 15 16 <br />22 23 24 25 26 27 28 20 21 22 23 24 25 26 17 18 19 20 21 22 23 <br />29 30 27 28 29 30 31 24 25 26 27 28 29 30 <br /><br />July August September <br />Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa <br />1 2 3 4 5 6 7 1 2 3 4 1 <br />8 9 10 11 12 13 14 5 6 7 8 9 10 11 2 3 4 5 6 7 8 <br />15 16 17 18 19 20 21 12 13 14 15 16 17 18 9 10 11 12 13 14 15 <br />22 23 24 25 26 27 28 19 20 21 22 23 24 25 16 17 18 19 20 21 22 <br />29 30 31 26 27 28 29 30 31 23 24 25 26 27 28 29 <br />30 <br />October November December <br />Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa <br />1 2 3 4 5 6 1 2 3 1 <br />7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8 <br />14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15 <br />21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22 <br />28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29 <br />30 31 <br /><br />[root@mylinux /root]# <br /><br /><br /><br /><br /><br />cal 5 2001 : 显示公元 2001 年 5 月月历。 <br /><br /><br /><br />[root@mylinux /root]# cal 5 2001 <br />May 2001 <br />Su Mo Tu We Th Fr Sa <br />1 2 3 4 5 <br />6 7 8 9 10 11 12 <br />13 14 15 16 17 18 19 <br />20 21 22 23 24 25 26 <br />27 28 29 30 31 <br /><br />[root@mylinux /root]# <br /><br /><br /><br /><br /><br />cal -m : 以星期一为每周的第一天方式，显示本月的月历。 <br /><br /><br /><br />[root@mylinux /root]# cal -m <br />August 2000 <br />Mo Tu We Th Fr Sa Su <br />1 2 3 4 5 6 <br />7 8 9 10 11 12 13 <br />14 15 16 17 18 19 20 <br />21 22 23 24 25 26 27 <br />28 29 30 31 <br /><br />[root@mylinux /root]# <br /><br /><br /><br /><br /><br />cal -jy : 以一月一日起的天数显示今年的年历。 <br /><br /><br /><br />[root@mylinux /root]# cal -jy <br />2000 <br /><br />January February <br />Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <br />1 32 33 34 35 36 <br />2 3 4 5 6 7 8 37 38 39 40 41 42 43 <br />9 10 11 12 13 14 15 44 45 46 47 48 49 50 <br />16 17 18 19 20 21 22 51 52 53 54 55 56 57 <br />23 24 25 26 27 28 29 58 59 60 <br />30 31 <br />March April <br />Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <br />61 62 63 64 92 <br />65 66 67 68 69 70 71 93 94 95 96 97 98 99 <br />72 73 74 75 76 77 78 100 101 102 103 104 105 106 <br />79 80 81 82 83 84 85 107 108 109 110 111 112 113 <br />86 87 88 89 90 91 114 115 116 117 118 119 120 <br />121 <br />May June <br />Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <br />122 123 124 125 126 127 153 154 155 <br />128 129 130 131 132 133 134 156 157 158 159 160 161 162 <br />135 136 137 138 139 140 141 163 164 165 166 167 168 169 <br />142 143 144 145 146 147 148 170 171 172 173 174 175 176 <br />149 150 151 152 177 178 179 180 181 182 <br /><br />July August <br />Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <br />183 214 215 216 217 218 <br />184 185 186 187 188 189 190 219 220 221 222 223 224 225 <br />191 192 193 194 195 196 197 226 227 228 229 230 231 232 <br />198 199 200 201 202 203 204 233 234 235 236 237 238 239 <br />205 206 207 208 209 210 211 240 241 242 243 244 <br />212 213 <br />September October <br />Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <br />245 246 275 276 277 278 279 280 281 <br />247 248 249 250 251 252 253 282 283 284 285 286 287 288 <br />254 255 256 257 258 259 260 289 290 291 292 293 294 295 <br />261 262 263 264 265 266 267 296 297 298 299 300 301 302 <br />268 269 270 271 272 273 274 303 304 305 <br /><br />November December <br />Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <br />306 307 308 309 336 337 <br />310 311 312 313 314 315 316 338 339 340 341 342 343 344 <br />317 318 319 320 321 322 323 345 346 347 348 349 350 351 <br />324 325 326 327 328 329 330 352 353 354 355 356 357 358 <br />331 332 333 334 335 359 360 361 362 363 364 365 <br />366 <br /><br />[root@mylinux /root]# <br /><br /><br /><br /><br />名称 : crontab <br />使用权限 : 所有使用者 <br /><br />使用方式 : <br /><br />crontab [ -u user ] filecrontab [ -u user ] { -l | -r | -e } <br />说明 : <br />crontab 是用来让使用者在固定时间或固定间隔执行程式之用，换句话说，也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表，这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话，就是表示设定自己的时程表。 <br /><br />餐数 : <br /><br />-e : 执行文字编辑器来设定时程表，内定的文字编辑器是 VI，如果你想用别的文字编辑器，则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe) <br />-r : 删除目前的时程表 <br />-l : 列出目前的时程表 <br /><br />时程表的格式如下 : <br />f1 f2 f3 f4 f5 program <br /><br />其中 f1 是表示分钟，f2 表示小时，f3 表示一个月份中的第几日，f4 表示月份，f5 表示一个星期中的第几天。program 表示要执行的程式。 <br />当 f1 为 * 时表示每分钟都要执行 program，f2 为 * 时表示每小时都要执行程式，其余类推 <br />当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行，f2 为 a-b 时表示从第 a 到第 b 小时都要执行，其余类推 <br />当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次，f2 为 */n 表示每 n 小时个时间间隔执行一次，其余类推 <br />当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行，f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行，其余类推 <br /><br />使用者也可以将所有的设定先存放在档案 file 中，用 crontab file 的方式来设定时程表。 <br />例子 : <br /><br />每月每天每小时的第 0 分钟执行一次 /bin/ls : <br />0 7 * * * /bin/ls <br /><br />在 12 月内, 每天的早上 6 点到 12 点中，每隔 20 分钟执行一次 /usr/bin/backup : <br />0 6-12/3 * 12 * /usr/bin/backup <br /><br />周一到周五每天下午 5:00 寄一封信给 <a href="mailto:alex@domain.name"><font color="#22229c">alex@domain.name</font></a> : <br />0 17 * * 1-5 mail -s "hi" <a href="mailto:alex@domain.name"><font color="#22229c">alex@domain.name</font></a> &lt; /tmp/maildata <br /><br />每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha" <br />20 0-23/2 * * * echo "haha" <br /><br />注意 : <br /><br />当程式在你所指定的时间执行后，系统会寄一封信给你，显示该程式执行的内容，若是你不希望收到这样的信，请在每一行空一格之后加上 &gt; /dev/null 2&gt;&amp;1 即可。 <br /><br />名称 : date <br />使用权限 : 所有使用者 <br /><br />使用方式 : <br /><br />date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]] <br /><br />说明 : <br /><br />date 可以用来显示或设定系统的日期与时间，在显示方面，使用者可以设定欲显示的格式，格式设定为一个加号后接数个标记，其中可用的标记列表如下 : <br /><br />时间方面 : <br /><br />% : 印出 % <br />%n : 下一行 <br />%t : 跳格 <br />%H : 小时(00..23) <br />%I : 小时(01..12) <br />%k : 小时(0..23) <br />%l : 小时(1..12) <br />%M : 分钟(00..59) <br />%p : 显示本地 AM 或 PM <br />%r : 直接显示时间 (12 小时制，格式为 hh:mm:ss [AP]M) <br />%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 <br />%S : 秒(00..61) <br />%T : 直接显示时间 (24 小时制) <br />%X : 相当于 %H:%M:%S <br />%Z : 显示时区 <br /><br />日期方面 : <br />%a : 星期几 (Sun..Sat) <br />%A : 星期几 (Sunday..Saturday) <br />%b : 月份 (Jan..Dec) <br />%B : 月份 (January..December) <br />%c : 直接显示日期与时间 <br />%d : 日 (01..31) <br />%D : 直接显示日期 (mm/dd/yy) <br />%h : 同 %b <br />%j : 一年中的第几天 (001..366) <br />%m : 月份 (01..12) <br />%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形) <br />%w : 一周中的第几天 (0..6) <br />%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形) <br />%x : 直接显示日期 (mm/dd/yy) <br />%y : 年份的最后两位数字 (00.99) <br />%Y : 完整年份 (0000..9999) <br /><br />若是不以加号作为开头，则表示要设定时间，而时间格式为 MMDDhhmm[[CC]YY][.ss]，其中 MM 为月份，DD 为日，hh 为小时，mm 为分钟，CC 为年份前两位数字，YY 为年份后两位数字，ss 为秒数 <br />把计 : <br /><br />-d datestr : 显示 datestr 中所设定的时间 (非系统时间) <br />--help : 显示辅助讯息 <br />-s datestr : 将系统时间设为 datestr 中所设定的时间 <br />-u : 显示目前的格林威治时间 <br />--version : 显示版本编号 <br /><br />例子 : <br />显示时间后跳行，再显示目前日期 : <br />date +%T%n%D <br /><br />显示月份与日数 : <br />date +%B %d <br /><br />显示日期与设定时间(12:34:56) : <br />date --date 12:34:56 <br /><br />注意 : <br /><br />当你不希望出现无意义的 0 时(比如说 1999/03/07)，则可以在标记中插入 - 符号，比如说 date +%-H:%-M:%-S 会把时分秒中无意义的 0 给去掉，像是原本的 08:09:04 会变为 8:9:4。另外，只有取得权限者(比如说 root)才能设定系统时间。 <br /><br />当你以 root 身分更改了系统时间之后，请记得以 clock -w 来将系统时间写入 CMOS 中，这样下次重新开机时系统时间才会持续抱持最新的正确值。 <br /><br /><br />名称 : sleep <br />使用权限 : 所有使用者 <br /><br />使用方式 : sleep [--help] [--version] number[smhd] <br /><br />说明 : sleep 可以用来将目前动作延迟一段时间 <br /><br />参数说明 : <br /><br />--help : 显示辅助讯息 <br />--version : 显示版本编号 <br />number : 时间长度，后面可接 s、m、h 或 d <br />其中 s 为秒，m 为 分钟，h 为小时，d 为日数 <br /><br />例子 : <br />显示目前时间后延迟 1 分钟，之后再次显示时间 : <br />date;sleep 1m;date <br /><br /><br /><br />名称： time <br />使用权限： 所有使用者 <br /><br />使用方式： time [options] COMMAND [arguments] <br /><br />说明： time 指令的用途，在于量测特定指令执行时所需消耗的时间及系统资源等资讯。例如 CPU 时间、记忆体、输入输出等等。需要特别注意的是，部分资讯在 Linux 上显示不出来。这是因为在 Linux 上部分资源的分配函式与 time 指令所预设的方式并不相同，以致于 time 指令无法取得这些资料。 <br /><br />把计 <br /><br />-o or --output=FILE <br />设定结果输出档。这个选项会将 time 的输出写入 所指定的档案中。如果档案已经存在，系统将覆写其内容。 <br />-a or --append <br />配合 -o 使用，会将结果写到档案的末端，而不会覆盖掉原来的内容。 <br />-f FORMAT or --format=FORMAT <br />以 FORMAT 字串设定显示方式。当这个选项没有被设定的时候，会用系统预设的格式。不过你可以用环境变数 time 来设定这个格式，如此一来就不必每次登入系统都要设定一次。 <br />一般设定上，你可以用 <br />\t <br />表示跳栏，或者是用 <br />\n <br />表示换行。每一项资料要用 % 做为前导。如果要在字串中使用百分比符号，就用 。（学过 C 语言的人大概会觉得很熟悉） <br />time 指令可以显示的资源有四大项，分别是： <br /><br />Time resources <br />Memory resources <br />IO resources <br />Command info <br /><br />详细的内容如下： <br /><br /><br />Time Resources <br />E 执行指令所花费的时间，格式是：[hour]:minute:second。请注意这个数字并不代表实际的 CPU 时间。 <br />e 执行指令所花费的时间，单位是秒。请注意这个数字并不代表实际的 CPU 时间。 <br />S 指令执行时在核心模式（kernel mode）所花费的时间，单位是秒。 <br />U 指令执行时在使用者模式（user mode）所花费的时间，单位是秒。 <br />P 执行指令时 CPU 的占用比例。其实这个数字就是核心模式加上使用者模式的 CPU 时间除以总时间。 <br /><br /><br />Memory Resources <br />M 执行时所占用的实体记忆体的最大值。单位是 KB <br />t 执行时所占用的实体记忆体的平均值，单位是 KB <br />K 执行程序所占用的记忆体总量（stack+data+text）的平均大小，单位是 KB <br />D 执行程序的自有资料区（unshared data area）的平均大小，单位是 KB <br />p 执行程序的自有堆叠（unshared stack）的平均大小，单位是 KB <br />X 执行程序间共享内容（shared text）的平均值，单位是 KB <br />Z 系统记忆体页的大小，单位是 byte。对同一个系统来说这是个常数 <br /><br /><br />IO Resources <br />F 此程序的主要记忆体页错误发生次数。所谓的主要记忆体页错误是指某一记忆体页已经置换到置换档（swap file)中，而且已经分配给其他程序。此时该页的内容必须从置换档里再读出来。 <br />R 此程序的次要记忆体页错误发生次数。所谓的次要记忆体页错误是指某一记忆体页虽然已经置换到置换档中，但尚未分配给其他程序。此时该页的内容并未被破坏，不必从置换档里读出来 <br />W 此程序被交换到置换档的次数 <br />c 此程序被强迫中断（像是分配到的 CPU 时间耗尽）的次数 <br />w 此程序自愿中断（像是在等待某一个 I/O 执行完毕，像是磁碟读取等等）的次数 <br />I 此程序所输入的档案数 <br />O 此程序所输出的档案数 <br />r 此程序所收到的 Socket Message <br />s 此程序所送出的 Socket Message <br />k 此程序所收到的信号 ( Signal )数量 <br /><br /><br />Command Info <br />C 执行时的参数以及指令名称 <br />x 指令的结束代码 ( Exit Status ) <br /><br /><br /><br /><br />-p or --portability <br />这个选项会自动把显示格式设定成为： <br />real %e <br />user %U <br />sys %S <br />这么做的目的是为了与 POSIX 规格相容。 <br />-v or --verbose <br />这个选项会把所有程式中用到的资源通通列出来，不但如一般英文语句，还有说明。对不想花时间去熟习格式设定或是刚刚开始接触这个指令的人相当有用。 <br /><br />范例： <br />利用下面的指令 <br />time -v ps -aux <br /><br />我们可以获得执行 ps -aux 的结果和所花费的系统资源。如下面所列的资料： <br />USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND <br />root 1 0.0 0.4 1096 472 ? S Apr19 0:04 init <br />root 2 0.0 0.0 0 0 ? SW Apr19 0:00 [kflushd] <br />root 3 0.0 0.0 0 0 ? SW Apr19 0:00 [kpiod] <br />...... <br />root 24269 0.0 1.0 2692 996 pts/3 R 12:16 0:00 ps -aux <br /><br />Command being timed: "ps -aux" <br />User time (seconds): 0.05 <br />System time (seconds): 0.06 <br />Percent of CPU this job got: 68% <br />Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.16 <br />Average shared text size (kbytes): 0 <br />Average unshared data size (kbytes): 0 <br />Average stack size (kbytes): 0 <br />Average total size (kbytes): 0 <br />Maximum resident set size (kbytes): 0 <br />Average resident set size (kbytes): 0 <br />Major (requiring I/O) page faults: 238 <br />Minor (reclaiming a frame) page faults: 46 <br />Voluntary context switches: 0 <br />Involuntary context switches: 0 <br />Swaps: 0 <br />File system inputs: 0 <br />File system outputs: 0 <br />Socket messages sent: 0 <br />Socket messages received: 0 <br />Signals delivered: 0 <br />Page size (bytes): 4096 <br />Exit status: 0 <br /><br /><br /><br />名称： uptime <br />使用权限： 所有使用者 <br />使用方式： uptime [-V] <br />说明： uptime 提供使用者下面的资讯，不需其他参数： <br /><br />现在的时间 <br />系统开机运转到现在经过的时间 <br />连线的使用者数量 <br />最近一分钟，五分钟和十五分钟的系统负载 <br />参数： -V 显示版本资讯。 <br />范例： uptime <br />其结果为： <br />10:41am up 5 days, 10 min, 1 users, load average: 0.00, 0.00, 1.99 <br /><br />名称：chfn <br /><br />使用权限：所有使用者 <br /><br />用法：shell&gt;&gt; chfn <br /><br />说明：提供使用者更改个人资讯，用于 finger and mail username <br /><br />范例： <br /><br />shell&gt;&gt; chfn <br />Changing finger information for user <br />Password: [del] <br />Name[]:Johnney Huang ### 提供 finger 时的资料 <br />Office[]:NCCU <br />Office Phone[]: [del] <br />Home Phone[]: [del] <br /><br /><br />名称：chsh <br /><br />使用权限：所有使用者 <br /><br />用法：shell&gt;&gt; chsh <br /><br />说明：更改使用者 shell 设定 <br /><br />范例： <br /><br />shell&gt;&gt; chsh <br />Changing fihanging shell for user1 <br />Password: [del] <br />New shell [/bin/tcsh]: ### [是目前使用的 shell] <br />[del] <br /><br />shell&gt;&gt; chsh -l ### 展示 /etc/shells 档案内容 <br />/bin/bash <br />/bin/sh <br />/bin/ash <br />/bin/bsh <br />/bin/tcsh <br />/bin/csh <br /><br /><br /><br />” finger [返回] <br />名称： finger <br />使用权限： 所有使用者 <br /><br />使用方式： finger [options] user[@address] <br /><br />说明：finger 可以让使用者查询一些其他使用者的资料。会列出来的资料有： <br /><br />Login Name <br />User Name <br />Home directory <br />Shell <br />Login status <br />mail status <br />.plan <br />.project <br />.forward <br /><br />其中 .plan ，.project 和 .forward 就是使用者在他的 Home Directory 里的 .plan ， .project 和 .forward 等档案里的资料。如果没有就没有。finger 指令并不限定于在同一伺服器上查询，也可以寻找某一个远端伺服器上的使用者。只要给一个像是 E-mail address 一般的地址即可。 <br />把计 <br /><br />-l <br />多行显示。 <br /><br />-s <br />单行显示。这个选项只显示登入名称，真实姓名，终端机名称，闲置时间，登入时间，办公室号码及电话号码。如果所查询的使用者是远端伺服器的使用者，这个选项无效。 <br /><br />范例：下列指令可以查询本机管理员的资料： <br />finger root <br /><br />其结果如下： <br />Login: root Name: root <br />Directory: /root Shell: /bin/bash <br />Never logged in. <br />No mail. <br />No Plan. <br /><br /><br /><br /><br />名称：last <br /><br />使用权限：所有使用者 <br /><br />使用方式：shell&gt;&gt; last [options] <br /><br />说明：显示系统开机以来获是从每月初登入者的讯息 <br /><br />把计 <br /><br />-R 省略 hostname 的栏位 <br />-num 展示前 num 个 <br />username 展示 username 的登入讯息 <br />tty 限制登入讯息包含终端机代号 <br /><br />范例： <br /><br />shell&gt;&gt; last -R -2 <br />johnney pts/1 Mon Aug 14 20:42 still logged in <br />johnney pts/0 Mon Aug 14 19:59 still logged in <br /><br />wtmp begins Tue Aug 1 09:01:10 2000 ### /var/log/wtmp <br /><br /><br />shell&gt;&gt; last -2 minery <br />minery pts/0 140.119.217.115 Mon Aug 14 18:37 - 18:40 (00:03) <br />minery pts/0 140.119.217.115 Mon Aug 14 17:22 - 17:24 (00:02) <br /><br />wtmp begins Tue Aug 1 09:01:10 2000 <br /><br /><br /><br /><br />名称:login <br /><br />这个命令都不会就不要干算了！呵呵我也不在这里多费笔墨耽误大家美好青春了^_^ <br /><br /><br /><br />名称：passwd <br /><br />使用权限：所有使用者 <br /><br />使用方式：passwd [-k] [-l] [-u [-f]] [-d] [-S] [username] <br /><br />说明：用来更改使用者的密码 <br /><br />参数： <br />-k <br /><br />-l <br /><br />-u <br /><br />-f <br /><br />-d 关闭使用者的密码认证功能, 使用者在登入时将可以不用输入密码, 只有具备 root 权限的使用者方可使用. <br /><br />-S 显示指定使用者的密码认证种类, 只有具备 root 权限的使用者方可使用. <br /><br />[username] 指定帐号名称. <br /><br /><br /><br />名称 : who <br />使用权线 : 所有使用者都可使用 <br /><br />使用方式 : who - [husfV] [user] <br /><br />说明 : 显示系统中有那些使用者正在上面，显示的资料包含了使用者 ID，使用的终端机，从那边连上来的，上线时间，呆滞时间，CPU 使用量，动作等等。 <br /><br />把计 : <br /><br />-h : 不要显示标题列 <br />-u : 不要显示使用者的动作/工作 <br />-s : 使用简短的格式来显示 <br />-f : 不要显示使用者的上线位置 <br />-V : 显示程式版本 <br />名称：/etc/aliases <br />使用权限：系统管理者 <br />使用方式： 请用 newaliases 更新资料库 <br />说明： <br />sendmail 会使用一个在 /etc/aliases 中的档案做使用者名称转换的动作。当 sendmail 收到一个要送给 xxx 的信时，它会依据 aliases档的内容送给另一个使用者。这个功能可以创造一个只有在信件系统内才有效的使用者。例如 mailing list 就会用到这个功能，在 mailinglist 中，我们可能会创造一个叫 <a href="mailto:redlinux@link.ece.uci.edu"><font color="#22229c">redlinux@link.ece.uci.edu</font></a> 的 mailinglist，但实际上并没有一个叫 redlinux 的使用者。实际 aliases 档的内容是将送给这个使用者的信都收给 mailing list 处理程式负责分送的工作。 <br /><br />/etc/aliases 是一个文字模式的档案，sendmail 需要一个二进位格式的 /etc/aliases.db。newaliases 的功能传是将 /etc/aliases 转换成一个 sendmail 所能了解的资料库。范例： <br /># newaliases <br /><br />下面命令会做相同的事， <br /># sendmail -bi <br /><br />相关命令: <br />mail, mailq, newaliases, sendmail <br /><br />” mail [返回] <br />名称：mail <br /><br />使用权限：所有使用者 <br /><br /><br />使用方式：mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] user1 [user 2 ...] <br /><br /><br />说明： <br />mail 不仅只是一个指令， mail 还是一个电子邮件程式，不过利用 mail 来读信的人应该很少吧！对于系统管理者来说 mail 就很有用，因为管理者可以用 mail 写成 script ，定期寄一些备忘录提醒系统的使用者。 <br /><br /><br />参数： <br />i 忽略 tty 的中断讯号。 (interrupt) <br />I 强迫设成互动模式。 (Interactive) <br />v 列印出讯息，例如送信的地点、状态等等。 (verbose) <br />n 不读入 mail.rc 设定档。 <br />s 邮件标题。 <br />c cc 邮件地址。 <br />b bcc 邮件地址。 <br /><br /><br />范例： <br /><br /><br />将信件送给一个或以上的电子邮件地址，由于没有加入其他的选项，使用者必须输入标题与信件的内容等。而 user2 没有主机位置，就会送给邮件伺服器的 user2 使用者。 <br /><br /><br /><br />mail <a href="mailto:user1@email.addr"><font color="#22229c">user1@email.addr</font></a>ess <br />mail <a href="mailto:user1@email.addr"><font color="#22229c">user1@email.addr</font></a>ess user2 <br /><br /><br /><br />将 mail.txt 的内容寄给 user2 同时 cc 给 user1 。如果将这一行指令设成 cronjob 就可以定时将备忘录寄给系统使用者。 <br /><br />mail -s 标题 -c user1 user2 &lt; mail.txt <br /><br /><br /><br />指令：mesg <br />使用权限 : 所有使用者 <br /><br />使用方式 : mesg [y|n] <br /><br />说明 ： 决定是否允许其他人传讯息到自己的终端机介面 <br /><br /><br />把计  <br /><br />y : 允许讯息传到终端机介面上。 <br />n : 不允许讯息传到终端机介面上 。 <br />如果没有设定，则讯息传递与否则由终端机界面目前状态而定。 <br /><br />例子 : <br />改变目前讯息设定，改成不允许讯息传到终端机介面上 : <br />mesg n <br /><br /><br />与 mesg 相关的指令有： talk，write，wall。 <br /><br /><br />名称：/etc/aliases <br />使用权限：系统管理者 <br />使用方式： newaliases <br />说明： <br />sendmail 会使用一个在 /etc/aliases 中的档案做使用者名称转换的动作。当 sendmail 收到一个要送给 xxx 的信时，它会依据 aliases档的内容送给另一个使用者。这个功能可以创造一个只有在信件系统内才有效的使用者。例如 mailing list 就会用到这个功能，在 mailinglist 中，我们可能会创造一个叫 <a href="mailto:redlinux@link.ece.uci.edu"><font color="#22229c">redlinux@link.ece.uci.edu</font></a> 的 mailinglist，但实际上并没有一个叫 redlinux 的使用者。实际 aliases 档的内容是将送给这个使用者的信都收给 mailing list 处理程式负责分送的工作。 <br /><br />/etc/aliases 是一个文字模式的档案，sendmail 需要一个二进位格式的 /etc/aliases.db。newaliases 的功能传是将 /etc/aliases 转换成一个 sendmail 所能了解的资料库。 <br /><br />参数：没有任何参数。 范例： <br /># newaliases <br /><br />下面命令会做相同的事， <br /># sendmail -bi <br /><br />相关命令: <br />mail, mailq, newaliases, sendmail <br /><br /><br /><br />名称 : talk <br />使用权限 : 所有使用者 <br /><br />使用方式 : <br /><br />talk person [ttyname] <br />说明 : 与其他使用者对谈 <br /><br />把计 : <br /><br />person : 预备对谈的使用者帐号，如果该使用者在其他机器上，则可输入 <a href="mailto:person@machine.name"><font color="#22229c">person@machine.name</font></a><br />ttyname : 如果使用者同时有两个以上的 tty 连线，可以自行选择合适的 tty 传讯息 <br /><br />例子.1 : <br /><br />与现在机器上的使用者Rollaend对谈，此时 Rollaend 只有一个连线 : <br />talk Rollaend <br /><br /><br />接下来就是等Rollaend回应，若Rollaend接受，则Rollaend输入 `talk jzlee`即可开始对谈，结束请按 ctrl+c <br /><br />例子.2 :与linuxfab.cx上的使用者Rollaend对谈，使用pts/2来对谈 : <br />talk <a href="mailto:Rollaend@linuxfab.cx"><font color="#22229c">Rollaend@linuxfab.cx</font></a> pts/2<br /><br /><br />接下来就是等Rollaend回应，若Rollaend接受，则Rollaend输入 `talk <a href="mailto:jzlee@jzlee.home"><font color="#22229c">jzlee@jzlee.home</font></a>`即可开始对谈，结束请按 ctrl+c <br /><br />注意 : 若萤幕的字会出现不正常的字元，试着按 ctrl+l 更新萤幕画面。 <br /><br /><br />名称 : wall <br />使用权限 : 所有使用者 <br /><br />使用方式 : <br /><br />wall [ message ] <br />使用说明： <br />wall 会将讯息传给每一个 mesg 设定为 yes 的上线使用者。当使用终端机介面做为标准传入时, 讯息结束时需加上 EOF (通常用 Ctrl+D) <br /><br />例子 : <br /><br />传讯息"hi" 给每一个使用者 : <br />wall hi <br /><br /><br /><br /><br />名称 : write <br />使用权限 : 所有使用者 <br /><br />使用方式 : <br /><br />write user [ttyname] <br />说明 : 传讯息给其他使用者 <br /><br />把计 : <br /><br />user : 预备传讯息的使用者帐号 <br />ttyname : 如果使用者同时有两个以上的 tty 连线，可以自行选择合适的 tty 传讯息 <br /><br />例子.1 : <br /><br />传讯息给 Rollaend，此时 Rollaend 只有一个连线 : <br />write Rollaend <br /><br /><br />接下来就是将讯息打上去，结束请按 ctrl+c <br /><br />例子.2 :传讯息给 Rollaend，Rollaend 的连线有 pts/2，pts/3 : <br />write Rollaend pts/2<br /><br /><br />接下来就是将讯息打上去，结束请按 ctrl+c <br /><br />注意 : 若对方设定 mesg n，则此时讯席将无法传给对方 <br /><br />名称：kill <br />使用权限：所有使用者 <br /><br />使用方式： <br /><br />kill [ -s signal | -p ] [ -a ] pid ... <br />kill -l [ signal ] <br />说明：kill 送出一个特定的信号 (signal) 给行程 id 为 pid 的行程根据该信号而做特定的动作, 若没有指定, 预设是送出终止 (TERM) 的信号 <br />把计 <br /><br />-s (signal) : 其中可用的讯号有 HUP (1), KILL (9), TERM (15), 分别代表着重跑, 砍掉, 结束; 详细的信号可以用 kill -l <br />-p : 印出 pid , 并不送出信号 <br />-l (signal) : 列出所有可用的信号名称 <br />范例： <br /><br />将 pid 为 323 的行程砍掉 (kill) : <br />kill -9 323 <br /><br />将 pid 为 456 的行程重跑 (restart) : <br />kill -HUP 456 <br /><br /><br /><br /><br />名称：nice <br />使用权限：所有使用者 <br /><br />使用方式：nice [-n adjustment] [-adjustment] [--adjustment=adjustment] [--help] [--version] [command [arg...]] <br /><br />说明：以更改过的优先序来执行程式, 如果未指定程式, 则会印出目前的排程优先序, 内定的 adjustment 为 10, 范围为 -20 (最高优先序) 到 19 (最低优先序) <br /><br /><br />把计 <br /><br />-n adjustment, -adjustment, --adjustment=adjustment 皆为将该原有优先序的增加 adjustment <br />--help 显示求助讯息 <br />--version 显示版本资讯 <br />范例： <br />将 ls 的优先序加 1 并执行 : <br />nice -n 1 ls <br /><br />将 ls 的优先序加 10 并执行 : <br />nice ls将 ls 的优先序加 10 并执行 <br /><br />注意 : 优先序 (priority) 为作业系统用来决定 CPU 分配的参数，Linux 使用『回合制(round-robin)』的演算法来做 CPU 排程，优先序越高，所可能获得的 CPU时间就越多。 <br /><br /><br /><br />名称：ps <br />使用权限：所有使用者 <br />使用方式：ps [options] [--help] <br />说明：显示瞬间行程 (process) 的动态 <br />参数： <br />ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义 <br />-A 列出所有的行程 <br />-w 显示加宽可以显示较多的资讯 <br />-au 显示较详细的资讯 <br />-aux 显示所有包含其他使用者的行程 <br /><br />au(x) 输出格式 : <br /><br />USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND <br />USER: 行程拥有者 <br />PID: pid <br />%CPU: 占用的 CPU 使用率 <br />%MEM: 占用的记忆体使用率 <br />VSZ: 占用的虚拟记忆体大小 <br />RSS: 占用的记忆体大小 <br />TTY: 终端的次要装置号码 (minor device number of tty) <br />STAT: 该行程的状态: <br />D: 不可中断的静止 (通悸□□缜b进行 I/O 动作) <br />R: 正在执行中 <br />S: 静止状态 <br />T: 暂停执行 <br />Z: 不存在但暂时无法消除 <br />W: 没有足够的记忆体分页可分配 <br />&lt;: 高优先序的行程 <br />N: 低优先序的行程 <br />L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O) <br />START: 行程开始时间 <br />TIME: 执行的时间 <br />COMMAND:所执行的指令 <br /><br />范例： <br /><br />ps <br />PID TTY TIME CMD <br />2791 ttyp0 00:00:00 tcsh <br />3092 ttyp0 00:00:00 ps <br />% ps -A <br />PID TTY TIME CMD <br />1 ? 00:00:03 init <br />2 ? 00:00:00 kflushd <br />3 ? 00:00:00 kpiod <br />4 ? 00:00:00 kswapd <br />5 ? 00:00:00 mdrecoveryd <br />....... <br />% ps -aux <br />USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND <br />root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3] <br />root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd] <br />root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod] <br />root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd] <br />........ <br /><br /><br /><br />名称：pstree <br />使用权限：所有使用者 <br />使用方式： <br />pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user] <br />pstree -V <br />说明：将所有行程以树状图显示, 树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root) ,如果有指定使用者 id , 则树状图会只显示该使用者所拥有的行程 <br />参数： <br />-a 显示该行程的完整指令及参数, 如果是被记忆体置换出去的行程则会加上括号 <br />-c 如果有重覆的行程名, 则分开列出 (预设值是会在前面加上 * <br />范例： <br /><br />pstree <br /><br />init-+-amd <br />|-apmd <br />|-atd <br />|-httpd---10*[httpd] <br />%pstree -p <br />init(1)-+-amd(447) <br />|-apmd(105) <br />|-atd(339) <br />%pstree -c <br />init-+-amd <br />|-apmd <br />|-atd <br />|-httpd-+-httpd <br />| |-httpd <br />| |-httpd <br />| |-httpd <br />.... <br /><br /><br /><br />名称：renice <br />使用权限：所有使用者 <br /><br />使用方式：renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...] <br /><br />说明：重新指定一个或多个行程(Process)的优先序(一个或多个将根据所下的参数而定) <br /><br />把计 <br /><br />-p pid 重新指定行程的 id 为 pid 的行程的优先序 <br />-g pgrp 重新指定行程群组(process group)的 id 为 pgrp 的行程 (一个或多个) 的优先序 <br />-u user 重新指定行程拥有者为 user 的行程的优先序 <br />范例： <br />将行程 id 为 987 及 32 的行程与行程拥有者为 daemon 及 root 的优先序号码加 1 : <br />renice +1 987 -u daemon root -p 32 <br /><br />注意 : 每一个行程(Process)都有一个唯一的 (unique) id <br /><br /><br /><br />名称：top <br />使用权限：所有使用者 <br /><br />使用方式：top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] <br /><br />说明：即时显示 process 的动态 <br /><br />把计 <br /><br />d : 改变显示的更新速度，或是在交谈式指令列( interactive command)按 s <br />q : 没有任何延迟的显示速度，如果使用者是有 superuser 的权限，则 top 将会以最高的优先序执行 <br />c : 切换显示模式，共有两种模式，一是只显示执行档的名称，另一种是显示完整的路径与名称S : 累积模式，会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来 <br />s : 安全模式，将交谈式指令取消, 避免潜在的危机 <br />i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程 <br />n : 更新的次数，完成后将会退出 top <br />b : 批次档模式，搭配 "n" 参数一起使用，可以用来将 top 的结果输出到档案内 <br /><br />范例： <br />显示更新十次后退出 ; <br />top -n 10 <br /><br />使用者将不能利用交谈式指令来对行程下命令 : <br />top -s <br /><br />将更新显示二次的结果输入到名称为 top.log 的档案里 : <br />top -n 2 -b &lt; top.log <br /><br />名称：skill <br /><br />使用权限：所有使用者 <br /><br />使用方式： skill [signal to send] [options] 选择程序的规则 <br /><br />说明： <br /><br />送个讯号给正在执行的程序,预设的讯息为 TERM (中断) , 较常使用的讯息为 HUP , INT , KILL , STOP , CONT ,和 0 <br /><br />讯息有三种写法:分别为 -9 , -SIGKILL , -KILL , 可以使用 -l 或 -L 已列出可使用的讯息。 <br /><br />一般参数： <br /><br />-f 快速模式/尚未完成 <br /><br />-i 互动模式/ 每个动作将要被确认 <br /><br />-v 详细输出/ 列出所选择程序的资讯 <br /><br />-w 智能警告讯息/ 尚未完成 <br /><br />-n 没有动作/ 显示程序代号 <br /><br />参数：选择程序的规则可以是, 终端机代号,使用者名称,程序代号,命令名称。 <br /><br />-t 终端机代号 ( tty 或 pty ) <br /><br />-u 使用者名称 <br /><br />-p 程序代号 ( pid ) <br /><br />-c 命令名称 可使用的讯号: <br /><br />以下列出已知的讯号名称,讯号代号,功能。 <br /><br />名称 (代号) 功能/ 描述 <br /><br />ALRM 14 离开 <br /><br />HUP 1 离开 <br /><br />INT 2 离开 <br /><br />KILL 9 离开/ 强迫关闭 <br /><br />PIPE 13 离开 <br /><br />POLL 离开 <br /><br />PROF 离开 <br /><br />TERM 15 离开 <br /><br />USR1 离开 <br /><br />USR2 离开 <br /><br />VTALRM 离开 <br /><br />STKFLT 离开/ 只适用于i386, m68k, arm 和 ppc 硬体 <br /><br />UNUSED 离开/ 只适用于i386, m68k, arm 和 ppc 硬体 <br /><br />TSTP 停止 /产生与内容相关的行为 <br /><br />TTIN 停止 /产生与内容相关的行为 <br /><br />TTOU 停止 /产生与内容相关的行为 <br /><br />STOP 停止 /强迫关闭 <br /><br />CONT 从新启动 /如果在停止状态则从新启动,否则忽略 <br /><br />PWR 忽略 /在某些系统中会离开 <br /><br />WINCH 忽略 <br /><br />CHLD 忽略 <br /><br />ABRT 6 核心 <br /><br />FPE 8 核心 <br /><br />ILL 4 核心 <br /><br />QUIT 3 核心 <br /><br />SEGV 11 核心 <br /><br />TRAP 5 核心 <br /><br />SYS 核心 /或许尚未实作 <br /><br />EMT 核心 /或许尚未实作 <br /><br />BUS 核心 /核心失败 <br /><br />XCPU 核心 /核心失败 <br /><br />XFSZ 核心 /核心失败 <br /><br />范例： <br /><br />停止所有在 PTY 装置上的程序 <br />skill -KILL -v pts/* <br /><br />停止三个使用者 user1 , user2 , user3 <br />skill -STOP user1 user2 user3 <br /><br /><br /><br />其他相关的命令: kill <br /><br /><br /><br />名称：expr <br /><br />使用权限：所有使用者 <br />### 字串长度 <br /><br />shell&gt;&gt; expr length "this is a test" <br />14 <br /><br />### 数字商数 <br /><br />shell&gt;&gt; expr 14 % 9 <br />5 <br /><br />### 从位置处抓取字串 <br /><br />shell&gt;&gt; expr substr "this is a test" 3 5 <br />is is <br /><br />### 数字串 only the first character <br /><br />shell&gt;&gt; expr index "testforthegame" e <br />2 <br /><br />### 字串真实重现 <br /><br />shell&gt;&gt; expr quote thisisatestformela <br />thisisatestformela <br /><br /><br /><br /><br />名称: tr <br /><br />### 1.比方说要把目录下所有的大写档名换为小写档名? <br /><br />似乎有很多方式，"tr"是其中一种: <br /><br />#!/bin/sh <br /><br />dir="/tmp/testdir"; <br />files=`find $dir -type f`; <br />for i in $files <br />do <br />dir_name=`dirname $i`; <br />ori_filename=`basename $i` <br />new_filename=`echo $ori_filename | tr [:upper:] [:lower:]` &gt; /dev/null; <br />#echo $new_filename; <br />mv $dir_name/$ori_filename $dir_name/$new_filename <br />done <br /><br /><br />### 2.自己试验中...lowercase to uppercase <br /><br />tr abcdef...[del] ABCDE...[del] <br />tr a-z A-Z <br />tr [:lower:] [:upper:] <br /><br />shell&gt;&gt; echo "this is a test" | tr a-z A-Z &gt; www <br />shell&gt;&gt; cat www <br />THIS IS A TEST <br /><br />### 3.去掉不想要的字串 <br /><br />shell&gt;&gt; tr -d this ### 去掉有关 t.e.s.t <br />this <br /><br />man <br />man <br />test <br />e <br /><br />### 4.取代字串 <br /><br />shell&gt;&gt; tr -s "this" "TEST" <br />this <br />TEST <br />th <br />TE <br /><br /><br /><br /><br />指令：clear <br />用途：清除萤幕用。 <br /><br />使用方法：在 console 上输入 clear。 <br /><br /><br />名称: reset, tset <br />使用方法: tset [-IQqrs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal] <br /><br />使用说明: <br /><br />reset 其实和 tset 是一同个命令，它的用途是设定终端机的状态。一般而言，这个命令会自动的从环境变数、命令列或是其它的组态档决定目前终端机的型态。如果指定型态是 ? 的话，这个程式会要求使用者输入终端机的型别。 <br /><br />由于这个程式会将终端机设回原始的状态，除了在 login 时使用外，当系统终端机因为程式不正常执行而进入一些奇怪的状态时，你也可以用它来重设终端机o 例如不小心把二进位档用 cat 指令进到终端机，常会有终端机不再回应键盘输入，或是回应一些奇怪字元的问题。此时就可以用 reset 将终端机回复至原始状态。选项说明: <br /><br /><br />-p <br />将终端机类别显示在萤幕上，但不做设定的动作。这个命令可以用来取得目前终端机的类别。 <br />-e ch <br />将 erase 字元设成 ch <br />-i ch <br />将中断字元设成 ch <br />-k ch <br />将删除一行的字元设成 ch <br />-I <br />不要做设定的动作，如果没有使用选项 -Q 的话，erase、中断及删除字元的目前值依然会送到萤幕上。 <br />-Q <br />不要显示 erase、中断及删除字元的值到萤幕上。 <br />-r <br />将终端机类别印在萤幕上。 <br />-s <br />将设定 TERM 用的命令用字串的型式送到终端机中，通常在 .login 或 .profile 中用 <br />范例: <br />让使用者输入一个终端机型别并将终端机设到该型别的预设状态。 <br /># reset ? <br /><br /><br /><br />将 erase 字元设定 control-h <br /># reset -e ^B <br /><br /><br /><br />将设定用的字串显示在萤幕上 <br /># reset -s <br />Erase is control-B (^B). <br />Kill is control-U (^U). <br />Interrupt is control-C (^C). <br />TERM=xterm; <br /><br />名称：compress <br /><br />使用权限：所有使用者 <br /><br /><br />使用方式：compress [-dfvcV] [-b maxbits] [file ...] <br /><br /><br />说明： <br />compress 是一个相当古老的 unix 档案压缩指令，压缩后的档案会加上一个 .Z 延伸档名以区别未压缩的档案，压缩后的档案可以以 uncompress 解压。若要将数个档案压成一个压缩档，必须先将档案 tar 起来再压缩。由于 gzip 可以产生更理想的压缩比例，一般人多已改用 gzip 为档案压缩工具。 <br /><br /><br />参数： <br />c 输出结果至标准输出设备（一般指荧幕） <br />f 强迫写入档案，若目的档已经存在，则会被覆盖 (force) <br />v 将程式执行的讯息印在荧幕上 (verbose) <br />b 设定共同字串数的上限，以位元计算，可以设定的值为 9 至 16 bits 。由于值越大，能使用的共同字串就 越多，压缩比例就越大，所以一般使用预设值 16 bits (bits) <br />d 将压缩档解压缩 <br />V 列出版本讯息 <br /><br /><br />范例： <br /><br /><br />将 source.dat 压缩成 source.dat.Z ，若 source.dat.Z 已经存在，内容则会被压缩档覆盖。 <br /><br /><br /><br />compress -f source.dat <br /><br /><br /><br />将 source.dat 压缩成 source.dat.Z ，并列印出压缩比例。 <br />-v 与 -f 可以一起使用 <br /><br /><br /><br />compress -vf source.dat <br /><br /><br /><br />将压缩后的资料输出后再导入 target.dat.Z 可以改变压缩档名。 <br /><br /><br /><br />compress -c source.dat &gt; target.dat.Z <br /><br /><br /><br />-b 的值越大，压缩比例就越大，范围是 9-16 ，预设值是 16 。 <br /><br /><br /><br />compress -b 12 source.dat <br /><br /><br /><br />将 source.dat.Z 解压成 source.dat ，若档案已经存在，使用者按 y 以确定覆盖档案，若使用 -df 程式则会自动覆盖档案。由于系统会自动加入 .Z 为延伸档名，所以 source.dat 会自动当作 source.dat.Z 处理。 <br /><br /><br /><br />compress -d source.dat <br />compress -d source.dat.Z <br /><br /><br /><br /><br />名称： lpd <br /><br />使用权限： 所有使用者 <br /><br />使用方式：lpd [-l] [#port] <br />lpd 是一个常驻的印表机管理程式，它会根据 /etc/printcap 的内容来管理本地或远端的印表机。/etc/printcap 中定义的每一个印表机必须在 /var/lpd 中有一个相对应的目录，目录中以 cf 开头的档案表示一个等待送到适当装置的印表工作。这个档案通常是由 lpr 所产生。 <br /><br />lpr 和 lpd 组成了一个可以离线工作的系统，当你使用 lpr 时，印表机不需要能立即可用，甚至不用存在。lpd 会自动监视印表机的状况，当印表机上线后，便立即将档案送交处理。这个得所有的应用程式不必等待印表机完成前一工作。 <br /><br />参数： <br /><br /><br />-l: 将一些除错讯息显示在标准输出上。 <br />#port: 一般而言，lpd 会使用 getservbyname 取得适当的 TCP/IP port，你可以使用这个参数强迫 lpd 使用指定的 port。 <br /><br />范例： <br />这个程式通常是由 /etc/rc.d 中的程式在系统启始阶段执行。 <br /><br /><br /><br />名称 lpq <br />-- 显示列表机贮列中未完成的工作 用法 <br /><br />lpq [l] [P] [user] <br /><br />说明 <br />lpq 会显示由 lpd 所管理的列表机贮列中未完成的项目。 <br /><br />范例 <br />范例 1. 显示所有在 lp 列表机贮列中的工作 <br /><br /><br /># lpq -PlpRank Owner Job Files Total Size1st root 238 (standard input) 1428646 bytes <br /><br /><br /><br /><br />相关函数 <br />lpr,lpc,lpd <br /><br /><br /><br />名称： lpr <br /><br />使用权限： 所有使用者 <br /><br />使用方式：lpr [ -P printer ] <br />将档案或是由标准输入送进来的资料送到印表机贮列之中，印表机管理程式 lpd 会在稍后将这个档案送给适当的程式或装置处理。lpr 可以用来将料资送给本地或是远端的主机来处理。 <br /><br />参数： <br /><br /><br />-p Printer: 将资料送至指定的印表机 Printer，预设值为 lp。 <br /><br />范例： <br />将 <a href="http://www.c/" target="_blank"><font color="#22229c">www.c</font></a> 和 kkk.c 送到印表机 lp。 <br />lpr -Plp <a href="http://www.c/" target="_blank"><font color="#22229c">www.c</font></a> kkk.c <br /><br /><br /><br /><br />名称: lprm <br />-- 将一个工作由印表机贮列中移除 用法 <br /><br />/usr/bin/lprm [P] [file...] <br /><br />说明 <br />尚未完成的印表机工作会被放在印表机贮列之中，这个命令可用来将常未送到印表机的工作取消。由于每一个印表机都有一个独立的贮列，你可以用 -P 这个命令设定想要作用的印列机。如果没有设定的话，会使用系统预设的印表机。 <br /><br />这个命令会检查使用者是否有足够的权限删除指定的档案，一般而言，只有档案的拥有者或是系统管理员才有这个权限。 <br /><br />范例 <br />将印表机 hpprinter 中的第 1123 号工作移除 <br /><br /><br />lprm -Phpprinter 1123 <br /><br /><br />将第 1011 号工作由预设印表机中移除 <br /><br /><br />lprm 1011 <br /><br /><br /><br /><br />名称： fdformat <br /><br />使用权限： 所有使用者 <br /><br />使用方式：fdformat [-n] device <br /><br />使用说明 : <br />对指定的软碟机装置进行低阶格式化。使用这个指令对软碟格式化的时候，最好指定像是下面的装置： <br /><br /><br />/dev/fd0d360 磁碟机 A: ，磁片为 360KB 磁碟 <br />/dev/fd0h1440 磁碟机 A: ，磁片为 1.4MB 磁碟 <br />/dev/fd1h1200 磁碟机 B: ，磁片为 1.2MB 磁碟 <br />如果使用像是 /dev/fd0 之类的装置，如果里面的磁碟不是标准容量，格式化可能会失败。在这种情况之下，使用者可以用 setfdprm 指令先行指定必要参数。 <br /><br />参数： <br /><br /><br />-n 关闭确认功能。这个选项会关闭格式化之后的确认步骤。 <br /><br />范例： <br /><br />fdformat -n /dev/fd0h1440 <br /><br />将磁碟机 A 的磁片格式化成 1.4MB 的磁片。并且省略确认的步骤。 <br /><br /><br /><br />名称： mformat <br /><br />使用权限： 所有使用者 <br /><br />使用方式： <br /><br />mformat [-t cylinders] [-h heads] [-s sectors] [-l volume_label] [-F] [-I fsVer-sion] [-S sizecode] [-2 sectors_on_track_0] [-M software_sector_size] [-a] [-X] [-C] [-H hidden_sectors] [-r root_sectors] [-B boot_sector] [-0 rate_on_track_0] [-A rate_on_other_tracks] [-1] [-k] drive: <br /><br />在已经做过低阶格式化的磁片上建立 DOS 档案系统。如果在编译 mtools 的时候把 USE_2M 的参数打开，部分与 2M 格式相关的参数就会发生作用。否则这些参数（像是 S,2,1,M）不会发生作用。 <br /><br />参数： <br /><br />-t 磁柱（synlider）数 <br />-h 磁头（head）数 <br />-s 每一磁轨的磁区数 <br />-l 标签 <br />-F 将磁碟格式化为 FAT32 格式，不过这个参数还在实验中。 <br />-I 设定 FAT32 中的版本号。这当然也还在实验中。 <br />-S 磁区大小代码，计算方式为 sector = 2^(大小代码+7) <br />-c 磁丛（cluster）的磁区数。如果所给定的数字会导致磁丛数超过 FAT 表的限制，mformat 会自动放大磁区数。 <br />-s <br />-M 软体磁区大小。这个数字就是系统回报的磁区大小。通常是和实际的大小相同。 <br />-a 如果加上这个参数，mformat 会产生一组 Atari 系统的序号给这块软碟。 <br />-X 将软碟格式化成 XDF 格式。使用前必须先用 xdfcopy 指令对软碟作低阶格式化的动作。 <br />-C 产生一个可以安装 MS-DOS 档案系统的磁碟影像档（disk image）。当然对一个实体磁碟机下这个参数是没有意义的。 <br />-H 隐藏磁区的数目。这通常适用在格式化硬碟的分割区时，因为通常一个分割区的前面还有分割表。这个参数未经测试，能不用就不用。 <br />-n 磁碟序号 <br />-r 根目录的大小，单位是磁区数。这个参数只对 FAT12 和 FAT16 有效。 <br />-B 使用所指定的档案或是设备的开机磁区做为这片磁片或分割区的开机磁区。当然当中的硬体参数会随之更动。 <br />-k 尽量保持原有的开机磁区。 <br />-0 第 0 轨的资料传输率 <br />-A 第 0 轨以外的资料传输率 <br />-2 使用 2m 格式 <br />-1 不使用 2m 格式 <br /><br />范例： <br />mformat a: <br /><br />这样会用预设值把 a: （就是 /dev/fd0）里的磁碟片格式化。 <br /><br /><br /><br />名称： mkdosfs <br /><br />使用权限： 所有使用者 <br /><br />使用方式： mkdosfs [ -c | -l filename ] <br />[ -f number_of_FATs ] <br />[ -F FAT_size ] <br />[ -i volume_id ] <br />[ -m message_file ] <br />[ -n volume_name ] <br />[ -r root_dir_entry ] <br />[ -s sector_per_cluster ] <br />[ -v ] <br />device <br />[ block_count ] <br /><br /><br /><br />说明： 建立 DOS 档案系统。 device 指你想要建立 DOS 档案系统的装置代号。像是 /dev/hda1 等等。 block_count 则是你希望配置的区块数。如果 block_count 没有指定则系统会自动替你计算符合该装置大小的区块数。 <br /><br />参数： <br /><br /><br />-c 建立档案系统之前先检查是否有坏轨。 <br />-l 从得定的档案中读取坏轨记录。 <br />-f 指定档案配置表（FAT , File Allocation Table)的数量。预设值为 2 。目前 Linux 的 FAT 档案系统不支援超过 2 个 FAT 表。通常这个不需要改。 <br />-F 指定 FAT 表的大小，通常是 12 或是 16 个位元组。12 位元组通常用于磁碟片，16 位元组用于一般硬碟的分割区，也就是所谓的 FAT16 格式。这个值通常系统会自己选定适当的值。在磁碟片上用 FAT16 通常不会发生作用，反之在硬碟上用 FAT12 亦然。 <br />-i 指定 Volume ID。一般是一个 4 个位元组的数字，像是 2e203a47 。如果不给系统会自己产生。 <br />-m 当使用者试图用这片磁片或是分割区开机，而上面没有作业系统时，系统会给使用者一段警告讯息。这个参数就是用来变更这个讯息的。你可以先用档案编辑好，然后用这个参数指定，或是用 <br />-m - <br />这样系统会要求你直接输入这段文字。要特别注意的是，档案里的字串长度不要超过 418 个字，包括展开的跳栏符号（TAB）和换行符号（换行符号在 DOS 底下算两个字元！） <br />-n 指定 Volume Name，就是磁碟标签。如同在 DOS 底下的 format 指令一样，给不给都可以。没有预设值。 <br />-r 指定根目录底下的最大档案数。这里所谓的档案数包括目录。预设值是在软碟上是 112 或是 224 ，在硬碟上是 512。没事不要改这个数字。 <br />-s 每一个磁丛（cluster）的磁区数。必须是 2 的次方数。不过除非你知道你在作什么，这个值不要乱给。 <br />-v 提供额外的讯息 <br /><br />范例： <br />mkdosfs -n Tester /dev/fd0 将 A 槽里的磁碟片格式化为 DOS 格式，并将标签设为 Tester</div>
<img src ="http://www.blogjava.net/HotJava/aggbug/83046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/HotJava/" target="_blank">HotJava</a> 2006-11-23 15:02 <a href="http://www.blogjava.net/HotJava/archive/2006/11/23/83046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用DES加密算法保护Java源代码 </title><link>http://www.blogjava.net/HotJava/archive/2006/11/03/78982.html</link><dc:creator>HotJava</dc:creator><author>HotJava</author><pubDate>Fri, 03 Nov 2006 12:11:00 GMT</pubDate><guid>http://www.blogjava.net/HotJava/archive/2006/11/03/78982.html</guid><wfw:comment>http://www.blogjava.net/HotJava/comments/78982.html</wfw:comment><comments>http://www.blogjava.net/HotJava/archive/2006/11/03/78982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/HotJava/comments/commentRss/78982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/HotJava/services/trackbacks/78982.html</trackback:ping><description><![CDATA[
		<p>
				<span class="span">作者：李琴 李家明   </span>
				<span class="span">出处：计算机与信息技术</span>
		</p>
		<p> <strong>摘 要</strong>：本文首先分析了Java源代码需要加密的原因，简要介绍了<a class="bluekey" href="http://www.yesky.com/key/2018/162018.html" target="_blank">DES</a>算法及Java密码体系和Java密码扩展，最后说明了利用DES<a class="bluekey" href="http://www.yesky.com/key/2719/172719.html" target="_blank">加密算法</a>保护Java源代码的方法及步骤。<br /><br />　　<strong>关键词</strong> Java 加密 <a class="bluekey" href="http://www.yesky.com/key/4888/164888.html" target="_blank">DES算法</a><br /><br />　　Java语言是一种非常适用于<a class="bluekey" href="http://www.yesky.com/key/3847/8847.html" target="_blank">网络编程</a>的语言，它的基本结构与C++极为相似，但抛弃了<a class="bluekey" href="http://www.yesky.com/key/4630/39630.html" target="_blank">C/C</a>++中指针等内容，同时它吸收了Smalltalk、C++面向对象的编程思想。它具有简单性、鲁棒性、可移植性、动态性等特点。这些特点使得Java成为跨平台应用开发的一种规范，在世界范围内广泛流传。<br /><br />　　<strong>加密Java源码的原因</strong><br /><br />　　Java源代码经过编译以后在JVM中执行。由于JVM界面是完全透明的，<a class="bluekey" href="http://www.yesky.com/key/579/115579.html" target="_blank">Java类</a>文件能够很容易通过<a class="bluekey" href="http://www.yesky.com/key/323/85323.html" target="_blank">反编译</a>器重新转换成源代码。因此，所有的算法、类文件等都可以以源代码的形式被公开，使得软件不能受到保护，为了保护产权，一般可以有以下几种方法：<br /><br />　　（1）"模糊"类文件，加大反<a class="bluekey" href="http://www.yesky.com/key/1922/91922.html" target="_blank">编译器</a>反编译源代码文件的难度。然而，可以修改反编译器，使之能够处理这些模糊类文件。所以仅仅依赖"模糊类文件"来保证代码的安全是不够的。<br /><br />　　（2）流行的加密工具对<a class="bluekey" href="http://www.yesky.com/key/1862/161862.html" target="_blank">源文件</a>进行加密，比如<a class="bluekey" href="http://www.yesky.com/key/1569/146569.html" target="_blank">PGP</a>（<a class="bluekey" href="http://www.yesky.com/key/2510/107510.html" target="_blank">Pretty</a> Good Privacy）或GPG（<a class="bluekey" href="http://www.yesky.com/key/3649/118649.html" target="_blank">GNU</a> Privacy Guard）。这时，最终用户在运行应用之前必须先进行<a class="bluekey" href="http://www.yesky.com/key/2702/77702.html" target="_blank">解密</a>。但解密之后，最终用户就有了一份不加密的类文件，这和事先不进行加密没有什么差别。<br /><br />　　（3）加密类文件，在运行中JVM用定制的类装载器（Class <a class="bluekey" href="http://www.yesky.com/key/834/160834.html" target="_blank">Loader</a>）解密类文件。Java运行时装入字节码的机制隐含地意味着可以对字节码进行修改。JVM每次装入类文件时都需要一个称为ClassLoader的对象，这个对象负责把新的类装入正在运行的JVM。JVM给ClassLoader一个包含了待装入类（例如java.lang.Object）名字的字符串，然后由ClassLoader负责找到类文件，装入原始数据，并把它转换成一个Class对象。<br /><br />　　用户下载的是加密过的类文件，在加密类文件装入之时进行解密，因此可以看成是一种即时解密器。由于解密后的字节码文件永远不会保存到<a class="bluekey" href="http://www.yesky.com/key/408/15408.html" target="_blank">文件系统</a>，所以<a class="bluekey" href="http://www.yesky.com/key/1907/166907.html" target="_blank">窃密</a>者很难得到解密后的代码。 <br /><br />　　由于把原始字节码转换成Class对象的过程完全由系统负责，所以创建定制ClassLoader对象其实并不困难，只需先获得原始数据，接着就可以进行包含解密在内的任何转换。<br /><br />　　<strong>Java密码体系和Java密码扩展</strong><br /><br />　　Java密码体系(JCA)和Java密码扩展(JCE)的设计目的是为Java提供与实现无关的加密函数API。它们都用factory方法来创建类的例程，然后把实际的加密函数委托给提供者指定的底层引擎,引擎中为类提供了服务提供者接口在Java中实现数据的加密/解密，是使用其内置的JCE(Java加密扩展)来实现的。<a class="bluekey" href="http://www.yesky.com/key/1860/161860.html" target="_blank">Java开发</a>工具集1.1为实现包括<a class="bluekey" href="http://www.yesky.com/key/2343/7343.html" target="_blank">数字签名</a>和信息摘要在内的加密功能，推出了一种基于供应商的新型灵活应用编程接口。Java密码体系结构支持供应商的互操作,同时支持硬件和软件实现。<br /><br />　　Java密码学<a class="bluekey" href="http://www.yesky.com/key/2834/172834.html" target="_blank">结构设计</a>遵循两个原则:<br /><br />　　(1)算法的独立性和可靠性。<br /><br />　　(2)实现的独立性和相互作用性。<br /><br />　　算法的独立性是通过定义密码服务类来获得。用户只需了解<a class="bluekey" href="http://www.yesky.com/key/3430/173430.html" target="_blank">密码算法</a>的概念,而不用去关心如何实现这些概念。实现的独立性和相互作用性通过密码服务提供器来实现。密码服务提供器是实现一个或多个密码服务的一个或多个程序包。软件开发商根据一定接口,将各种算法实现后,打包成一个提供器,用户可以安装不同的提供器。安装和配置提供器,可将包含提供器的<a class="bluekey" href="http://www.yesky.com/key/2809/32809.html" target="_blank">ZIP</a>和<a class="bluekey" href="http://www.yesky.com/key/1290/1290.html" target="_blank">JAR</a>文件放在<a class="bluekey" href="http://www.yesky.com/key/907/5907.html" target="_blank">CLASSPATH</a>下,再编辑Java安全属性文件来设置定义一个提供器。Java运行环境Sun版本时, 提供一个缺省的提供器Sun。<br /><br />　　下面介绍<a class="bluekey" href="http://www.yesky.com/key/3186/213186.html" target="_blank">DES</a>算法及如何利用DES算法<a class="bluekey" href="http://www.yesky.com/key/3605/78605.html" target="_blank">加密和解密</a>类文件的步骤。<br /><br />　　<strong>DES算法简介</strong><br /><br />　　DES（<a class="bluekey" href="http://www.yesky.com/key/65/160065.html" target="_blank">Data</a> Encryption <a class="bluekey" href="http://www.yesky.com/key/2558/102558.html" target="_blank">Standard</a>）是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个：<a class="bluekey" href="http://www.yesky.com/key/697/160697.html" target="_blank">Key</a>、<a class="bluekey" href="http://www.yesky.com/key/4223/124223.html" target="_blank">Data</a>、Mode。其中<a class="bluekey" href="http://www.yesky.com/key/2043/162043.html" target="_blank">Key</a>为8个字节共64位，是DES算法的工作密钥；Data也为8个字节64位，是要被加密或被解密的数据；Mode为DES的工作方式，有两种：加密或解密。<br /><br />　　DES算法工作流程如下：若Mode为加密模式，则利用Key 对数据Data进行加密， 生成Data的密码形式（64位）作为DES的输出结果；如Mode为解密模式，则利用Key对密码形式的数据Data进行解密，还原为Data的明码形式（64位）作为DES的输出结果。在<a class="bluekey" href="http://www.yesky.com/key/1686/166686.html" target="_blank">通信网</a>络的两端，双方约定一致的Key，在通信的源点用Key对核心数据进行DES加密，然后以密码形式在公共通信网（如<a class="bluekey" href="http://www.yesky.com/key/3785/153785.html" target="_blank">电话网</a>）中传输到<a class="bluekey" href="http://www.yesky.com/key/3953/158953.html" target="_blank">通信网络</a>的终点，数据到达目的地后，用同样的Key对密码数据进行解密，便再现了明码形式的核心数据。这样，便保证了核心数据在公共通信网中传输的安全性和可靠性。<br /><br />　　也可以通过定期在通信网络的源端和目的端同时改用新的Key，便能更进一步提高数据的保密性。<br /><strong>利用DES算法加密的步骤<br /><br /></strong>　　（1）生成一个安全密钥。在加密或解密任何数据之前需要有一个密钥。密钥是随同被加密的应用程序一起发布的一段数据，密钥代码如下所示。<br /><br />　　【生成一个密钥代码】<br /></p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 生成一个可信任的随机数源</span>
						<span style="COLOR: #008000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">Secure Random sr </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> SecureRandom();<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 为我们选择的DES算法生成一个KeyGenerator对象</span>
						<span style="COLOR: #008000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">KeyGenerator kg </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> KeyGenerator.getInstance (</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">DES</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000"> );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />Kg.init (sr);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 生成密钥</span>
						<span style="COLOR: #008000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">Secret Key key </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> kg.generateKey();<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 将密钥数据保存为文件供以后使用，其中key Filename为保存的文件名</span>
						<span style="COLOR: #008000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">Util.writeFile (key Filename, key.getEncoded () );</span>
				</div>
		</div>
		<br />2）加密数据。得到密钥之后，接下来就可以用它加密数据。如下所示。<br /><br />　　【用密钥加密原始数据】<br /><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 产生一个可信任的随机数源</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">SecureRandom sr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> SecureRandom();<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从密钥文件key Filename中得到密钥数据</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte rawKeyData [] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Util.readFile (key Filename);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 从原始密钥数据创建DESKeySpec对象</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">DESKeySpec dks </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DESKeySpec (rawKeyData);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建一个密钥工厂，然后用它把DESKeySpec转换成Secret Key对象</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">SecretKeyFactory key Factory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> SecretKeyFactory.getInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DES</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />Secret Key key </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> keyFactory.generateSecret( dks );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Cipher对象实际完成加密操作</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Cipher cipher </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Cipher.getInstance( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DES</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 用密钥初始化Cipher对象</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">cipher.init( Cipher.ENCRYPT_MODE, key, sr );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 通过读类文件获取需要加密的数据</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte data [] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Util.readFile (filename);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 执行加密操作</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte encryptedClassData [] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> cipher.doFinal(data );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 保存加密后的文件，覆盖原有的类文件。 </span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Util.writeFile( filename, encryptedClassData );</span></div></div>（3）解密数据。运行经过加密的程序时，ClassLoader分析并解密类文件。操作步骤如下所示。 <br /><br />　　【用密钥解密数据】<br /><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 生成一个可信任的随机数源</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">SecureRandom sr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> SecureRandom();<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 从密钥文件中获取原始密钥数据</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte rawKeyData[] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Util.readFile( keyFilename );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建一个DESKeySpec对象</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">DESKeySpec dks </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DESKeySpec (rawKeyData);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建一个密钥工厂，然后用它把DESKeySpec对象转换成Secret Key对象 </span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">SecretKeyFactory key Factory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> SecretKeyFactory.getInstance( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DES</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />SecretKey key </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> keyFactory.generateSecret( dks );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Cipher对象实际完成解密操作</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Cipher cipher </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Cipher.getInstance( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DES</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 用密钥初始化Cipher对象</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Cipher.init( Cipher.DECRYPT_MODE, key, sr );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 获得经过加密的数据</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte encrypted Data [] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Util.readFile (Filename);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">执行解密操作</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Byte decryptedData [] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> cipher.doFinal( encryptedData );<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 然后将解密后的数据转化成原来的类文件。</span></div></div>将上述代码与自定义的类装载器结合就可以做到边解密边运行，从而起到保护源代码的作用。<br /><br />　　<strong><a class="bluekey" href="http://www.yesky.com/key/4257/29257.html" target="_blank">结束语</a></strong><br /><br />　　加密/解密是数据传输中保证数据安全性和完整性的常用方法，Java语言因其平台无关性，在Internet上的应用非常之广泛。使用DES算法加密Java源码在一定程度上能保护软件的产权。<br /><img src ="http://www.blogjava.net/HotJava/aggbug/78982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/HotJava/" target="_blank">HotJava</a> 2006-11-03 20:11 <a href="http://www.blogjava.net/HotJava/archive/2006/11/03/78982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate性能优化 </title><link>http://www.blogjava.net/HotJava/archive/2006/11/02/78782.html</link><dc:creator>HotJava</dc:creator><author>HotJava</author><pubDate>Thu, 02 Nov 2006 13:35:00 GMT</pubDate><guid>http://www.blogjava.net/HotJava/archive/2006/11/02/78782.html</guid><wfw:comment>http://www.blogjava.net/HotJava/comments/78782.html</wfw:comment><comments>http://www.blogjava.net/HotJava/archive/2006/11/02/78782.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/HotJava/comments/commentRss/78782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/HotJava/services/trackbacks/78782.html</trackback:ping><description><![CDATA[
		<p>本文依照HIBERNATE帮助文档，一些网络书籍及项目经验整理而成，只提供要点和思路，具体做法可以留言探讨，或是找一些更详细更有针对性的资料。 </p>
		<p>　　初用HIBERNATE的人也许都遇到过性能问题，实现同一功能，用HIBERNATE与用JDBC性能相差十几倍很正常，如果不及早调整，很可能影响整个项目的进度。</p>
		<p>　　大体上，对于HIBERNATE性能调优的主要考虑点如下:</p>
		<p>　　Ø 数据库设计调整</p>
		<p>　　Ø HQL优化</p>
		<p>　　Ø API的正确使用(如根据不同的业务类型选用不同的集合及查询API)</p>
		<p>　　Ø 主配置参数(日志，查询缓存，fetch_size, batch_size等)</p>
		<p>　　Ø 映射文件优化(ID生成策略，二级缓存，延迟加载，关联优化)</p>
		<p>　　Ø 一级缓存的管理</p>
		<p>　　Ø 针对二级缓存，还有许多特有的策略</p>
		<p>　　Ø 事务控制策略。</p>
		<p>　　1、 数据库设计</p>
		<p>　　a) 降低关联的复杂性</p>
		<p>　　b) 尽量不使用联合主键</p>
		<p>　　c) ID的生成机制，不同的数据库所提供的机制并不完全一样</p>
		<p>　　d) 适当的冗余数据，不过分追求高范式</p>
		<p>　　2、 HQL优化</p>
		<p>　　HQL如果抛开它同HIBERNATE本身一些缓存机制的关联，HQL的优化技巧同普通的SQL优化技巧一样，可以很容易在网上找到一些经验之谈。</p>
		<p>　　3、 主配置</p>
		<p>　　a) 查询缓存，同下面讲的缓存不太一样，它是针对HQL语句的缓存，即完全一样的语句再次执行时可以利用缓存数据。但是，查询缓存在一个交易系统(数据变更频繁，查询条件相同的机率并不大)中可能会起反作用:它会白白耗费大量的系统资源但却难以派上用场。</p>
		<p>　　b) fetch_size，同JDBC的相关参数作用类似，参数并不是越大越好，而应根据业务特征去设置</p>
		<p>　　c) batch_size同上。</p>
		<p>　　d) 生产系统中，切记要关掉SQL语句<a class="bluekey" href="http://oa.yesky.com/" target="_blank">打印</a>。</p>
		<p>　　4、 缓存</p>
		<p>　　a) 数据库级缓存:这级缓存是最高效和安全的，但不同的数据库可管理的层次并不一样，比如，在ORACLE中，可以在建表时指定将整个表置于缓存当中。</p>
		<p>　　b) SESSION缓存:在一个HIBERNATE SESSION有效，这级缓存的可干预性不强，大多于HIBERNATE自动管理，但它提供清除缓存的方法，这在大批量增加/更新操作是有效的。比如，同时增加十万条记录，按常规方式进行，很可能会发现OutofMemeroy的异常，这时可能需要手动清除这一级缓存:Session.evict以及Session.clear</p>
		<p>　　c) 应用缓存:在一个SESSIONFACTORY中有效，因此也是优化的重中之重，因此，各类策略也考虑的较多，在将数据放入这一级缓存之前，需要考虑一些前提条件:</p>
		<p>　　i. 数据不会被第三方修改(比如，是否有另一个应用也在修改这些数据?)</p>
		<p>　　ii. 数据不会太大</p>
		<p>　　iii. 数据不会频繁更新(否则使用CACHE可能适得其反)</p>
		<p>　　iv. 数据会被频繁查询</p>
		<p>　　v. 数据不是关键数据(如涉及钱，安全等方面的问题)。</p>
		<p>　　缓存有几种形式，可以在映射文件中配置:read-only(只读，适用于很少变更的静态数据/历史数据)，nonstrict-read-write，read-write(比较普遍的形式，效率一般)，transactional(JTA中，且支持的缓存产品较少)</p>
		<p>　　d) 分布式缓存:同c)的配置一样，只是缓存产品的选用不同，在目前的HIBERNATE中可供选择的不多，oscache, jboss cache，目前的大多数项目，对它们的用于集群的使用(特别是关键交易系统)都持保守态度。在集群环境中，只利用数据库级的缓存是最安全的。</p>
		<p>　　5、 延迟加载</p>
		<p>　　a) 实体延迟加载:通过使用动态代理实现</p>
		<p>　　b) 集合延迟加载:通过实现自有的SET/LIST，HIBERNATE提供了这方面的支持</p>
		<p>　　c) 属性延迟加载:</p>
		<p>　　6、 方法选用</p>
		<p>　　a) 完成同样一件事，HIBERNATE提供了可供选择的一些方式，但具体使用什么方式，可能用性能/代码都会有影响。显示，一次返回十万条记录(List/Set/Bag/Map等)进行处理，很可能导致内存不够的问题，而如果用基于游标(ScrollableResults)或Iterator的结果集，则不存在这样的问题。</p>
		<p>　　b) Session的load/get方法，前者会使用二级缓存，而后者则不使用。</p>
		<p>　　c) Query和list/iterator，如果去仔细研究一下它们，你可能会发现很多有意思的情况，二者主要区别(如果使用了Spring，在HibernateTemplate中对应find,iterator方法):</p>
		<p>　　i. list只能利用查询缓存(但在交易系统中查询缓存作用不大)，无法利用二级缓存中的单个实体，但list查出的对象会写入二级缓存，但它一般只生成较少的执行SQL语句，很多情况就是一条(无关联)。</p>
		<p>　　ii. iterator则可以利用二级缓存，对于一条查询语句，它会先从数据库中找出所有符合条件的记录的ID，再通过ID去缓存找，对于缓存中没有的记录，再构造语句从数据库中查出，因此很容易知道，如果缓存中没有任何符合条件的记录，使用iterator会产生N+1条SQL语句(N为符合条件的记录数)</p>
		<p>　　iii. 通过iterator，配合缓存管理API，在海量数据查询中可以很好的解决内存问题，如:</p>
		<p>　　while(it.hasNext()){</p>
		<p>　　YouObject object = (YouObject)it.next();</p>
		<p>　　session.evict(youObject);</p>
		<p>　　sessionFactory.evice(YouObject.class, youObject.getId());</p>
		<p>　　}</p>
		<p>　　如果用list方法，很可能就出OutofMemory错误了。</p>
		<p>　　iv. 通过上面的说明，我想你应该知道如何去使用这两个方法了。</p>
		<p>　　7、 集合的选用</p>
		<p>　　在HIBERNATE 3.1文档的“19.5. Understanding Collection performance”中有详细的说明。</p>
		<p>　　8、 事务控制</p>
		<p>　　事务方面对性能有影响的主要包括:事务方式的选用，事务隔离级别以及锁的选用</p>
		<p>　　a) 事务方式选用:如果不涉及多个事务管理器事务的话，不需要使用JTA，只有JDBC的事务控制就可以。</p>
		<p>　　b) 事务隔离级别:参见标准的SQL事务隔离级别</p>
		<p>　　c) 锁的选用:悲观锁(一般由具体的事务管理器实现)，对于长事务效率低，但安全。乐观锁(一般在应用级别实现)，如在HIBERNATE中可以定义VERSION字段，显然，如果有多个应用操作数据，且这些应用不是用同一种乐观锁机制，则乐观锁会失效。因此，针对不同的数据应有不同的策略，同前面许多情况一样，很多时候我们是在效率与安全/准确性上找一个平衡点，无论如何，优化都不是一个纯技术的问题，你应该对你的应用和业务特征有足够的了解。</p>
		<p>　　9、 批量操作</p>
		<p>　　即使是使用JDBC，在进行大批数据更新时，BATCH与不使用BATCH有效率上也有很大的差别。我们可以通过设置batch_size来让其支持批量操作。</p>
		<p>　　举个例子，要批量删除某表中的对象，如“delete Account”，打出来的语句，会发现HIBERNATE找出了所有ACCOUNT的ID，再进行删除，这主要是为了维护二级缓存，这样效率肯定高不了，在后续的版本中增加了bulk delete/update，但这也无法解决缓存的维护问题。也就是说，由于有了二级缓存的维护问题，HIBERNATE的批量操作效率并不尽如人意!</p>
		<p>　　从前面许多要点可以看出，很多时候我们是在效率与安全/准确性上找一个平衡点，无论如何，优化都不是一个纯技术的问题，你应该对你的应用和业务特征有足够的了解，一般的，优化方案应在架构设计期就基本确定，否则可能导致没必要的返工，致使项目延期，而作为架构师和项目经理，还要面对开发人员可能的抱怨，必竟，我们对用户需求更改的控制力不大，但技术/架构风险是应该在初期意识到并制定好相关的对策。</p>
		<p>　　还有一点要注意，应用层的缓存只是锦上添花，永远不要把它当救命稻草，应用的根基(数据库设计，算法，高效的操作语句，恰当API的选择等)才是最重要的。 </p>
		<p>Hibernate的缓存***********************************</p>
		<p>1、首先设置EhCache，建立配置文件ehcache.xml，默认的位置在class-path，可以放到你的src目录下：<br /><br /></p>
		<table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1">
				<tbody>
						<tr>
								<td>＜?xml version="1.0" encoding="UTF-8"?＞<br />＜ehcache＞<br />　＜diskStore path="<a class="bluekey" href="http://dev.yesky.com/devjava/" target="_blank">java</a>.io.tmpdir"/＞ <br />　　＜defaultCache<br />　　　maxElementsInMemory="10000" ＜!-- 缓存最大数目 --＞<br />　　　eternal="false" ＜!-- 缓存是否持久 --＞<br />　　　overflowToDisk="true" ＜!-- 是否保存到磁盘，当系统当机时--＞<br />　　　timeToIdleSeconds="300" ＜!-- 当缓存闲置n秒后销毁 --＞<br />　　　timeToLiveSeconds="180" ＜!-- 当缓存存活n秒后销毁--＞<br />　　　diskPersistent="false"<br />　　　diskExpiryThreadIntervalSeconds= "120"/＞ <br />＜/ehcache＞</td>
						</tr>
				</tbody>
		</table>
		<br />　　2、在Hibernate配置文件中设置：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>＜!-- 设置Hibernate的缓存接口类，这个类在Hibernate包中 --＞<br />＜property name="cache.provider_class"＞org.hibernate.cache.EhCacheProvider＜/property＞ <br />　＜!-- 是否使用查询缓存 --＞<br />　＜property name="hibernate.cache.use_query_cache"＞true＜/property＞<br />　　如果使用spring调用Hibernate的sessionFactory的话，这样设置：<br />　　＜!--HibernateSession工厂管理 --＞<br />　　　＜bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"＞<br />　　　＜property name="dataSource"＞<br />　　　　＜ref bean="datasource" /＞<br />　　　＜/property＞<br />　　　＜property name="hibernateProperties"＞<br />　　　＜props＞<br />　　　　＜prop key="hibernate.dialect"＞org.hibernate.dialect.Oracle9Dialect＜/prop＞<br />　　　　＜prop key="connection.provider_class"＞org.hibernate.connection.C3P0ConnectionProvider＜/prop＞<br />　　　　＜prop key="hibernate.show_sql"＞true＜/prop＞<br />　　　　＜prop key="hibernate.cache.use_query_cache"＞true＜/prop＞<br />　　　　＜prop key="hibernate.cache.provider_class"＞org.hibernate.cache.EhCacheProvider＜/prop＞<br />　　　＜/props＞<br />　＜/property＞<br />　＜property name="mappingDirectoryLocations"＞<br />　　＜list＞<br />　　　＜value＞/WEB-INF/classes/cn/rmic/manager/hibernate/＜/value＞<br />　　＜/list＞<br />　＜/property＞ <br />＜/bean＞</td></tr></tbody></table><br />　　说明一下：如果不设置“查询缓存”，那么hibernate只会缓存使用load()方法获得的单个持久化对象，如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话，就需要设置<br />hibernate.cache.use_query_cache true 才行<br /><br />　　3、在Hbm文件中添加＜cache usage="read-only"/＞<br /><br />　　4、如果需要“查询缓存”，还需要在使用Query或Criteria()时设置其setCacheable(true);属性<br /><br />　　5、实践出真知，给一段测试程序，如果成功的话第二次查询时不会读取数据库<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>package cn.rmic.hibernatesample;<br /><br />import java.util.List;<br /><br />import org.hibernate.CacheMode;<br />import org.hibernate.Criteria;<br />import org.hibernate.Query;<br />import org.hibernate.Session;<br /><br />import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;<br />import cn.rmic.manager.po.Resources;<br /><br />public class testCacheSelectList ...{<br /><br />　/** *//**<br />　* @param args<br />　*/<br />　public static void main(String[] args) ...{<br />　　// TODO Auto-generated method stub<br /><br />　　Session s=HibernateSessionFactory.getSession();<br />　　Criteria c=s.createCriteria(Resources.class);<br />　　c.setCacheable(true);<br />　　List l=c.list();<br />　　// Query q=s.createQuery("From Resources r")<br />　　// .setCacheable(true) <br />　　// .setCacheRegion("frontpages") ;<br />　　// List l=q.list();<br />　　Resources resources=(Resources)l.get(0);<br />　　System.out.println("-1-"+resources.getName());<br />　　HibernateSessionFactory.closeSession();<br />　　try ...{<br />　　　Thread.sleep(5000);<br />　　} catch (InterruptedException e) ...{<br />　　　// TODO Auto-generated catch block<br />　　　e.printStackTrace();<br />　　}<br />　　s=HibernateSessionFactory.getSession();<br />　　c=s.createCriteria(Resources.class);<br />　　c.setCacheable(true);<br />　　l=c.list();<br />　　// q=s.createQuery("From Resources r").setCacheable(true) <br />　　// .setCacheRegion("frontpages");<br />　　// l=q.list();<br />　　resources=(Resources)l.get(0);<br />　　System.out.println("-2-"+resources.getName());<br />　　HibernateSessionFactory.closeSession();<br />　}<br />}</td></tr></tbody></table><img src ="http://www.blogjava.net/HotJava/aggbug/78782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/HotJava/" target="_blank">HotJava</a> 2006-11-02 21:35 <a href="http://www.blogjava.net/HotJava/archive/2006/11/02/78782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate性能优化 </title><link>http://www.blogjava.net/HotJava/archive/2006/11/02/78781.html</link><dc:creator>HotJava</dc:creator><author>HotJava</author><pubDate>Thu, 02 Nov 2006 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/HotJava/archive/2006/11/02/78781.html</guid><wfw:comment>http://www.blogjava.net/HotJava/comments/78781.html</wfw:comment><comments>http://www.blogjava.net/HotJava/archive/2006/11/02/78781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/HotJava/comments/commentRss/78781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/HotJava/services/trackbacks/78781.html</trackback:ping><description><![CDATA[
		<p>本文依照HIBERNATE帮助文档，一些网络书籍及项目经验整理而成，只提供要点和思路，具体做法可以留言探讨，或是找一些更详细更有针对性的资料。 </p>
		<p>　　初用HIBERNATE的人也许都遇到过性能问题，实现同一功能，用HIBERNATE与用JDBC性能相差十几倍很正常，如果不及早调整，很可能影响整个项目的进度。</p>
		<p>　　大体上，对于HIBERNATE性能调优的主要考虑点如下:</p>
		<p>　　Ø 数据库设计调整</p>
		<p>　　Ø HQL优化</p>
		<p>　　Ø API的正确使用(如根据不同的业务类型选用不同的集合及查询API)</p>
		<p>　　Ø 主配置参数(日志，查询缓存，fetch_size, batch_size等)</p>
		<p>　　Ø 映射文件优化(ID生成策略，二级缓存，延迟加载，关联优化)</p>
		<p>　　Ø 一级缓存的管理</p>
		<p>　　Ø 针对二级缓存，还有许多特有的策略</p>
		<p>　　Ø 事务控制策略。</p>
		<p>　　1、 数据库设计</p>
		<p>　　a) 降低关联的复杂性</p>
		<p>　　b) 尽量不使用联合主键</p>
		<p>　　c) ID的生成机制，不同的数据库所提供的机制并不完全一样</p>
		<p>　　d) 适当的冗余数据，不过分追求高范式</p>
		<p>　　2、 HQL优化</p>
		<p>　　HQL如果抛开它同HIBERNATE本身一些缓存机制的关联，HQL的优化技巧同普通的SQL优化技巧一样，可以很容易在网上找到一些经验之谈。</p>
		<p>　　3、 主配置</p>
		<p>　　a) 查询缓存，同下面讲的缓存不太一样，它是针对HQL语句的缓存，即完全一样的语句再次执行时可以利用缓存数据。但是，查询缓存在一个交易系统(数据变更频繁，查询条件相同的机率并不大)中可能会起反作用:它会白白耗费大量的系统资源但却难以派上用场。</p>
		<p>　　b) fetch_size，同JDBC的相关参数作用类似，参数并不是越大越好，而应根据业务特征去设置</p>
		<p>　　c) batch_size同上。</p>
		<p>　　d) 生产系统中，切记要关掉SQL语句<a class="bluekey" href="http://oa.yesky.com/" target="_blank">打印</a>。</p>
		<p>　　4、 缓存</p>
		<p>　　a) 数据库级缓存:这级缓存是最高效和安全的，但不同的数据库可管理的层次并不一样，比如，在ORACLE中，可以在建表时指定将整个表置于缓存当中。</p>
		<p>　　b) SESSION缓存:在一个HIBERNATE SESSION有效，这级缓存的可干预性不强，大多于HIBERNATE自动管理，但它提供清除缓存的方法，这在大批量增加/更新操作是有效的。比如，同时增加十万条记录，按常规方式进行，很可能会发现OutofMemeroy的异常，这时可能需要手动清除这一级缓存:Session.evict以及Session.clear</p>
		<p>　　c) 应用缓存:在一个SESSIONFACTORY中有效，因此也是优化的重中之重，因此，各类策略也考虑的较多，在将数据放入这一级缓存之前，需要考虑一些前提条件:</p>
		<p>　　i. 数据不会被第三方修改(比如，是否有另一个应用也在修改这些数据?)</p>
		<p>　　ii. 数据不会太大</p>
		<p>　　iii. 数据不会频繁更新(否则使用CACHE可能适得其反)</p>
		<p>　　iv. 数据会被频繁查询</p>
		<p>　　v. 数据不是关键数据(如涉及钱，安全等方面的问题)。</p>
		<p>　　缓存有几种形式，可以在映射文件中配置:read-only(只读，适用于很少变更的静态数据/历史数据)，nonstrict-read-write，read-write(比较普遍的形式，效率一般)，transactional(JTA中，且支持的缓存产品较少)</p>
		<p>　　d) 分布式缓存:同c)的配置一样，只是缓存产品的选用不同，在目前的HIBERNATE中可供选择的不多，oscache, jboss cache，目前的大多数项目，对它们的用于集群的使用(特别是关键交易系统)都持保守态度。在集群环境中，只利用数据库级的缓存是最安全的。</p>
		<p>　　5、 延迟加载</p>
		<p>　　a) 实体延迟加载:通过使用动态代理实现</p>
		<p>　　b) 集合延迟加载:通过实现自有的SET/LIST，HIBERNATE提供了这方面的支持</p>
		<p>　　c) 属性延迟加载:</p>
		<p>　　6、 方法选用</p>
		<p>　　a) 完成同样一件事，HIBERNATE提供了可供选择的一些方式，但具体使用什么方式，可能用性能/代码都会有影响。显示，一次返回十万条记录(List/Set/Bag/Map等)进行处理，很可能导致内存不够的问题，而如果用基于游标(ScrollableResults)或Iterator的结果集，则不存在这样的问题。</p>
		<p>　　b) Session的load/get方法，前者会使用二级缓存，而后者则不使用。</p>
		<p>　　c) Query和list/iterator，如果去仔细研究一下它们，你可能会发现很多有意思的情况，二者主要区别(如果使用了Spring，在HibernateTemplate中对应find,iterator方法):</p>
		<p>　　i. list只能利用查询缓存(但在交易系统中查询缓存作用不大)，无法利用二级缓存中的单个实体，但list查出的对象会写入二级缓存，但它一般只生成较少的执行SQL语句，很多情况就是一条(无关联)。</p>
		<p>　　ii. iterator则可以利用二级缓存，对于一条查询语句，它会先从数据库中找出所有符合条件的记录的ID，再通过ID去缓存找，对于缓存中没有的记录，再构造语句从数据库中查出，因此很容易知道，如果缓存中没有任何符合条件的记录，使用iterator会产生N+1条SQL语句(N为符合条件的记录数)</p>
		<p>　　iii. 通过iterator，配合缓存管理API，在海量数据查询中可以很好的解决内存问题，如:</p>
		<p>　　while(it.hasNext()){</p>
		<p>　　YouObject object = (YouObject)it.next();</p>
		<p>　　session.evict(youObject);</p>
		<p>　　sessionFactory.evice(YouObject.class, youObject.getId());</p>
		<p>　　}</p>
		<p>　　如果用list方法，很可能就出OutofMemory错误了。</p>
		<p>　　iv. 通过上面的说明，我想你应该知道如何去使用这两个方法了。</p>
		<p>　　7、 集合的选用</p>
		<p>　　在HIBERNATE 3.1文档的“19.5. Understanding Collection performance”中有详细的说明。</p>
		<p>　　8、 事务控制</p>
		<p>　　事务方面对性能有影响的主要包括:事务方式的选用，事务隔离级别以及锁的选用</p>
		<p>　　a) 事务方式选用:如果不涉及多个事务管理器事务的话，不需要使用JTA，只有JDBC的事务控制就可以。</p>
		<p>　　b) 事务隔离级别:参见标准的SQL事务隔离级别</p>
		<p>　　c) 锁的选用:悲观锁(一般由具体的事务管理器实现)，对于长事务效率低，但安全。乐观锁(一般在应用级别实现)，如在HIBERNATE中可以定义VERSION字段，显然，如果有多个应用操作数据，且这些应用不是用同一种乐观锁机制，则乐观锁会失效。因此，针对不同的数据应有不同的策略，同前面许多情况一样，很多时候我们是在效率与安全/准确性上找一个平衡点，无论如何，优化都不是一个纯技术的问题，你应该对你的应用和业务特征有足够的了解。</p>
		<p>　　9、 批量操作</p>
		<p>　　即使是使用JDBC，在进行大批数据更新时，BATCH与不使用BATCH有效率上也有很大的差别。我们可以通过设置batch_size来让其支持批量操作。</p>
		<p>　　举个例子，要批量删除某表中的对象，如“delete Account”，打出来的语句，会发现HIBERNATE找出了所有ACCOUNT的ID，再进行删除，这主要是为了维护二级缓存，这样效率肯定高不了，在后续的版本中增加了bulk delete/update，但这也无法解决缓存的维护问题。也就是说，由于有了二级缓存的维护问题，HIBERNATE的批量操作效率并不尽如人意!</p>
		<p>　　从前面许多要点可以看出，很多时候我们是在效率与安全/准确性上找一个平衡点，无论如何，优化都不是一个纯技术的问题，你应该对你的应用和业务特征有足够的了解，一般的，优化方案应在架构设计期就基本确定，否则可能导致没必要的返工，致使项目延期，而作为架构师和项目经理，还要面对开发人员可能的抱怨，必竟，我们对用户需求更改的控制力不大，但技术/架构风险是应该在初期意识到并制定好相关的对策。</p>
		<p>　　还有一点要注意，应用层的缓存只是锦上添花，永远不要把它当救命稻草，应用的根基(数据库设计，算法，高效的操作语句，恰当API的选择等)才是最重要的。 </p>
		<p>Hibernate的缓存***********************************</p>
		<p>1、首先设置EhCache，建立配置文件ehcache.xml，默认的位置在class-path，可以放到你的src目录下：<br /><br /></p>
		<table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1">
				<tbody>
						<tr>
								<td>＜?xml version="1.0" encoding="UTF-8"?＞<br />＜ehcache＞<br />　＜diskStore path="<a class="bluekey" href="http://dev.yesky.com/devjava/" target="_blank">java</a>.io.tmpdir"/＞ <br />　　＜defaultCache<br />　　　maxElementsInMemory="10000" ＜!-- 缓存最大数目 --＞<br />　　　eternal="false" ＜!-- 缓存是否持久 --＞<br />　　　overflowToDisk="true" ＜!-- 是否保存到磁盘，当系统当机时--＞<br />　　　timeToIdleSeconds="300" ＜!-- 当缓存闲置n秒后销毁 --＞<br />　　　timeToLiveSeconds="180" ＜!-- 当缓存存活n秒后销毁--＞<br />　　　diskPersistent="false"<br />　　　diskExpiryThreadIntervalSeconds= "120"/＞ <br />＜/ehcache＞</td>
						</tr>
				</tbody>
		</table>
		<br />　　2、在Hibernate配置文件中设置：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>＜!-- 设置Hibernate的缓存接口类，这个类在Hibernate包中 --＞<br />＜property name="cache.provider_class"＞org.hibernate.cache.EhCacheProvider＜/property＞ <br />　＜!-- 是否使用查询缓存 --＞<br />　＜property name="hibernate.cache.use_query_cache"＞true＜/property＞<br />　　如果使用spring调用Hibernate的sessionFactory的话，这样设置：<br />　　＜!--HibernateSession工厂管理 --＞<br />　　　＜bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"＞<br />　　　＜property name="dataSource"＞<br />　　　　＜ref bean="datasource" /＞<br />　　　＜/property＞<br />　　　＜property name="hibernateProperties"＞<br />　　　＜props＞<br />　　　　＜prop key="hibernate.dialect"＞org.hibernate.dialect.Oracle9Dialect＜/prop＞<br />　　　　＜prop key="connection.provider_class"＞org.hibernate.connection.C3P0ConnectionProvider＜/prop＞<br />　　　　＜prop key="hibernate.show_sql"＞true＜/prop＞<br />　　　　＜prop key="hibernate.cache.use_query_cache"＞true＜/prop＞<br />　　　　＜prop key="hibernate.cache.provider_class"＞org.hibernate.cache.EhCacheProvider＜/prop＞<br />　　　＜/props＞<br />　＜/property＞<br />　＜property name="mappingDirectoryLocations"＞<br />　　＜list＞<br />　　　＜value＞/WEB-INF/classes/cn/rmic/manager/hibernate/＜/value＞<br />　　＜/list＞<br />　＜/property＞ <br />＜/bean＞</td></tr></tbody></table><br />　　说明一下：如果不设置“查询缓存”，那么hibernate只会缓存使用load()方法获得的单个持久化对象，如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话，就需要设置<br />hibernate.cache.use_query_cache true 才行<br /><br />　　3、在Hbm文件中添加＜cache usage="read-only"/＞<br /><br />　　4、如果需要“查询缓存”，还需要在使用Query或Criteria()时设置其setCacheable(true);属性<br /><br />　　5、实践出真知，给一段测试程序，如果成功的话第二次查询时不会读取数据库<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"><tbody><tr><td>package cn.rmic.hibernatesample;<br /><br />import java.util.List;<br /><br />import org.hibernate.CacheMode;<br />import org.hibernate.Criteria;<br />import org.hibernate.Query;<br />import org.hibernate.Session;<br /><br />import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;<br />import cn.rmic.manager.po.Resources;<br /><br />public class testCacheSelectList ...{<br /><br />　/** *//**<br />　* @param args<br />　*/<br />　public static void main(String[] args) ...{<br />　　// TODO Auto-generated method stub<br /><br />　　Session s=HibernateSessionFactory.getSession();<br />　　Criteria c=s.createCriteria(Resources.class);<br />　　c.setCacheable(true);<br />　　List l=c.list();<br />　　// Query q=s.createQuery("From Resources r")<br />　　// .setCacheable(true) <br />　　// .setCacheRegion("frontpages") ;<br />　　// List l=q.list();<br />　　Resources resources=(Resources)l.get(0);<br />　　System.out.println("-1-"+resources.getName());<br />　　HibernateSessionFactory.closeSession();<br />　　try ...{<br />　　　Thread.sleep(5000);<br />　　} catch (InterruptedException e) ...{<br />　　　// TODO Auto-generated catch block<br />　　　e.printStackTrace();<br />　　}<br />　　s=HibernateSessionFactory.getSession();<br />　　c=s.createCriteria(Resources.class);<br />　　c.setCacheable(true);<br />　　l=c.list();<br />　　// q=s.createQuery("From Resources r").setCacheable(true) <br />　　// .setCacheRegion("frontpages");<br />　　// l=q.list();<br />　　resources=(Resources)l.get(0);<br />　　System.out.println("-2-"+resources.getName());<br />　　HibernateSessionFactory.closeSession();<br />　}<br />}</td></tr></tbody></table><img src ="http://www.blogjava.net/HotJava/aggbug/78781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/HotJava/" target="_blank">HotJava</a> 2006-11-02 21:33 <a href="http://www.blogjava.net/HotJava/archive/2006/11/02/78781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java程序员面试之150++ </title><link>http://www.blogjava.net/HotJava/archive/2006/11/02/78780.html</link><dc:creator>HotJava</dc:creator><author>HotJava</author><pubDate>Thu, 02 Nov 2006 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/HotJava/archive/2006/11/02/78780.html</guid><wfw:comment>http://www.blogjava.net/HotJava/comments/78780.html</wfw:comment><comments>http://www.blogjava.net/HotJava/archive/2006/11/02/78780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/HotJava/comments/commentRss/78780.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/HotJava/services/trackbacks/78780.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、Java基础方面		1、作用域public,private,protected,以及不写时的区别		　　答：区别如下：		　　作用域       当前类      同一package      子孙类       其他package　　public         √            √             √              √　　protected     ...&nbsp;&nbsp;<a href='http://www.blogjava.net/HotJava/archive/2006/11/02/78780.html'>阅读全文</a><img src ="http://www.blogjava.net/HotJava/aggbug/78780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/HotJava/" target="_blank">HotJava</a> 2006-11-02 21:33 <a href="http://www.blogjava.net/HotJava/archive/2006/11/02/78780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用hibernate实现数据库底层分页 </title><link>http://www.blogjava.net/HotJava/archive/2006/11/02/78768.html</link><dc:creator>HotJava</dc:creator><author>HotJava</author><pubDate>Thu, 02 Nov 2006 12:43:00 GMT</pubDate><guid>http://www.blogjava.net/HotJava/archive/2006/11/02/78768.html</guid><wfw:comment>http://www.blogjava.net/HotJava/comments/78768.html</wfw:comment><comments>http://www.blogjava.net/HotJava/archive/2006/11/02/78768.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/HotJava/comments/commentRss/78768.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/HotJava/services/trackbacks/78768.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、创建SessionFactory,为了减轻服务器负担,保证一个应用中仅生成一个SessionFactory即可.																		package						 dao;						import						 org.hibernate.cfg.						*						;						import						 org.hibernate....&nbsp;&nbsp;<a href='http://www.blogjava.net/HotJava/archive/2006/11/02/78768.html'>阅读全文</a><img src ="http://www.blogjava.net/HotJava/aggbug/78768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/HotJava/" target="_blank">HotJava</a> 2006-11-02 20:43 <a href="http://www.blogjava.net/HotJava/archive/2006/11/02/78768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用log4j配置</title><link>http://www.blogjava.net/HotJava/archive/2006/10/10/74354.html</link><dc:creator>HotJava</dc:creator><author>HotJava</author><pubDate>Tue, 10 Oct 2006 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/HotJava/archive/2006/10/10/74354.html</guid><wfw:comment>http://www.blogjava.net/HotJava/comments/74354.html</wfw:comment><comments>http://www.blogjava.net/HotJava/archive/2006/10/10/74354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/HotJava/comments/commentRss/74354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/HotJava/services/trackbacks/74354.html</trackback:ping><description><![CDATA[
		<span class="content">
				<font color="#000000">常用log4j配置，一般可以采用两种方式，.properties和.xml,下面举两个简单的例子：<br />一、log4j.properties<br />### 设置org.zblog域对应的级别INFO,DEBUG,WARN,ERROR和输出地A1，A2 ##<br />log4j.category.org.zblog=ERROR,A1 <br />log4j.category.org.zblog=INFO,A2 <br />log4j.appender.A1=org.apache.log4j.ConsoleAppender <br />### 设置输出地A1，为ConsoleAppender(控制台) ##<br />log4j.appender.A1.layout=org.apache.log4j.PatternLayout <br />### 设置A1的输出布局格式PatterLayout,(可以灵活地指定布局模式）##<br />log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n <br />### 配置日志输出的格式##<br />log4j.appender.A2=org.apache.log4j.RollingFileAppender <br />### 设置输出地A2到文件（文件大小到达指定尺寸的时候产生一个新的文件）##<br />log4j.appender.A2.File=E:/study/log4j/zhuwei.html <br />### 文件位置##<br />log4j.appender.A2.MaxFileSize=500KB <br />### 文件大小##<br />log4j.appender.A2.MaxBackupIndex=1 <br />log4j.appender.A2.layout=org.apache.log4j.HTMLLayout <br />##指定采用html方式输出<br />二、log4j.xml<br />&lt;?xml version="1.0" encoding="GB2312" ?&gt;<br />&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;<br />&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"&gt;<br />&lt;appender name="org.zblog.all" class="org.apache.log4j.RollingFileAppender"&gt;<br />&lt;!-- 设置通道ID:org.zblog.all和输出方式：org.apache.log4j.RollingFileAppender --&gt;<br />   &lt;param name="File" value="E:/study/log4j/all.output.log" /&gt;&lt;!-- 设置File参数：日志输出文件名 --&gt;<br />   &lt;param name="Append" value="false" /&gt;&lt;!-- 设置是否在重新启动服务时，在原有日志的基础添加新日志 --&gt;<br />   &lt;param name="MaxBackupIndex" value="10" /&gt; <br />   &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />       &lt;param name="ConversionPattern" value="%p (%c:%L)- %m%n" /&gt;&lt;!-- 设置输出文件项目和格式 --&gt;<br />   &lt;/layout&gt;<br />&lt;/appender&gt;<br />&lt;appender name="org.zblog.zcw" class="org.apache.log4j.RollingFileAppender"&gt;<br />   &lt;param name="File" value="E:/study/log4j/zhuwei.output.log" /&gt;<br />   &lt;param name="Append" value="true" /&gt;<br />   &lt;param name="MaxFileSize" value="10240" /&gt; &lt;!-- 设置文件大小 --&gt;<br />   &lt;param name="MaxBackupIndex" value="10" /&gt; <br />   &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />       &lt;param name="ConversionPattern" value="%p (%c:%L)- %m%n" /&gt;<br />   &lt;/layout&gt;<br />&lt;/appender&gt;<br />&lt;logger name="zcw.log"&gt; &lt;!-- 设置域名限制，即zcw.log域及以下的日志均输出到下面对应的通道中 --&gt;<br />   &lt;level value="debug" /&gt;&lt;!-- 设置级别 --&gt;<br />   &lt;appender-ref ref="org.zblog.zcw" /&gt;&lt;!-- 与前面的通道id相对应 --&gt;<br />&lt;/logger&gt;<br />&lt;root&gt; &lt;!-- 设置接收所有输出的通道 --&gt;<br />   &lt;appender-ref ref="org.zblog.all" /&gt;&lt;!-- 与前面的通道id相对应 --&gt;<br />&lt;/root&gt;<br />&lt;/log4j:configuration&gt;<br />三、配置文件加载方法：<br />import org.apache.log4j.Logger;<br />import org.apache.log4j.PropertyConfigurator;<br />import org.apache.log4j.xml.DOMConfigurator;<br />public class Log4jApp {<br />   public static void main(String[] args) {<br />       DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加载.xml文件<br />       //PropertyConfigurator.configure("E:/study/log4j/log4j.properties");//加载.properties文件<br />       Logger log=Logger.getLogger("org.zblog.test");<br />       log.info("测试");<br />   }<br />}<br />四、项目使用log4j<br />在web 应用中，可以将配置文件的加载放在一个单独的servlet中，并在web.xml中配置该servlet在应用启动时候加载。对于在多人项目中，可以给每一个人设置一个输出通道，这样在每个人在构建Logger时，用自己的域名称，让调试信息输出到自己的log文件中。<br />五、常用输出格式<br /># -X号:X信息输出时左对齐；<br /># %p:日志信息级别<br /># %d{}:日志信息产生时间<br /># %c:日志信息所在地（类名）<br /># %m:产生的日志具体信息<br /># %n:输出日志信息换行</font>
				<br />
		</span>
		<!-- 正文end -->
<img src ="http://www.blogjava.net/HotJava/aggbug/74354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/HotJava/" target="_blank">HotJava</a> 2006-10-10 19:02 <a href="http://www.blogjava.net/HotJava/archive/2006/10/10/74354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算机日语(日文式样书常出现的句型)</title><link>http://www.blogjava.net/HotJava/archive/2006/10/10/74345.html</link><dc:creator>HotJava</dc:creator><author>HotJava</author><pubDate>Tue, 10 Oct 2006 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/HotJava/archive/2006/10/10/74345.html</guid><wfw:comment>http://www.blogjava.net/HotJava/comments/74345.html</wfw:comment><comments>http://www.blogjava.net/HotJava/archive/2006/10/10/74345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/HotJava/comments/commentRss/74345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/HotJava/services/trackbacks/74345.html</trackback:ping><description><![CDATA[
		<h4 class="TextColor1" id="subjcns!6A1F83B5538C49C6!117" style="MARGIN-BOTTOM: 0px"> </h4>
		<div id="msgcns!6A1F83B5538C49C6!117">【‘と’の用法について：】 ①並列助詞 ★中国語：和、与、同 ◆例：AとBをワークエリアにセットする。 ②動作、関係等的対象 ★中国語：和、与、同 ◆例：　条件書の内容はソースと一致していない。　　　　　委託元と打合せする。 ③共同完成動作的対象 ★中国語：和××一起… ◆例：皆さんと同じ職場で働いている。 ④結果 ★中国語：成為（変為）… ◆例：水は氷となる。　　　　修正された後、AはA＋1となる。 ⑤比較対象 ★中国語：和、同、跟 ◆例：AはBと等しい。　　　　AはBと違っている。 ⑥思考、発言、記述内容的引用 ★中国語：…書、…記述、…認為、…所述 ◆例：詳細設計書には「A＝0」と書いてありますが、こちら側はA≠0と思っております。　　　　委託元からソースがOKだと言われました。　　　　こちら側は以上の通り処理を行なうのが正しいと思っております。　　　　ONSITE側からソースに問題があると指摘されてきた。 ⑦後跟否定形式 ★中国語：不到、不足 ◆例：1時間とはかからなかった。　　　　 ⑧由前因導致後果 ★中国語：由××導致○○的結果 ◆例：このようにソースを修正すると大和ルールと違反している部分があると思います。 ⑨一般条件下成立的条件関係 ★中国語：一.…就…、 ◆例：AにBをたすとCになる。　　　　 ⑩仮設 ★中国語：如果…就… ◆例：もし仕様が変更されるとそれと関連する幾つかの部分も変更する必要がある。 【連続詞について】 ①から　　（主観想方） ★中国語：因為…所以 ◆例：　仕様理解のほうが大変ですから、フローを提出してくれませんか。　　　訳文：仕様很難理解、能否（向我方）提供流程図。 ②ので　　（客観存在） ★中国語：因為…所以 ◆例：　今回の案件は出力全て西暦なので、和暦の場合、まず西暦に変更して下さい。　　　　訳文：因為本次案件的出力全部是西暦、所以請将和暦変更為西暦。 ③ため　　（表示原因） ★中国語：由于…（発生）…結果 ◆例：　現行税制が変更されたため、関連PGMを修正する必要が出て来る。　　　　訳文：由于現行税制発生変更、因而産生了関連PGM修正的必要。 ④が ★中国語：雖然…但是例：　詳細設計書には「A＝0」と書いてありますが、こちら側はA≠0と思っております。　　　訳文：雖然在詳細設計書中是「A＝0」、但是我方認為応該是A≠0。 ⑤のに　（遺憾、失望） ★中国語：却…、　居然 ◆例：　Aにすればよかったなのに、何故わざわざBにしなければならない。　　　訳文：用A方式来処理本来很好、為什幺還要特意使用B方式陳？ ⑥動詞未然形＋ずに ★中国語：不… ◆例：ソースの論理を変わらずに修正して下さい。　　　訳文：請在不改変SOURCE LOGIC的前提下、進行修正。 ⑦動詞未然形＋ないように ★中国語：不要… ◆例：二度とこのようなミスを発生しないように良く注意して下さい。　　　訳文：為避免再次発生這様的錯誤、請加強注意。 ⑧動詞未然形＋無ければなれない ★中国語：必須… ◆例：テストをやらなければなれない。　　　訳文：必須要作測試。 ⑨動詞未然形＋無くでも良い（無くでも構いません） ★中国語：不需要… ◆例：この論理についてテストをやらなくても良い。　　　訳文：針対這個 logic不需要進行測試。 ⑩.…てはいけない ★中国語：不可… ◆例：修正された部分についてテストをしなくてはいけない　　　訳文：針対被修正的部分必須要進行測試（不作測試不可以）。 ⑪全て…ではない。 ★中国語：不全是… ◆例：データは全て‘０’ではない。　　　訳文：数拠并不全是‘0’。 ⑫…わけではない。 ★中国語：并非… ◆例：全てのテストデータが間違っているわけではない。　　　訳文：并非所有的測試数拠都是錯誤的。 ⑬○○における… ★中国語：在○○中… ◆例：コール・ネット信用取引サービスにおける閉鎖基準は、普通の信用取引サービスと異なる。　　　訳文：在CALLNET信用交易中的閉鎖基準与普通的信用交易　　　service不同。 ⑭○○に対する ★中国語：対于○○、針対○○ ◆例：BDAMファイルに対して、更新等の処理を行います。　　訳文：針対BDAM　FILE進行更新等処理。 ⑮○○について ★中国語：関于○○ ◆例：今度案件背景について詳しく紹介していただきませんか。 　　訳文：請詳細紹介一下（関于）本回案件的背景。 ⑯○○による ★中国語：根拠、通過○○ ◆例：仕様理解により、ACO380はTABLEで出力すると思います。　　訳文：根拠対于仕様的理解、我方認為ACO380要通過TABLE来輸出。 ⑰○○に関する ★中国語：与○○相関 ◆例：これと関する情報は条件書に明らかに書いています。　　訳文：与此相関的信息在条件書中有詳細的記述。 ⑱○○に伴い ★中国語：伴随○○、発生… ◆例：Aファイルの追加に伴い、それと関連しているある処理とルーチンもそれぞれ追加される。　　訳文：伴随着A　FILE的追加、与其関連的処理和 ROUTINE也分別被追加。 ⑲○○にとって ★中国語：対于○○来説… ◆例：今度提出してくれた詳細設計書はこちら側にとって、なかなか理解できないので、　　もっと詳しく説明して頂きませんか。　　訳文：本次案件的詳細設計書対于我方来説、某些部分非常難于理解、　　　　　請進一歩給于詳細的説明。 ⑳○○になると ★中国語：一…就… ◆例：ABENDになると、ABENDメッセージがリターンされて来る。　　訳文：一旦発生ABEND、就会返回ABEND信息。【いずれといずれもの用法について】 ★　いずれ ①《どれ、どちら》陳个、陳方面 ◆　1001　　　この数字にいずれが0である数字が入っています。　　訳文：1001　　　在這串数字中包含0這個数字。 ②《やがて、その内》不久、早晩 ◆　このことはいずれ分かることだ。　　訳文：這件事早晩会水落石出。 ★　いずれも ①《全部、どれも》 ◆　0000　　この数字にいずれも0（の数字）です。　　訳文：0000　　這串数字全都是0。 ◆　1253　　これはいずれも0が入っていない数字です。　　訳文：1253　　這串数字全都不是0。 ★　A＋B＝C ◆　A足すBはCだ。　　AにBを加算するとCになる。 ★　A-B＝C ◆　A引くBはCだ。　　AにBを引くとCになる。 ★　A＊B＝C ◆　A掛けるBはCになる。　　AとB乗法するとCになる。 ★　A÷B＝C ◆　A割るBはCになる。　　BでAを割るとCになる。 【比率と比例】 ①○○に××の割引で… ★○○比××的比率 ◆例：３人に１人の割合で大学進学を希望している。　　訳文：大学的昇学率是3比1的比率。 ②○○分の×× ★○○分之×× ◆例：全員の３分の２がその案に賛成している。　　訳文：全員的3分之2都賛成那個提案。 ③○○と××の比 ★○○和××的比 ◆例：１０と５の比は２と１の比に等しい１０：５＝２：１。　　訳文：10和5的比等于2和1的比10：5＝2：1. ④○○対×× ★○○比×× ◆例：A対BイコールX対Y　A:B=X:Y。　訳文：A比B等于X比Ｙ　A:B=X:Y。　 【‘に’の用法について：】 ①　に違いない ◆　中国語：一定、必定 　　　例文：これらのデータでテストするのはきっと正しいに違いない。　　　訳文：使用這些数拠来測試一定正確。 ②　に係わらず ◆　中国語：不論…都　　　例文：修正と新規に係わらず、大和ルールを守った上で開発を行われなければなりません。　　　訳文：不論是修正還是新規、都必須在遵守大和RULE的基準上進行開発。 ③　にそって ◆　中国語：按照…、沿着… 　　　例文：案件開発では標準化にそって進めなければなりません。　　　訳文：案件開発必須要按照標準化来進行。 ◆　○○を元に ★中国語：以…為基礎　例：課税口401kを元に、判定結果ファイルを作成する。　訳す：以課税口401k為基準来作成判定結果FILE。 ◆　○○を分けて… ★中国語：分開、分別… 　例：『データ区分』ごとに変換処理を分けて行う。　訳す：毎個『DATA区分』都要分別進行変更処理。 ◆　○○を××から△△へGETする ★中国語：把○○从××中GET到△△中　例：課税口401kデータを企業サーバからHOSTへGETする。　訳す：把課税口401kDATA从企業SEVER中GET到HOST中。 ◆　【…を…へ返す】 ★　将…返回…　　　例：判別結果をメインプログラムへ返す。　　中国語：将判別結果返回主程序。 ◆　【…に…を加算】 ★　向…中加算… 　　例：売買に従い、自己融資カウンタに株数を加算　　中国語：按照売買、向自己融資counter中加算株数。 ◆　【…から…へ変更する】 ★　従…変更為… 　　例：決済RECﾃｰﾌﾞﾙ【KESTBL】のﾚｺｰﾄﾞ長を１６２から１８５へ変更する。　　中国語：将決済RECﾃｰﾌﾞﾙ【KESTBL】的RECORD長従162変更為185。 ◆　【…とする】 ★　認為…、仮定… 　　例：ホールには影響を与えない事とする　　中国語：認為対于HOST来説没有什幺影響。 ◆　【…を…へ出力】 ★　将…向…出力　　例：確定配当編集ｴﾘｱのデータをOUTDD1へ出力する。　　中国語：将確定配当編集area的数拠向OUTDD1中出力。 ◆　【…を…にセット】 ★　将…設置到… 　　例：ゼロを（付替）差引 支払額にセットする。　　中国語：将零設置到差引支払額中。 ◆　【…上に…】 ★　不但…而且… 　　例：ルールを基づく上に委託元の指示を応じるわけだ。　　中国語：不但要以RULE為基準、而且同時還要尊従委託元的指示。 ◆　【…上で…】 ★　…方面、…上　　例：テストの上ではまちがいはない。　　中国語：在TEST上没有錯誤。 ◆　【…上は…】 ★　既然…就… 　　例：見られた上はしかたがない。　　中国語：既然己被発現那就没有方法了。 ◆　【…かもしれない】 ★　可能…、也許… 　　例：あしたは雪が降るかもしれない。 　　中国語：明天可能下雨。　　例：そんなことを言ったかもしれない。　　中国語：或許我説過那様的話。 ◆　【…とはいえ】 ★　…尽管…但是… 　　例：近いとはいえ歩いて30分はたっぷりかかる。　　中国語：尽管近、還是需要30分。 ◆　【…ところが】 ★　…可是… 　　例：うまくいくだろうと思った．ところが，失敗した。　　中国語：原本認為会順調進行、可是失敗了。 ◆　【…すると…】 ★　于是… 　　例：わたしが歌った、すると妹も歌いだした　　中国語：我唱了1首歌、于是妹也唱了起来。 ◆　【…そして…】 ★　而且… 　　例：今日は楽しくそして有意義な日でした　　中国語：今日是愉快而且有意義的一日。 ◆　【…ために…】 ★　因此… 　　例：病気のためにこられなかった。　　中国語：因病没能来。 ◆　【…ところが…】 ★　可是… 　　例：新聞はかるく取り扱っていたようだ、ところが、これは大事件なんだ。　　中国語：新聞没有作重要的登載、不過這是件大事。 ◆　【ほど…ない】 ★　再也没有更…、最… 　　例：野球ほど好きなものはない。　　中国語：我最喜歓棒球。 ◆　【…てしまう】 ★　完了…、尽… 　　例：1日で読んでしまった。　　中国語：用了1天就読完了。 ◆　【わけが無い】 ★　不会…、不能…。…是不可能的　　（従道理上確信完全不可能）　　例：努力もしないで成績があがるわけが無い。　　中国語：不努力就不能取得好成績。 ◆　【わけではない】 ★　并非…。并不是… 　　例:日本にも小数民族が無いわけではない。　　中国語：就是日本也并非没有少数民族。 ◆　【わけにはいかない】 ★　不能…、不可能… 　　例：自分の職場を離れるわけにはいかない。　　中国語：不能離開自己的職守。 【列挙、並記、例示】 ◆　および　　　　 ★　和、及　　例：会社の運営　および　管理を、彼に任せる。　　中国語：将公司的運営及管理委託給了他。 ◆　～が ★　両件事件的連続詞　　例：もしもし、田中です　が、一郎さんをお願いします。　　中国語：我是田中、請叫一下一郎先生。 ◆　～て　　　　 ★　並且、既…又… 　　例：あのレストランは、　安くて、おいしいです。　　中国語：那個飯店、既便宜又好吃。 ◆　そして　　　　 ★　並且、既…又… 　　例：木村さんはきれいです。　そして　たいへん親切です。　　中国語：木村小姐既美麗、又非常熱情。 ◆　それから　　　 ★　然後　　例：切手を下さい。　それから　この荷物もお願いします。　　中国語：請給我郵票。然後将行李也拜托給艇了。 ◆　たり　　　　 ★　両個動作和状態的並列　　例：日曜日、買い物したり、映画を　見たり　します。　　中国語：星期日又買東西又看電影。 ◆　で　　　　　 ★　表並列　　例：木村さんは　きれいで、たいへん親切です。　　中国語：木村先生既美麗又情熱。 ◆　また　　　　　 ★　又、同時　　例：彼は有名な音楽家であり、また、陶芸家でもある。　　中国語：他是有名的音楽家、同時也是陶芸家。 【時間的な連続性、前後関係、条件の指定】 ◆　それから　　　 ★　然後　　例：晩ご飯を食べます。それから　テレビを見ます。　　中国語：吃過晩飯。然後看電視。 ◆　～て、～て ★　…後　　例：晩ご飯を　食べて、テレビを　見て、日本語を勉強します。　　中国語：在吃過晩飯、看電視後、学習日語。 ◆　～てから　　　 ★　…後　　例：晩ご飯を　食べてから　テレビを見ます。　　中国語：在吃過晩飯後、看電視。 ◆　～とき　　　　 ★　…時　　例：会社へ行くとき、いつも電車で行きます。　　中国語：経常乗電車、去公司。（去公司時、経常乗電車。） ◆　～まえに　　 ★　在…前　　例：寝る前に、日本語を勉強します。　　中国語：在睡覚前、学習日語。 【前の文と対立し、問題提起、或は意見を表わす。予想、期待に反する結果を言う】 ◆　～が　　　　　 ★　有逆接与順接両種用法、　　①順接　　例：今日はここまでにしますが、何かご質問は。　　中国語：今天就講到這、還有什幺問題？ 　　②逆接（但是）　　例：日本の食べ物はおいしいですが、高いです。　　中国語:日本的食品好吃、但是価格貴。 ◆　けれども　　　 ★　但是　　例：見学はおもしろいです。けれども、質問の時間が短いと思います。　　中国語：参観学習是非常有趣的。但是、我認為提問題的時間太短了。 ◆　しかし　　　　 ★　但是　　　例：たくさん食べた。しかし、お腹がいっぱいにならない。　　　中国語：吃了很多、但是肚子不覚得飽。 ◆　だが　　 ★　但是、可是　　　例：一生懸命勉強した。だが、安心はできない。　　　中国語：竭尽全力努力学習。但是、還是不放心。 ◆　でも　　　　　 ★　但是、不過　　　例：カメラが欲しいです。　でも、お金がありません。　　　中国語：想要照相機。不過、没有銭。 ◆　ところが　　　 ★　然而、可是　　　例：万事まるく収まるはずだった。ところが　とんでもないことになった。　　　中国語：一切本応該非常順調。可是　予想不到的事発生了。　 【前に示す理由、条件により、結果や意見、理由を述べる】 ◆　だから　　　　 ★　因此、所以　　例：彼はけちんぼうだ．だから，みなに嫌われる。　　中国語：他是個吝嗇鬼、所以、大家都不喜歓他。 ◆　～たら ★　如果…的話　　例：もし　明日、雨が　降ったら、うちにいます。　　中国語：如果明日下雨的話、就呆在家里。 ◆　～と　　　　　 ★　（如果）…就… 　　例：この道をまっすぐ行く　と、右に工場があります。　　中国語：沿着這条路直走、工場就在右辺。 ◆　なぜなら ★　原因是… 　　例：私は夏がきらいです。なぜなら、暑いし、泳げないから。　　中国語：我不喜歓夏天、原因是：太熱了、并且不会游泳。 【前に示した文に対して、同じ意味で別の表現をする】 ◆　すなわち　　　　　　中国語：也就是説…、換言之… 　　例：痩せるということは、すなわち、体重が減ることだ。　　中国語：説起減肥、換句話説、就是減少体重。 ◆　つまり　　　　 　　　中国語：也就是説…、換句話説　　例：彼が嫌われるのも、つまり　実力がないからだ。　　中国語：他被嫌棄、（換句話説）是因為没有実力的原因。 ◆　要するに　　　　 ★　総之…、換句話説… 　　例：太り過ぎだよ。要するに、食べ過ぎだね。　　中国語：太胖、換句話説就是吃的太多。 【それまでの話と話題を変える時に使う表現】 ◆　さて　　　　　　 ★　那幺…（話題的転換）　　例：さて、雑談はそれぐらいにして本題に入りましょう。　　中国語：那幺閑談就到此為止、進入正題。 ◆　ところで　　　 ★　順便提一下（話題的転換）　　例：今日は楽しかったですね。ところで　お嬢さんはお元気ですか。　　中国語：今日高興。順便問一下、小嬢好宅? ◆　それでは ★　那幺…（話題的転換）　　例：それではこれで失礼します。　　中国語：那幺我就失陪了。 【前述の事柄に追加あるいは補充する】 ◆　しかも　　　　　 ★　而且、并且　　例：わたしの部屋は広くて、しかも明るい。　　中国語：我的屋子大而且明亮。 ◆　なお　　　　　　 ★　此外、而且 　　例：会議は以上で終ります。なお、次回は水曜日です。　　中国語：会議就此結束。此外、下一次定于周三進行。 ◆　その上 ★　而且、并且　　例：雨が降り出し、その上雷まで鳴りだした。　　中国語：下起雨来、而且開始打雷。 【どちらかを選ぶ】 ◆　それとも　　　 ★　還有、戓者　　例：お土産は人形がいいですか。それとも　お菓子がいいですか。　　中国語：禮物是選択玩偶好、還是点心好呀？ ◆　または　　　　 ★　戓者　　例：傘、または　レインコートを準備して来てください。　　中国語：請準備一下傘戓者雨衣。 ◆　もしくは ★　戓者　　例：雨、もしくは雪になるでしょう。　　中国語：快要下雨戓者下雪了吧。馬鹿（ばか baka）：就是电视里日本兵常说的“八嘎”。是愚蠢、傻瓜、笨脑子的意思。很常用。 貴様（きさま ki sa ma）：男性对对方轻蔑的称呼，也用在亲近人的随便称呼。</div>
<img src ="http://www.blogjava.net/HotJava/aggbug/74345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/HotJava/" target="_blank">HotJava</a> 2006-10-10 17:58 <a href="http://www.blogjava.net/HotJava/archive/2006/10/10/74345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各个框架缺点</title><link>http://www.blogjava.net/HotJava/archive/2006/10/05/73466.html</link><dc:creator>HotJava</dc:creator><author>HotJava</author><pubDate>Thu, 05 Oct 2006 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/HotJava/archive/2006/10/05/73466.html</guid><wfw:comment>http://www.blogjava.net/HotJava/comments/73466.html</wfw:comment><comments>http://www.blogjava.net/HotJava/archive/2006/10/05/73466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/HotJava/comments/commentRss/73466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/HotJava/services/trackbacks/73466.html</trackback:ping><description><![CDATA[
		<p>下面开始比较各个框架，仅摘要如下，请恕本人只看缺点，不看优点。因为优点是说不完的<br />Struts: used since June 2001 - same time 1.0 was released.<br />Spring MVC: used since January 2004 - before 1.0 was released.<br />WebWork: used since July 2004.<br />Tapestry: used since July 2004.<br />JSF: used since July 2004 - both Sun’s RI and MyFaces. </p>
		<p>Struts缺点：</p>
		<p>ActionForms - they’re a pain<br />Can’t unit test - StrutsTestCase only does integration<br />Project has been rumored as “dead”</p>
		<p>Display Tag：</p>
		<p>Spring MVC缺点：</p>
		<p>Configuration intensive - lots of XML<br />Requires writing lots of code in JSPs<br />Almost too flexible - no common parent Controller</p>
		<p>WebWork缺点：</p>
		<p>Small Community<br />Documentation is poorly organized</p>
		<p>Tapestry缺点：</p>
		<p>Documentation very conceptual, rather than<br />pragmatic<br />Steep learning curve - very few examples<br />Long release cycles - major upgrades every year</p>
		<p>JSF缺点：</p>
		<p>Tag soup for JSPs<br />Doesn't play well with REST or Security<br />No single source for implementation</p>
		<p>SiteMesh：</p>
		<p> </p>
		<p>IDE支持</p>
		<p>Struts has a lot of IDE support and even has frameworks built on top of it (i.e. Beehive’s PageFlow)<br />Spring has Spring IDE - only does XML validation, not a UI/web tool<br />WebWork has EclipseWork<br />Tapestry has Spindle - great for coders<br />JSF has many, and they're getting better and better</p>
<img src ="http://www.blogjava.net/HotJava/aggbug/73466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/HotJava/" target="_blank">HotJava</a> 2006-10-05 15:05 <a href="http://www.blogjava.net/HotJava/archive/2006/10/05/73466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>遇到得问题</title><link>http://www.blogjava.net/HotJava/archive/2006/09/27/72375.html</link><dc:creator>HotJava</dc:creator><author>HotJava</author><pubDate>Wed, 27 Sep 2006 11:42:00 GMT</pubDate><guid>http://www.blogjava.net/HotJava/archive/2006/09/27/72375.html</guid><wfw:comment>http://www.blogjava.net/HotJava/comments/72375.html</wfw:comment><comments>http://www.blogjava.net/HotJava/archive/2006/09/27/72375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/HotJava/comments/commentRss/72375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/HotJava/services/trackbacks/72375.html</trackback:ping><description><![CDATA[
		<p>难怪连接不了，以前得<br />&lt;hibernate-configuration&gt;</p>
		<p>&lt;session-factory&gt;</p>
		<p>&lt;!-- Database connection settings --&gt;<br />&lt;property name="connection.driver_class"&gt;com.microsoft.jdbc.sqlserver.SQLServerDriver&lt;/property&gt;<br />&lt;property name="connection.url"&gt;jdbc:microsoft:sqlserver://localhost:1433/First&lt;/property&gt;<br />&lt;property name="connection.username"&gt;sa&lt;/property&gt;<br />&lt;property name="connection.password"&gt;123&lt;/property&gt;</p>
		<p>&lt;!-- JDBC connection pool (use the built-in) --&gt;<br />&lt;property name="connection.pool_size"&gt;1&lt;/property&gt;</p>
		<p>&lt;!-- SQL dialect --&gt;<br />&lt;property name="dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/property&gt;</p>
		<p>&lt;!-- Enable Hibernate's automatic session context management --&gt;<br />&lt;property name="current_session_context_class"&gt;thread&lt;/property&gt;</p>
		<p>&lt;!-- Disable the second-level cache  --&gt;<br />&lt;property name="cache.provider_class"&gt;<br />org.hibernate.cache.NoCacheProvider<br />&lt;/property&gt;</p>
		<p>&lt;!-- Echo all executed SQL to stdout --&gt;<br />&lt;property name="show_sql"&gt;true&lt;/property&gt;</p>
		<p>&lt;!-- Drop and re-create the database schema on startup --&gt;<br />&lt;property name="hbm2ddl.auto"&gt;create&lt;/property&gt;<br />&lt;mapping resource="aa/FirstDemo.hbm.xml" /&gt;</p>
		<p>&lt;/session-factory&gt;</p>
		<p>&lt;/hibernate-configuration&gt;<br /><br />----------------------------------------------------------------------------------<br />&lt;session-factory&gt;<br />&lt;property name="connection.username"&gt;sa&lt;/property&gt;<br />&lt;property name="connection.url"&gt;jdbc:microsoft:sqlserver://localhost:1433;databasename=First&lt;/property&gt;这里写错了晕<br />&lt;property name="dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/property&gt;<br />&lt;property name="myeclipse.connection.profile"&gt;ballacks&lt;/property&gt;<br />&lt;property name="connection.password"&gt;sa&lt;/property&gt;<br />&lt;property name="connection.driver_class"&gt;com.microsoft.jdbc.sqlserver.SQLServerDriver&lt;/property&gt;<br />&lt;property name="show_sql"&gt;true&lt;/property&gt;<br />&lt;mapping resource="bean/Classes.hbm.xml" /&gt;<br />&lt;mapping resource="bean/Student.hbm.xml" /&gt;</p>
		<p>&lt;/session-factory&gt;<br /><br /></p>
<img src ="http://www.blogjava.net/HotJava/aggbug/72375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/HotJava/" target="_blank">HotJava</a> 2006-09-27 19:42 <a href="http://www.blogjava.net/HotJava/archive/2006/09/27/72375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>