﻿<?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-执手麦田的咖啡空间</title><link>http://www.blogjava.net/kwbb/</link><description>专注于Java的学习研究</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 19:00:10 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 19:00:10 GMT</pubDate><ttl>60</ttl><item><title>个人 GRUB 学习笔记(4)--转</title><link>http://www.blogjava.net/kwbb/archive/2007/05/16/117925.html</link><dc:creator>执手麦田</dc:creator><author>执手麦田</author><pubDate>Wed, 16 May 2007 12:06:00 GMT</pubDate><guid>http://www.blogjava.net/kwbb/archive/2007/05/16/117925.html</guid><wfw:comment>http://www.blogjava.net/kwbb/comments/117925.html</wfw:comment><comments>http://www.blogjava.net/kwbb/archive/2007/05/16/117925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kwbb/comments/commentRss/117925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kwbb/services/trackbacks/117925.html</trackback:ping><description><![CDATA[九、制作 GRUB 引导软盘<br><br>GRUB 不仅可以安装在硬盘上，也可以安装在软盘。有两种方式可用于创建 GRUB 引导软盘，区别在于后者带有文件系统，而前者只有<br><br>boot loader 本身。如果你误删除那些 stage 文件，后一种方式就大大有用了。<br><br>第一种 ：用 dd 命令创建 GRUB 软盘<br><br><br>[Copy to clipboard]CODE:<br>a）按照 ./configure , make ,make install 的步骤安装 GRUB<br><br>b）dd if=/usr/local/share/grub/i386-pc/stage1 of=/dev/fd0 <br><br>c）dd if=/usr/local/share/grub/i386-pc/stage2 of=/dev/fd0 seek=1<br><br>d）这样就创建好一张 GRUB 引导软盘了。<br><br><br>第二种 ：用 grub-install 创建带文件系统的 GRUB 引导软盘<br><br><br>[Copy to clipboard]CODE:<br>a）同样是先安装 GRUB <br><br>b）mke2fs /dev/fd0<br><br>c）mount /dev/fd0 /mnt/floppy<br><br>d）grub-install &#8211;-root-directory=/mnt/floppy &#8216;(fd0)&#8217;<br><br>e）这样软盘上就会有一个 /boot/grub/ 目录，下面就是那些 stage 文件了。<br><br>f）上面的两种方法做出来的软盘都只能进入 GRUB 命令模式，你可能会觉得不爽，是否可以直接进入菜单呢？答案是可以的，只需要多一个步骤 ：<br><br>g）把 /boot/grub/ 目录下的 device.map ，grub.conf ，menu.lst 统统拷贝到 /mnt/floppy/boot/grub 目录下，这样就可以了。因为之前 GRUB <br><br>在软盘上找不到配置文件，所以自动进入命令模式，现在用它启动机器就可以直接进入菜单模式了。<br><br><br>十、使用 GRUB 通过网络引导操作系统<br><br>GRUB 不仅可以从本地硬盘引导操作系统，还可以通过网络引导操作系统内核。<br><br>假使你由于某种原因，无法启动操作系统。这时你需要在别的空闲的机器上先 build 一份GRUB ，并安装到一张软盘上。<br><br>不过由于要支持网络功能，所以 ./configure 时有所不同了 ：你必须指定启用网络功能，和网卡芯片的型号 ：（具体参考 netboot/README.netboot 文件）。<br><br>由于测试机器的网卡芯片是 RTL-8139 ，所以加上 &#8211;-enable-rtl8139 ，整个过程就是（在别的空闲的机器上进行的） ：<br><br><br>[Copy to clipboard]CODE:<br># rpm &#8211;e grub （删除原来的 GRUB rpm，如果没有装就不用了）<br># ./configure &#8211;-enable-diskless &#8211;-enable-rtl8139 （这是故障主机的网卡型号）<br># make<br># make install<br># cp &#8211;fa /usr/local/share/grub/i386-pc/* /boot/grub/<br># grub-install /dev/hda<br># mke2fs /dev/fd0 (格式化软盘，建立 ext2 文件系统)<br># mount /dev/fd0 /mnt/floppy<br># grub-install &#8211;-root-directory=/mnt/floppy &#8216;(fd0)&#8217; <br><br>检查 /mnt/floppy 下是否有 nbgrub 和 pxegrub 两个文件，这两个文件就是用于网路启动的。如果<br><br>没有，就从 /boot/grub/ 目录拷贝到 /mnt/floppy/boot/grub/ 目录下。切记切记！！<br><br>这样你就制作好了一张带有 stage 文件，支持网络引导，且带有网卡驱动的 GRUB 引导盘了。<br><br>接下来就是 TFTP 服务器方面的工作了 ：<br><br><br>-）1、启动 TFTP 服务器（编辑 /etc/xinetd.d/tftp 文件，把 disalbe改为 no）。<br><br>-）2、检查防火墙配置，确保故障主机可以顺利访问该 TFTP 服务器<br><br>-）3、找出一台和故障机器具有相同内核的主机，把 /boot/vmlinuz-2.xx 和 /boot/initrd-2.xx.img 拷贝到 TFTP 服务器的 /tftpboot/boot 目录下<br><br>-）4、把这张软盘插入故障机器的软驱并用它启动机器，就会自动进入 GRUB 命令模式。<br><br>-）5、执行 ifconfig 命令将会显示下面的画面<br><br><br><br>-）6、下面开始设置 ip 信息了 ：（ifconfig 命令可以分成多次执行）<br><br>-）7、现在网卡 ip 和 TFTP 服务器的地址都已经设置了。<br><br><br><br>-）8、下面设置 root device、kernel、initrd 。注意 root 括号中是 nd ，切记切记！！！<br><br><br><br>当你执行 boot 时，内核将被解压并执行，一切就和往常一样。<br><br><br><br>补充 ：如果你的网络有 dhcp 服务器，则可以直接执行 dhcp 命令来代替 ifconfig 命令获取 ip 信息<br><br>十一、把配置文件嵌入到 GRUB 中<br><br>这里介绍一种比较少见的情况。有时我们会遇到主机不带显示器/键盘，但由于某些原因需要重启主机并访问 GRUB，<br><br>这时怎么办？你可能会说用串口连接。不错，通过串口的确可以控制 GRUB ，但有一个问题，即使你把笔记本连接到该主机上，<br><br>但启动时 GRUB 并不会自动使用笔记本的键盘，又如何通过笔记本控制GRUB 呢？<br><br>GRUB 支持一个功能叫做 preset menu（预设菜单），工作原理 ：<br><br>a）GRUB 检查是否启用了 preset menu 功能，如果是的话，加载 preset menu 文件（不是 grub.conf）<br><br>b）GRUB 加载 grub.conf ，这个过程是一定会执行的，不管有没有 preset menu 存在。<br><br>c）在 grub.conf 被加载后，不管 grub.conf 有没有引导项目，只要 preset menu 含有任何引导条目，都会被清掉。只有 grub.conf <br><br>文件不可用时，preset menu 的内容才会被保留。<br><br>看到这里，我想你应该明白 preset menu 怎么用了。我们可以定义一个文件 pre-menu.conf ，内容是把显示切换到 COM1 上 ，grub.conf 则是正常的内容。<br><br>然后把笔记本接到故障主机的 COM1，启动超级终端。再启动故障主机，GRUB 会先把显示切换到 COM1 ，然后加载 grub.conf ，后面的过程就和普通情况没<br><br>有什么不同。<br><br><br>[Copy to clipboard]CODE:<br>要使用 preset-menu ，你必须在执行 configure 脚本时指定 &#8211;-preset-menu ，例如<br>#./configure &#8211;-preset-menu=pre-menu.conf<br># make<br># make install<br>pre-menu.conf 文件的内容就是下面两句 ：<br>serial &#8211;-unit=0 &#8211;-speed=9600<br>terminal &#8211;-timeout=0 serial <br><br>注意，当内核开始执行时，显示也就交回给原来的主机，而不再是你的笔记本了。要解决该问题，<br><br>可以在显示菜单是进入命令模式，在 kernel 行后面加上 console=ttyS0，这样 boot 时就可以在超级终端上看到启动的信息了。<br><br>不过在 login 提示符出现时，显示输出又会回到原来的故障主机上了。这时你可以用 secureCRT 来登录了，不需要再用到超级终端了。<br><br>整体效果如下图 ：（通过串口看的）<br><br><br><br>选择引导 Red Hat 9 项目 ：<br><br><br><br>一旦你不想使用preset-menu了，是否直接删除 pre-menu.conf 就可以呢？<br><br>不可以。因为 pre-menu.conf 已经被嵌入到 grub 中了，这时留在硬盘上的 pre-menu.conf 文件其实已经没有用了。要象取消 preset-menu 功能，<br><br>必须重新 congfiure ，并去掉 &#8211;-enable-preset-menu 选项，再重新安装 GRUB 。<br><br>十二、总结<br><br>写了这么多，现在总结一下大概的内容<br><br>a）GRUB 是一种 boot loader ，它分成两个阶段 ：stage1 和 stage2（中间可能有 stage 1.5）<br><br>b）stage1 嵌入到 MBR 或者 PBR 中，stage2 留在文件系统中。<br><br>c）build GRUB三部曲 ：configure 、make、make install、<br><br>d）grub-install 和 grub shell 都可以用于安装 stage1 ，但 grub-install 功能更加强大<br><br>e）GRUB 支持菜单模式、命令模式。命令模式下的快捷键 ：c、o、O、e、d、ESC<br><br>f）使用 GRUB 口令保护 GRUB 设置<br><br>g）GRUB 支持从网络引导操作系统，不过在编译时事先指定 &#8211;-enable-diskless 和网卡驱动。可惜的是，GRUB 支持的网卡驱动不多。<br><br>h）GRUB 支持通过串口来访问 GRUB 的命令和菜单模式<br><br>i）GRUB 可以把配置文件事先嵌入到 GRUB ，但删除时也需要重装 GRUB 。<br><br>十三、个人建议<br><br>当安装好操作系统后，应该做好下面几项工作<br><br>a）安装光盘（建议刻成 ISO 文件便于保存）<br><br>b）制作一张 bootdisk 用于引导操作系统<br><br>c）制作一张带文件系统的 GRUB 引导盘用于引导 GRUB，也可以自带配置文件。<br><br>d）将 MBR 或者 PBR 备份成文件
<img src ="http://www.blogjava.net/kwbb/aggbug/117925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kwbb/" target="_blank">执手麦田</a> 2007-05-16 20:06 <a href="http://www.blogjava.net/kwbb/archive/2007/05/16/117925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GRUB 学习笔记(3)--转</title><link>http://www.blogjava.net/kwbb/archive/2007/05/16/117924.html</link><dc:creator>执手麦田</dc:creator><author>执手麦田</author><pubDate>Wed, 16 May 2007 12:05:00 GMT</pubDate><guid>http://www.blogjava.net/kwbb/archive/2007/05/16/117924.html</guid><wfw:comment>http://www.blogjava.net/kwbb/comments/117924.html</wfw:comment><comments>http://www.blogjava.net/kwbb/archive/2007/05/16/117924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kwbb/comments/commentRss/117924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kwbb/services/trackbacks/117924.html</trackback:ping><description><![CDATA[七、GRUB 和 stage 文件<br><br>GRUB 含有几个 images 文件，两个基础（必需的）stages 文件（stage1和 stage2），可选的 stage（也称为 stage1.5）,和两个网络引导的images 文件<br><br>nxgrub 和 pxegrub）。stage1 是用于引导 GURB 的一个必须的映象文件。通常它是被嵌入到 MBR。或者一个分区的引导扇区之中。因为 PC 的引导扇区是 <br><br>512 字节，所以 stage1 也是 512 字节。stage1 的作用就是从一个本地磁盘加载 stage 2 或者 stage 1.5 。因为大小的限制，stage1 对 stage2 或者 <br><br>stage 1.5 的位置进行编码，也就是说，stage1 是无法识别文件系统格式的。stage2 是 GRUB 的核心映象。它几乎处理所有的事情（除了加载它自己），<br><br>通常可以把他放在文件系统上，但不是必须的。<br><br>一旦你执行了 grub-install 安装了 boot loader ，stage1 文件就不是必须的，可以把它移动到任意位置，因为它已经被嵌入到 MBR 或者 PBR 了。<br><br>stage1和stage2 文件一般位于 /boot/grub/ 目录下，在这个目录下还有很多 stage 1.5 的文件，而且都是以文件系统格式命名的。它们的目的是在 stage1 <br><br>和 stage2之间搭建一个桥梁，也就是 stage 1 加载 stage 1.5, stage 1.5 加载 stage2。stage1 和 stage 1.5 的不同之处是 stage1 无法识别文件系统，<br><br>stage 1.5 可以。因为 Stage2 太大了，无法被嵌入到某个固定的区域，而 Stage1.5可以安装在 MBR 之后的位置。<br><br>至于 nxgrub 和 pxegrub 我们在第10节才介绍。<br><br>八、GRUB 常见错误信息<br><br>我们把出错信息分成3类，stage1 阶段的、stage 1.5 阶段的、stage2 阶段。后两个可以合在一起。<br><br>8．1 Stage1 阶段可能出现的错误 ：<br><br>GRUB 对于该阶段出现的错误一般是打印一个出错信息并挂起机器，除非按CTRL-ALT-DEL 重启。<br><br>a） Hard Disk Error ：表示无法判读 stage 1.5 文件所在的磁盘的大小和 CHS 参数<br><br>b）Floppy Error ：表示无法 stage 1.5 文件所在的软盘的大小和 CHS 参数<br><br>c）Read Error ：表示无法读取 stage 1.5 文件或者 stage2 文件<br><br>d）Geom Error ：stage2 或者 stage 1.5 位于 BIOS 的 read 调用可以访问的范围之外。<br><br>8.2 Stage 1.5/2 阶段可能出现的错误 ：<br><br>一般会打印一个 &#8220;Error <n>&#8220;的错误信息，并根据错误的严重程度看是否继续进行。<br><br><br>QUOTE:<br>1 : Filename must be either an absolute filename or blocklist<br>解释 ：1号错误表示文件名格式错误。在 GRUB 中要么是以绝对路径给出文件<br>例子 ：<br>grub&gt; kernel vmlinuz root=label=/<br>Error 1: Filename must be either an absolute pathname or blocklist<br>grub&gt;<br><br><br><br><br>QUOTE:<br>2 : Bad file or directory type<br>解释 ：2号错误表示命令期望的是一个普通文件，但相应文件名的对象是一个符号链接、目录、FIFO<br>例子 ：<br>grub&gt; kernel /testdir root=LABEL=/<br>Error 2: Bad file or directory type<br>grub&gt;<br><br><br><br><br>QUOTE:<br>3 : Bad or corrupt data while decompressing file<br><br>解释 ：3号错误表示解压文件时发生错误。可能是因为这个文件被损坏了<br><br><br><br><br>QUOTE:<br>4 : Bad or incompatible header in compressed file<br>解释 ：4号错误表示压缩文件的头部格式不被兼容或者错误<br><br><br><br><br>QUOTE:<br>5 : Partition table invalid or corrupt<br>解释 ：5 号错误表示分区表无效或者被破坏。这是一个不好的预兆<br><br><br><br><br>QUOTE:<br>6 : Mismatched or corrupt version of stage1/stage2<br>解释 ：6号错误表示 install 命令发现 stage1 和 stage2 的颁布号不被兼容<br><br><br><br><br>QUOTE:<br>7 : Loading below 1MB is not supported<br>解释 ：This error is returned if the lowest address in a kernel is below<br>the 1MB boundary. The Linux zImage format is a special case and<br>can be handled since it has a fixed loading address and maximum size<br><br><br><br><br>QUOTE:<br>8 : Kernel must be loaded before booting<br>解释 ：8号错误表示执行 boot 命令之前没有先执行 kernel 命令<br><br><br><br><br>QUOTE:<br>9 : Unknown boot failure<br>解释 ：9 号错误表示未知的引导错误<br><br><br><br><br>QUOTE:<br>10 : Unsupported Multiboot features requested<br>解释 ：10 号错误表示请求 Multiboot header 所要求功能不被 GRUB 所支持。<br><br><br><br><br>QUOTE:<br>11 : Unrecognized device string<br>解释 ：11 号错误表示无法识别的设备字符串。<br>例子 ：<br>grub&gt; root hd0<br>Error 11: Unrecognized device string<br>grub&gt;<br><br><br><br><br>QUOTE:<br>12 : Invalid device requested<br>解释 ：12 号错误表示请求的设备无效<br>例子 ：<br>grub&gt; root (hd2)<br>Error 21: Selected disk does not exist<br>grub&gt; kernel /grub/grub.conf root=LABEL=/<br>Error 12: Invalid device requested<br>grub&gt;<br><br><br><br><br>QUOTE:<br>13 : Invalid or unsupported executable format<br>解释 ：13 号错误表示无效或者无法识别的可执行格式<br>例子 ：<br>grub&gt; kernel /grub/grub.conf root=LABEL=/<br>Error 13: Invalid or unsupported executable format<br>grub&gt;<br><br><br><br><br>QUOTE:<br>14 : Filesystem compatibility error, cannot read whole file<br>解释 ：14 号错误表示文件系统兼容性错误，无法读取整个文件<br><br><br><br><br>QUOTE:<br>15 : File not found<br>解释 ：请求的文件无法找到<br>例子 ：<br>grub&gt; find /grub-noexist/grub.conf<br>Error 15: File not found<br>grub&gt;<br><br><br><br><br>QUOTE:<br>16 : Inconsistent filesystem structure<br>解释 ：16 号错误表示不一致的文件系统结构。可能是文件系统结构被破坏了。<br><br><br><br><br>QUOTE:<br>17 : Cannot mount selected partition<br>解释 ：17号错误表示无法挂载指定分区。例如 swap 分区<br>例子 ：<br>grub&gt; root (hd0,2) 这是一个 swap 分区<br>Filesystem type unknown, partition type 0x82 <br>grub&gt; kernel /vmlinuz<br>Error 17: Cannot mount selected partition<br>grub&gt;<br><br><br><br><br>QUOTE:<br>18 : Selected cylinder exceeds maximum supported by BIOS<br>解释 ：18 号错误表示选择的柱面超过了 BIOS 支持的最大能力。这通常发生在不支持 LBA 模式<br>的硬盘上。<br><br><br><br><br>QUOTE:<br>19 : Linux kernel must be loaded before initrd<br>解释 ：19 号错误表示执行 initrd 命令前必须先执行 kernel 命令<br><br><br><br><br>QUOTE:<br>20 : Multiboot kernel must be loaded before modules<br>解释 ：20 号错误表示执行 module 或者 moduleunzip 命令前必须先执行 kernel 命令<br><br><br><br><br>QUOTE:<br>21 : Selected disk does not exist<br>解释 ：21 号错误表示选择的磁盘不存在<br>例子 ：<br>grub&gt; root (hd2)<br>Error 21: Selected disk does not exist<br>grub&gt;<br><br><br><br><br>QUOTE:<br>22 : No such partition<br>解释 ：22 号错误表示分区不存在<br>例子 ：<br>grub&gt; root (hd0,10)<br>Error 22: No such partition<br>grub&gt;<br><br><br><br><br>QUOTE:<br>23 : Error while parsing number<br>解释 ：23 号错误表示参数解释错误，希望是一个数值，但参数却是其他类型<br>例子 ：<br>grub&gt; root (hda,0)<br>Error 23: Error while parsing number<br>grub&gt;<br><br><br><br><br>QUOTE:<br>24 : Attempt to access block outside partition<br>解释 ：24 号错误表示尝试访问的 block 超出了分区<br><br><br><br><br>QUOTE:<br>25 : Disk read error<br>解释 ：25 号错误表示磁盘读错误<br><br><br><br><br>QUOTE:<br>26 : Too many symbolic links<br>解释 ：26 号错误表示太多的符号连接（默认最多允许5个）<br><br><br><br><br>QUOTE:<br>27 : Unrecognized command<br>解释 ：无法识别的命令<br><br><br><br><br>QUOTE:<br>28 : Selected item cannot fit into memory<br>解释 ：选择的对象无法被加载到内存中。<br>例子 ：<br>[root@monitor boot]# dd if=/dev/zero of=vmlinuz-2.4.20-31.9 bs=1024 count=1 seek=1<br>读入了 1+0 个块<br>输出了 1+0 个块<br><br>[root@monitor boot]#grub<br>grub&gt; kernel /vmlinuz-2.4.20-31.9 root=label=/<br>[Linux-bzImage, setup=0x1400, size=0xfffff200]<br><br>Error 28: Selected item cannot fit into memory<br><br>grub&gt;<br><br><br><br><br>QUOTE:<br>29 : Disk write error<br>解释 ：磁盘写错误<br><br><br><br><br>QUOTE:<br>30 : Invalid argument<br>解释 ：无效参数<br>例子 ：<br>grub&gt; serial --noarg=0<br>Error 30: Invalid argument<br>grub&gt;<br><br><br><br><br>QUOTE:<br>31 : File is not sector aligned<br>解释 ：This error may occur only when you access a ReiserFS partition by<br>block-lists (e.g. the command `install'). In this case, you should<br>mount the partition with the `-o notail' option.<br><br><br><br><br>QUOTE:<br>32 : Must be authenticated<br>解释 ：要求输入口令才能继续进行下面的操作。例如配置文件中有 password 或者 lock 命令<br>例子 ：<br>password root1234<br>title DOS<br>lock<br>rootnoverify (hd0,0)<br>chainloader +1<br><br><br><br><br>QUOTE:<br>33 : Serial device not configured<br>解释 ：33 号错误表示串口还没有配置。这一般发生在你执行 terminal serial 的时候<br><br><br><br><br>QUOTE:<br>34 : No spare sectors on the disk<br>解释 ：磁盘自由空间不足。可能发生在把 stage 1.5 嵌入到 MBR 之后的空间的时候。但这部分空间可能已经被分区表使用了
<img src ="http://www.blogjava.net/kwbb/aggbug/117924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kwbb/" target="_blank">执手麦田</a> 2007-05-16 20:05 <a href="http://www.blogjava.net/kwbb/archive/2007/05/16/117924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GRUB 学习笔记(2)--转</title><link>http://www.blogjava.net/kwbb/archive/2007/05/16/117923.html</link><dc:creator>执手麦田</dc:creator><author>执手麦田</author><pubDate>Wed, 16 May 2007 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/kwbb/archive/2007/05/16/117923.html</guid><wfw:comment>http://www.blogjava.net/kwbb/comments/117923.html</wfw:comment><comments>http://www.blogjava.net/kwbb/archive/2007/05/16/117923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kwbb/comments/commentRss/117923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kwbb/services/trackbacks/117923.html</trackback:ping><description><![CDATA[四、GRUB 接口<br><br>GRUB 除了菜单模式，还提供了一个命令模式和 grub shell 。当系统启动并显示菜单时，按 c 键就可以进入命令模式。提示符是 grub&gt; 。<br><br>如果你已经成功引导操作系统并登录，可以在 shell 提示符下执行 grub ，这会启动一个 grub shell。提示符也是 grub&gt; 。<br><br>GRUB 能够象 bash 一样使用上下键来访问 command history ，ctrl-u、ctrl-k、ctrl-l 等快捷键也可以使用。想要编辑菜单，可以按下 e 键；<br><br>想要新增一空白行，可以按下 o 键（当前行之后）或者 O 键（当前行之前）。想要删除当前行，按下 d 键；ESC 键放弃当次修改并返回上级菜单。<br><br>有些命令只能在命令模式下，有些命令只能用于配置文件（菜单模式），有些命令在两个模式下都可以使用。下面我们就介绍 GRUB 常用的命令。<br><br>五、GRUB 常用命令<br><br>5.1 只能用于配置文件的命令<br><br>下面这5个命令只能出现于配置文件中，分别是 ：<br><br>a）default ：定义默认引导的操作系统。0 表示第一个操作系统，1表示第2个，依此类推<br><br>b）fallback ：如果 default 所指定的操作系统引导失败，则默认引导由 fallback 指定的操作系统<br><br>c) hiddenmenu ：用于启动时隐藏菜单，除非在 timeout 之前按下 ESC 才能看到菜单。<br><br>d）timeout ：定义多少秒内如果用户没有按下键盘上的某个按键，就自动引导 default 所指定的操作系统。<br><br>e）title ：定义引导项目的名称。<br><br>f）password ：用于定义进入 GRUB 命令模式的密码。你还可以为每个操作系统都定义一个密码，方法是把 password 命令放在 title行之后。<br><br>而且每个操作系统的引导密码可以不同，也可以和进入命令模式的那个密码不同，最大程度的保证 GRUB 的安全。 <br><br>5.2 只能用于命令模式或者 grub shell 的命令<br><br>a）device ：用于定义 BIOS 中的磁盘设备和操作系统的磁盘设备之间的映射关系。<br><br>例如 device （hd0）/dev/hdb 把 BIOS 中的第一个硬盘相当于 Linux 的 /dev/hdb<br><br>b）serial ：用于初始化一个串口设备。<br><br>例如 ：serial &#8211;-unit=0 &#8211;-speed=9600 表示初始化 COM1（--unit=0），速率为 9600 Baud<br><br>不过 grub shell 下执行该命令会显示 &#8220;无法识别的命令&#8221;<br><br>c）terminal ：用于切换显示输出。有两这个值可选 ：console 和 serial 。当你把笔记本接到一个没有显示器/键盘的主机上时，执行 <br><br>terminal serial 就可以在你的笔记本上操作这台主机的 GRUB 了。执行 terminal console 把显示输出还原到该主机。<br><br>不过 grub shell 下执行该命令会显示&#8220;无法识别的命令&#8221;<br><br>d）splashimage ：用于定义启动时的背景图片。例如 splashimage /grub/splash.xpm.gz<br><br>经过测试，发现用 tarball 安装的不支持该命令，这似乎是 redhat grub rpm 专有的。<br><br>e）blocklist ：用于显示某个文件在文件系统中的位置，以 block list 的形式显示。例如 blocklist /vmlinuz<br><br>f）ca ：用于显示文件内容。由于 GRUB 可以直接访问多种文件系统，所以可以用 cat （hd0,1）/etc/passwd 来在 GRUB 命令模式下查看 /etc/passwd 文件<br><br>g）root ：用于指定含有 stage 文件的分区。如果有 /boot 分区，则 root device 就是 /boot 分区，否则 <br><br>就是 / 分区。<br><br>h）rootnoverify ：和 root 类似，但不会尝试挂载该分区。例如用于指定 windows 操作系统所在的分区。<br><br>i）chainloader ：用于加载另外一个 boot loader ，通常是用于加载 windows 的 boot loader 。它的参数是一个 block list ，<br><br>例如 chainloader (hd0,0)0+1 表示加载第一个磁盘的第一个分区的第1块，0 是开始位置（block 从0开始编号），+1 表示总共读取多少个 block。<br><br>所以 chainloader 2+0 表示读取第3个block （编号为2）<br><br>j）find ：可以用于在所有分区上搜索文件。注意，是所有分区，而不是某个分区。例如 find /vmlinuz 将会在所有分区上查找位于该分区的顶级目录下的<br><br>vmlinuz文件，如果找到就打印该分区名，例如 （hd0,1）。<br><br>k）geometry ：用于显示或者设置某个硬盘的 CHS 参数，同时还显示分区信息。例如 geometry (hd0) <br><br>l）halt ：关机<br><br>m）reboot ：重启机器<br><br>n）kernel ：指定操作系统内核文件，还可以在内核文件名后加上参数。例如 <br><br>kernel /vmlinuz ro root=LABEL=/ <br><br>表示以只读的方式挂载 / 分区，且根分区设备是 label 为 / 的那个设备；也可以直接给出设备名。<br><br>o）initrd ：用于指定 RAM Disk 文件，例如 initrd /initrd-2.xx.img 。<br><br>p）boot ：引导 kernel 所指定的内核，对于 linux 来说，必须先加载了 kernel 和 initrd 才能执行 boot 。<br><br>q）setup ：用于安装 stage1 到磁盘的 MBR 或者某个分区的引导扇区。<br><br>六、保护 GRUB 设置<br><br>下面是一个例子<br><br><br>[Copy to clipboard]CODE:<br>password &#8211;-md5 &lt;密码1&gt;<br>timeout=30<br>default=0<br>title &#8220;redhat AS 4&#8221;<br>password &#8211;-md5 &lt;密码2&gt;<br>root (hd0,1)<br>kernel /vmlinuz ro root=LABEL=/<br>initrd /initrd-xxx.img<br>title &#8220;windows&#8221;<br>password &#8211;-md5 &lt;密码3&gt;<br>rootnoverify （hd0,0）<br>chainloader +1<br><br>当出现 GRUB 菜单时，必须按下 p 并输入 &lt;密码1&gt; 才能进入命令模式，如果选择 &#8220;redhat AS 4&#8221;并按下回车，会出现提示信息，要求输入密码，<br><br>这时应该输入 &lt;密码2&gt;。同样只有输入 &lt;密码3&gt; 才能进入 windows 系统。--md5 告诉 GRUB 后面的内容是已经用 md5 算法加密过的了。所以 GRUB <br><br>会将你输入的口令用 MD5 加密后再与之比较。你可以命令模式下用md5crypt 命令或者在 shell 下执行 grub-md5-cypt 来得出一个字符串用 MD5 加密<br><br>后的结果，再插入到配置文件中。为每个引导项目设置 GRUB 密码有好处也有坏处 ：<br><br>a）好处是 ：你可以禁止用户随便引导某个操作系统，即使普通用户可以接触GRUB 菜单，没有密码也没有用；<br><br>b）坏处是 ：如果你一旦重启机器，就必须手工输入口令，否则会一直停在那里。如果你是在半夜远程重启某个主机的话&#8230;. Hoho <br><br>c）建议 ：只设置 GRUB 密码，也就是限制用户进入命令模式，具体菜单项不设置密码。 
<img src ="http://www.blogjava.net/kwbb/aggbug/117923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kwbb/" target="_blank">执手麦田</a> 2007-05-16 20:04 <a href="http://www.blogjava.net/kwbb/archive/2007/05/16/117923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GRUB 学习笔记(1)--转</title><link>http://www.blogjava.net/kwbb/archive/2007/05/16/117922.html</link><dc:creator>执手麦田</dc:creator><author>执手麦田</author><pubDate>Wed, 16 May 2007 12:02:00 GMT</pubDate><guid>http://www.blogjava.net/kwbb/archive/2007/05/16/117922.html</guid><wfw:comment>http://www.blogjava.net/kwbb/comments/117922.html</wfw:comment><comments>http://www.blogjava.net/kwbb/archive/2007/05/16/117922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kwbb/comments/commentRss/117922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kwbb/services/trackbacks/117922.html</trackback:ping><description><![CDATA[目录<br>1、GRUB 基础<br><br>2、命名习惯<br><br>3、安装 GRUB<br><br>4、GRUB 接口<br><br>5、GRUB 常用命令<br><br>6、保护 GRUB 设置<br><br>7、GRUB 和 stage 文件<br><br>8、GRUB 常见错误信息<br><br>9、制作 GRUB 引导软盘<br><br>10、使用 GRUB 通过网络引导操作系统<br><br>11、把配置文件嵌入到 GRUB 中<br><br>12、总结<br><br>13、个人建议<br><br><br><br>一、GRUB 基础<br><br>1.1 GRUB 简介<br><br>&#8220;boot loader&#8221;是计算机启动后第一个运行的软件。它负责加载一个操作系统的内核，并把控制权交给内核。内核则负责剩下的初始过程。<br><br>GRUB 一个很重要的特色就是灵活性；GRUB 可以识别文件系统和二进制格式的内核，所以你可以加载任何操作系统，而不需要记录内核在<br><br>磁盘上的物理位置。<br><br>1.2 GRUB 的现状<br><br>我不打算介绍 GRUB 的发展历史，有兴趣的朋友可以自己到官方站点或者执行 info grub 自行获取信息。我们着眼于 GRUB 当前的现状。<br><br>目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本号是 0.9x 以及之前的版本都称为 GRUB Legacy ，从 1.x 开始的就称为 GRUB 2。目前 <br><br>GRUB Legacy 已经停止开发了，只是出于一个 bug fix 的状态，不再增加新的功能了，所有的开发都转移到 GURB 2 之上了。<br><br>1.3 GRUB Legacy 和 GRUB 2 <br><br>GRUB 2 是源自于一个名为 PUPA 的项目，目的是建立下一代的 boot loader。GRUB 2 几乎是从零开始开始开发的，它和 GRUB Legacy 不<br><br>同的地方有很多，例如支持 scripts、国际化语言、动态加载模块、带有 resuce 模式等等，这些都是 GRUB Legacy 所没有的。<br><br>下面是 GRUB2 新特性的介绍 ：(原文请参<a href="http://www.gnu.org/software/grub/grub-2.en.html" target=_blank><font color=#22229c>http://www.gnu.org/software/grub/grub-2.en.html</font></a> ）<br><br>a）支持脚本语言，例如条件判断，循环、变量和函数<br><br>b）图形接口<br><br>c）在运行时动态加载需要的模块，而不是在 biuld 的时候指定加入那些模块（静态）<br><br>d）可以移植到不同的架构上<br><br>e）国际化语言。包括支持非ASCII的字符集和类似 gettext 的消息分类，字体，图形控制台等等。<br><br>f）实际内存管理。使得 GNU GRUB 更加具有可扩展性<br><br>g）针对文件系统、文件、设备、驱动、终端、命令、分区表、 os loder 的模块化、层次化、基于对象的框架<br><br>h）跨平台的安装，允许从另外一个架构上安装 GRUB <br><br>i）支持 rescue 模式，可用于系统无法引导的情况。stage 1.5 被取消了<br><br>j）修复 GRUB Legacy 设计上的错误，同时又保持向后的兼容性。<br><br>1.4 Multiboot 规范<br><br>Multiboot 规范是在 boot loader 和 kernel 之间的一个协议，用于统一各种引导操作系统的方法。Linux 和 BSD 目前并不支持该规范。<br><br>1.5 可用资源<br><br>GRUB 的 homepage <a href="http://www.gnu.org/software/grub/grub-legacy-faq.en.html" target=_blank><font color=#22229c>http://www.gnu.org/software/grub/grub-legacy-faq.en.html</font></a>）<br><br>info grub<br><br>1.6 旧版 GRUB（GRUB Legacy）的功能特色<br><br>a）识别多种可执行格式，支持 &#8220;a.out&#8221; , ELF, symbol tables）<br><br>b）支持 non-Multiboot 内核。主要是FreeBSD、NetBSD、OpenBSD、Linux。<br><br>c）支持加载多个模块<br><br>d）支持配置文件<br><br>e）提供菜单接口。菜单项的数量并没有限制，目前版本支持数百个菜单条目<br><br>f）有一个灵活的命令行接口。如果没有配置文件存在，GRUB 会自动进入命令模式<br><br>g）支持多种文件系统格式。主要有BSD FFS&#8221;、&#8220;DOS FAT 16 、FAT32&#8221;，&#8220;Minix fs&#8221;、ext2/ext3、ReiserFS 、jfs、xfs、VSTa fs<br><br>h）支持自动解压<br><br>i）能够访问任何已经安装的设备上的数据<br><br>j）Be independent of drive geometry translations （这个不知道怎么翻译好）<br>Unlike many other boot loaders, GRUB makes the particular drive<br>translation irrelevant. A drive installed and running with one<br>translation may be converted to another translation without any<br>adverse effects or changes in GRUB's configuration.<br><br>k）检测所有已经安装的 RAM<br><br>l）支持 LBA 模式。在传统的磁盘调用（称为 CHS 模式），存在一个限制 ：就是 BIOS 无法访问在 1024 柱面。之后的内容，所以 BIOS<br><br>只能访问最小 508 MB ，最大8GB 的空间。（这也就是 /boot 分区必须在 1024 柱面之前的原因）。GRUB 并不能解决全部问题，因为<br><br>并没有统一的解决方法，不过 GRUB 可以检测是否支持 LBA 模式，如果支持则使用 LBA 模式。<br><br>m）支持网络引导，可以使用 TFTP 协议通过网络加载内核<br><br>n）支持远程终端，目前只支持串口<br><br><br><br>二、命名习惯<br><br>首先 GRUB 要求设备名被括在一个 （ ） 中。fd表示软盘，hd 表示硬盘（不区分 IDE 还是 SCSI）。其次设备是从 0 开始编号，分区也是如此，<br><br>分区和设备之间用一个 &#8216;,&#8217; 分开。下面给出几个例子 ：<br><br>(fd0) ：表示整个软盘<br><br>(hd0,1) ：表示 BIOS 中的第一个硬盘的第2个分区<br><br>(hd0,0)/boot/vmlinuz ：表示 BIOS 中的第一个硬盘的第一个分区下的 boot/ 目录下的vmlinuz 文件。<br><br>如果没有指定某个分区，则表示使用整个设备，否则只使用指定的分区。<br><br><br>三、安装 GRUB <br><br>3.1 下载 tarball<br><br>有两种方法，一种是 rpm ；一种是 tarball 。rpm 没有什么好说的，只是 rpm &#8211;Uvh 就可以了。不过一般不会启用网络引导功能，<br><br>所以我们决定采用 tarball 的方式安装。 首先到下面的地址下载 tarball <a href="ftp://alpha.gnu.org/gnu/grub" target=_blank><font color=#22229c>ftp://alpha.gnu.org/gnu/grub</font></a><br><br>上面有 GRUB Legacy 和 GRUB 2 ，就选择目前 RHEL AS4 用的 0.95 版本做实验。<br><br>不过在安装之前先要用 rpm &#8211;q grub 检查一下 grub 是否安装了。如果是的话，用 rpm &#8211;e grub 删除，即使你在安装时指定不安装 <br><br>boot loader ，安装程序还是会安装 grub rpm 包的。<br><br>3.2 安装需求<br><br>INSTALL 文件中给出了 build 所需要的软件包条件 ：<br><br>GCC ：当前版本的 GCC 应该也可以用，不过还是建议用 2.95 或者以上版本的 GCC<br><br>GNU Make ：生成 Makefiles 所用<br><br>GNU binutils 2.9.1.0.23 或者个更高版本<br><br>如果你想自己开发 GRUB ，还需要 Texinfo 4.0 或者更高 ，同时还有GNU Autoconf 2.5x ，GNU Automake 1.7 或者更高颁布。<br><br>3.3 参数介绍<br><br>下面我们介绍几个 configure 过程中可能用到的选项，要完整的选项列表，可以参看 INSTALL 文件和 netboot/README.netboot 文件.<br><br>a)--enable-preset-menu=FILE ：默认情况下 grub.conf 和 stage2 文件是分离的，使用该选项，可以直接把配置文件嵌入到 stage2 中，<br><br>这样启动时可以立即获得配置文件。对于一些嵌入式的系统来说比较有用，又或者在前面提到的没有显示器/键盘的主机有用，因为在切<br><br>换显示输出到你的笔记本之前，你是看不到启动的画面的，所以执行切换显示操作也是在看不到输出的情况下进行的（切换显示之后就不会了）。<br><br>通过这个选项你可以在 <file>中指定启动时立即把显示输出切换到你的笔记本上了。<br><br>b)--enable-diskless ：如果使用了该选项，你会得到额外的两个文件，nbgrub 和 pxegrub。接下来你需要指定网卡的驱动程序，<br><br>netboot/ 目录下有较常见的几种 ，可以看到几种网卡可以合用一个驱动。常见的有 ：<br><br><br>[Copy to clipboard]CODE:<br>Intel Etherexpress Pro/100<br>--enable-eepro100<br><br>Novell NE2100 and NE1500<br>--enable-ne2100<br><br>Realtek 8139<br>SMC 1211<br>D-Link DFE530TX+ and DFE538TX<br>--enable-rtl8139<br><br><br>3Com90x<br>--enable-3c90x<br><br>如果你不想那么麻烦，则按照下面的过程进行 ：<br><br><br>[Copy to clipboard]CODE:<br>./configure <br>make<br>make install<br><br>安装结束。默认命令会放在 /usr/local/bin 和 /usrlocal/sbin 下。Stage 文件则放在 /usr/local/share/grub/i386-pc/ 目录下。<br><br>3.4 安装之后的操作<br><br>a）把 /usr/local/share/grub/i386-pc/ 目录下的所有文件统统拷贝到 /boot/grub/ 目录下。<br><br>b）接下来是创建 grub.conf ，并在 /boot/grub/ 目录下建立一个 menu.lst ，指向 grub.conf。<br><br>c）注意，这个 symbol link 在 Redhat 9 是必需的，否则启动时会直接进入命令模式，即使已经存在 grub.conf ；但在 RHEL AS4 下却不是。<br><br>d）确认 /usr/local/sbin 和 /usr/local/bin 在 PATH 变量的值中。<br><br>e）执行 grub-install /dev/hda1 把 stage1 写入到 /boot 分区的引导扇区。<br><br>也可以执行 grub 进入 grub shell ，然后通过 root 和 setup 命令来安装 stage1 。<br><br>f）重启机器，安装过程到此结束。 
<img src ="http://www.blogjava.net/kwbb/aggbug/117922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kwbb/" target="_blank">执手麦田</a> 2007-05-16 20:02 <a href="http://www.blogjava.net/kwbb/archive/2007/05/16/117922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>硬盘安装redflag5.0方法</title><link>http://www.blogjava.net/kwbb/archive/2007/05/09/116125.html</link><dc:creator>执手麦田</dc:creator><author>执手麦田</author><pubDate>Wed, 09 May 2007 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/kwbb/archive/2007/05/09/116125.html</guid><wfw:comment>http://www.blogjava.net/kwbb/comments/116125.html</wfw:comment><comments>http://www.blogjava.net/kwbb/archive/2007/05/09/116125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kwbb/comments/commentRss/116125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kwbb/services/trackbacks/116125.html</trackback:ping><description><![CDATA[<p style="BORDER-RIGHT: red 1px solid; BORDER-TOP: red 1px solid; FONT-SIZE: 10pt; BORDER-LEFT: red 1px solid; BORDER-BOTTOM: red 1px solid">1.首先从以下网址：<a href="http://download.chinaunix.net/download/0013000/12299.shtml" target=_blank><font color=#0000ff><u>http://download.chinaunix.net/download/0013000/12299.shtml</u></font></a>&nbsp;<br>下载Red&nbsp;Flag&nbsp;5.0桌面版（以下简称RF5.0）ISO文件。将其放到某个盘的根目录下，以下以D：\为例讲解。&nbsp;<br>2.将标识为RedFlag-dt5-disc1.iso中的dosutils目录也从压缩包中拖出来放到D：\下，(这主要是为了方便也没有什么特殊之处)。&nbsp;<br>3.以上工作做好以后，再下一个VFloppy.rar(虚拟软驱软件)(别担心，不是很大的)，用它来做一个纯DOS的进入界面，设置虚拟软驱：&nbsp;<br>3a.解压缩VFLOPPY.rar的所有文件到任一目录下，双击打开vfloppy.exe.&nbsp;<br>3b.可以看到有一个#启动设置#--#映象文件#--单击后面第二个图标(鼠标放在上面会显示：&#8220;选择映象文件的路径&#8221;)，找到一个名为&nbsp;BOOTDISK.IMG的文件(一般就在你解压的目录下)。点击#应用#后如果成功的话会出现&#8220;设置映象成功，你要查看日志么？&#8221;的对话框，直接点否就可以了。接下来会弹出一个对话框，提示你重启系统。&nbsp;<br>3c.重启系统，你会看到在系统启动菜单中会多了一个名为&#8220;由虚拟软驱启动&#8221;的字样，选择它进入纯DOS，在DOS命令行输入d:,(其实就是进入到你放RF5.0的ISO文件所在盘符)，然后cd&nbsp;dosutils，回车，输入autoboot，回车，接下来系统进入自动安装RF5.0的过程。。。&nbsp;<br>4.系统会让你选择键盘类型，选择默认的(一般是US)即可。&nbsp;<br>5.然后选择存放ISO文件的媒介，选择hda5(在windows下就是指D：盘)，回车。&nbsp;<br>6.系统会继续往下进行，进入到分区时，选择手动分区，建立以下三个分区(/&nbsp;,&nbsp;/boot&nbsp;,swap)：&nbsp;<br>6a.在挂载点一栏，先设一下/boot分区，类型选EXT3，大小100M，确定。&nbsp;<br>6b.在类型中选择SWAP，大小为内存的2倍，我的内存是512M，输入1024M，确定。&nbsp;<br>6c.在挂载点一栏，选择/分区，类型为EXT3，大小为10240M，(按我的标准)，当然你也可以给它更大些。&nbsp;<br>7.分区设置完成后，下一步，系统还会要求你创建一个超级用户root,输入密码，下一步，等待系统自动格式化磁盘，自动安装默认软件，等待其安装完成。(可以喝茶去了，呵呵)&nbsp;<br>8.进入系统体验一下RF5.0给你带来的快乐吧!&nbsp;</p>
<img src ="http://www.blogjava.net/kwbb/aggbug/116125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kwbb/" target="_blank">执手麦田</a> 2007-05-09 10:49 <a href="http://www.blogjava.net/kwbb/archive/2007/05/09/116125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中的PACKAGE机制——(好文转帖)</title><link>http://www.blogjava.net/kwbb/archive/2007/04/29/114565.html</link><dc:creator>执手麦田</dc:creator><author>执手麦田</author><pubDate>Sun, 29 Apr 2007 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/kwbb/archive/2007/04/29/114565.html</guid><wfw:comment>http://www.blogjava.net/kwbb/comments/114565.html</wfw:comment><comments>http://www.blogjava.net/kwbb/archive/2007/04/29/114565.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kwbb/comments/commentRss/114565.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kwbb/services/trackbacks/114565.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1，什么都别说，先跟着我来做一把<br>我们先找一个目录，比如C:\myjob<br>然后我们建立两个目录，一个叫做src，一个叫做bin<br>C:\myjob&gt;md src<br>C:\myjob&gt;md bin<br>C:\myjob&gt;dir<br>&nbsp;驱动器 C 中的卷是 LIGHTNING<br>&nbsp;卷的序列号是 3DD1-83D9<br>&nbsp;C:\myjob 的目录<br>2005-12-25&nbsp; 14:33&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<br>2005-12-25&nbsp; 14:33&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ..<br>2005-12-25&nbsp; 14:34&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src<br>2005-12-25&nbsp; 14:34&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 个文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 字节<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 个目录&nbsp;&nbsp;&nbsp; 305,123,328 可用字节<br>C:\myjob&gt;<br>然后我们在src目录中去写程序<br>C:\myjob&gt;cd src<br>C:\myjob\src&gt;<br>我们写这么4个java文件<br>////A.java<br>package com.lightning;<br>public class A{<br>{System.out.println("com.lightning.A");}<br>}<br>////B.java<br>package com.lightning;<br>public class B{<br>{System.out.println("com.lightning.B");}<br>}<br>////C.java<br>package com;<br>public class C{<br>{System.out.println("com.C");}<br>}</p>
<p>////Test.java<br>package net.test;<br>import com.lightning.*;<br>import com.*;<br>public class Test{<br>public static void main(String[] args)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new A();new B();new C();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("net.test.Test");<br>}<br>}<br>写好之后就是这样</p>
<p>C:\myjob\src&gt;dir<br>&nbsp;驱动器 C 中的卷是 LIGHTNING<br>&nbsp;卷的序列号是 3DD1-83D9</p>
<p>&nbsp;C:\myjob\src 的目录</p>
<p>2005-12-25&nbsp; 14:34&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<br>2005-12-25&nbsp; 14:34&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ..<br>2005-12-25&nbsp; 14:39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 86 A.java<br>2005-12-25&nbsp; 14:40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 86 B.java<br>2005-12-25&nbsp; 14:42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 194 Test.java<br>2005-12-25&nbsp; 14:43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 68 C.java<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 个文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 434 字节<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 个目录&nbsp;&nbsp;&nbsp; 305,106,944 可用字节</p>
<p>然后我们建立com目录，com\lightning\目录，net\test\目录<br>C:\myjob\src&gt;md com<br>C:\myjob\src&gt;md com\lightning<br>C:\myjob\src&gt;md net\test\<br>我们将Test.java放入net\test\中去<br>将A.java，B.java放入com\lightning\中去<br>将C.java放入com\中去<br>C:\myjob\src&gt;move Test.java net\test\<br>C:\myjob\src&gt;move A.java com\lightning\<br>C:\myjob\src&gt;move B.java com\lightning\<br>C:\myjob\src&gt;move C.java com\</p>
<p>然后我们在c:\myjobs中发令：<br>C:\myjob\src&gt;cd ..<br>C:\myjob&gt;javac -sourcepath src -d bin src\net\test\Test.java<br>然后我们看看bin目录中多了什么<br>C:\myjob&gt;dir bin /s<br>&nbsp;驱动器 C 中的卷是 LIGHTNING<br>&nbsp;卷的<nobr><a class=iAs oncontextmenu="return false;" onmouseover=kwHCss(event,3); style="FONT-SIZE: 14px; CURSOR: hand; COLOR: #0000ff; BORDER-BOTTOM: #000000 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://ads.telword.com/s.php?webid=193&amp;charset=gb2312&amp;word=序列号','_blank');" onmouseout=kwcss(event,3); target=_blank>序列号</a></nobr>是 3DD1-83D9</p>
<p>&nbsp;C:\myjob\bin 的目录</p>
<p>2005-12-25&nbsp; 14:34&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<br>2005-12-25&nbsp; 14:34&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ..<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; net<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 个文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 字节</p>
<p>&nbsp;C:\myjob\bin\net 的目录</p>
<p>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ..<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 个文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 字节</p>
<p>&nbsp;C:\myjob\bin\net\test 的目录</p>
<p>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ..<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 520 Test.class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 个文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 520 字节</p>
<p>&nbsp;C:\myjob\bin\com 的目录</p>
<p>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ..<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lightning<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 338 C.class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 个文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 338 字节</p>
<p>&nbsp;C:\myjob\bin\com\lightning 的目录</p>
<p>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ..<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 354 A.class<br>2005-12-25&nbsp; 14:46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 354 B.class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 个文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 708 字节</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 所列文件总数:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 个文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,566 <nobr><a class=iAs oncontextmenu="return false;" onmouseover=kwHCss(event,1); style="FONT-SIZE: 14px; CURSOR: hand; COLOR: #0000ff; BORDER-BOTTOM: #000000 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://ads.telword.com/s.php?webid=193&amp;charset=gb2312&amp;word=字节','_blank');" onmouseout=kwcss(event,1); target=_blank>字节</a></nobr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14 个目录&nbsp;&nbsp;&nbsp; 305,057,792 可用字节</p>
<p>然后我们执行，同样在c:\myjobs\下发令<br>C:\myjob&gt;java -cp bin net.test.Test<br>com.lightning.A<br>com.lightning.B<br>com.C<br>net.test.Test</p>
<p>2，从实践到理论</p>
<p>刚才我用一个非常简单但是非常完整的例子给大家演示了java的package机制。<br>为什么以前脑海里面那么简单的javac会搞得这么复杂呢？</p>
<p>实际上它本就这么复杂，<br>并不是一个.java，一行javac一个当前目录中的class这么简单。</p>
<p>首先我要打破一些东西，然后才好建立一些东西。<br>javac并非只是给一个.java编译一个class的。javac自带有make机制，也就是说，如果在<br>javac的参数中java文件使用到的任何类，javac首先会去找寻这个类的class文件存在与否<br>，如果不存在，就会在sourcepath中找寻源代码文件来编译。</p>
<p>什么是sourcepath呢？sourcepath是javac的一个参数，如果你不加指定，那么sourcepath<br>就是classpath。</p>
<p>比如我们装好jdk之后，我说过不要设定classpath环境变量，因为大部分人一旦设定了<br>classpath，不是多此一举把什么dt.jar放进去。（我可以好好打击你一下，告诉你一个可<br>悲的事实——jre永远不会从你这个classpath中去寻找dt.jar。你完全是徒劳的！）就是<br>把"."搞不见了，搞得是冷水一盆盆的往自己身上泼，脑袋一点点的涨大。</p>
<p>不要设！classpath没有你想象中那么普适和强大，它只是命令行的简化替代品。<br>你不设的话它就是"."。</p>
<p><br>回到sourcepath，sourcepath指的是你<nobr><a class=iAs oncontextmenu="return false;" onmouseover=kwHCss(event,4); style="FONT-SIZE: 14px; CURSOR: hand; COLOR: #0000ff; BORDER-BOTTOM: #000000 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://ads.telword.com/s.php?webid=193&amp;charset=gb2312&amp;word=源代码','_blank');" onmouseout=kwcss(event,4); target=_blank>源代码</a></nobr>树的存放地点。<br>为什么是源代码树？而不是一个目录的平板源代码呢？<br>请大家将原本脑海中C的编译过程完全砸掉！<br>java完全不同，java没有头文件，每个.java都是要放在源代码树中的。<br>那么这颗树是怎么组织的呢？<br>对了，就是package语句。<br>比如写了package com.lightning;<br>那么这个.java就必须放在源代码树根\的com\lighting\之下才行。</p>
<p>很多浮躁的初学者被default打包方式宠坏了。自我为中心，以为java就是一套库，自己写<br>的时候最多import进来就行了，代码从不打包，直接javac，直接java，多么方便。<br>孰不知自己写的这个.java也不过是java大平台的其中一个小单元而已。如果不打包，<br>我写一个Point，你写一个Point，甚至更有甚者敢于给自己的类起名叫String等等。<br>全部都在平板式的目录中，那jre该选哪一个？</p>
<p>一旦要使用package语句，就要使用代码树结构，当然，你要直接javac，也行。<br>不过javac出来的这个class要放在符合package结构的目录中才能发挥正常作用，否则就是<br>废物一坨。<br>而且，如果你这个.java还用到其它自己写的有package语句的.java，那这个方法就回天乏<br>术了。</p>
<p>按照sun的想象，应该是写好的.java放在符合package结构的目录中，package语句保证了<br>正确放置，如果目录位置和package语句中指示的不同，则会出错。</p>
<p>所以按照刚才我们的那种package写法，我们必然要将那几个.java文件放入相应的目录中<br>才能让javac顺利找到他们来make。</p>
<p>有人说javac可不可以像java那样 java aaa.bbb.c...java？<br>不可以<br>javac中的那个.java文件参数必须是一个文件系统的路径文件名形式。<br>然后如果用到其它的.java，javac会根据目前的sourcepath出发寻找目录结构中的那些<br>java文件。</p>
<p>当然了，既然打了包，在使用的时候。<br>要么写全名——包名.类名<br>或者使用import<br>不得不提的是，import就好比c++的using，它不负责做文件操作，它只是方便你写代码。</p>
<p>另外import<nobr><a class=iAs oncontextmenu="return false;" onmouseover=kwHCss(event,5); style="FONT-SIZE: 14px; CURSOR: hand; COLOR: #0000ff; BORDER-BOTTOM: #000000 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://ads.telword.com/s.php?webid=193&amp;charset=gb2312&amp;word=语句','_blank');" onmouseout=kwcss(event,5); target=_blank>语句</a></nobr>中的*代表的是类名，不代表包名片断。<br>你import com.*; <br>编译器仍然找不到com.lightning中的任何类。<br>反之亦然。<br>就好象你告诉编译器，我这里面要用到姓诸葛的人。<br>那么姓诸的人当然编译器不会认为也包含在内。 </p>
<p><br>所以，如果程序一旦写到一定规模。<br>就不得不使用ant来管理这些。<br>或者使用IDE，否则jdk就真的变成了java developer killer。</p>
<p>但是对于初学者，在了解为什么会有ant之类的之前，还是要体会一下使用<br>jdk的艰辛。</p>
<p>这个和以前在unix上开发的人用gcc命令行到后来使用make之后使用ide<br>之类的时候的体会是类似的。</p>
<p>最后，javac的-d参数是指示编译出来的class<nobr><a class=iAs oncontextmenu="return false;" onmouseover=kwHCss(event,2); style="FONT-SIZE: 14px; CURSOR: hand; COLOR: #0000ff; BORDER-BOTTOM: #000000 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://ads.telword.com/s.php?webid=193&amp;charset=gb2312&amp;word=文件','_blank');" onmouseout=kwcss(event,2); target=_blank>文件</a></nobr>放在哪里的，如果你不指定的话，它们<br>和.java混在一起。当然也符合<nobr><a class=iAs oncontextmenu="return false;" onmouseover=kwHCss(event,0); style="FONT-SIZE: 14px; CURSOR: hand; COLOR: #0000ff; BORDER-BOTTOM: blue 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://ads.telword.com/s.php?webid=193&amp;charset=gb2312&amp;word=目录','_blank');" onmouseout=kwcss(event,0); target=_blank>目录</a></nobr>结构。</p>
<img src ="http://www.blogjava.net/kwbb/aggbug/114565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kwbb/" target="_blank">执手麦田</a> 2007-04-29 14:19 <a href="http://www.blogjava.net/kwbb/archive/2007/04/29/114565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于汉诺塔的理解</title><link>http://www.blogjava.net/kwbb/archive/2007/04/28/114249.html</link><dc:creator>执手麦田</dc:creator><author>执手麦田</author><pubDate>Sat, 28 Apr 2007 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/kwbb/archive/2007/04/28/114249.html</guid><wfw:comment>http://www.blogjava.net/kwbb/comments/114249.html</wfw:comment><comments>http://www.blogjava.net/kwbb/archive/2007/04/28/114249.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/kwbb/comments/commentRss/114249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kwbb/services/trackbacks/114249.html</trackback:ping><description><![CDATA[汉诺塔问题是在编程时经常提到的一个问题，因为它在递归的使用方法有很强的代表性。它讲的是需要将N个盘子从A柱上通过B柱的辅助全部移动到C柱上，其间只有一个条件需要注意，那就是大盘子始终在小盘子下面。<br><br>如何用递归的思路来解决问题呢？方法很简单，其实我们其它的什么都不需要考虑，只需要这样想，假设现在有10只盘子，我只需要将上面的9只从A柱放到B柱上，而且是上小下大，这样就可以将第10只盘子从A柱放到C柱上了，再将那9只盘子通过A柱移动到C就可以了，至于那9只盘子如何移动，我们可以这样想，我们可以用和第10只盘子相同的方法，先将上面9只通过B柱移动到C柱，然后将第9只盘子从A移动到B，再将那8只通过A从C移动到B就可以了，依此类推，方法都是一样的。因此可以有这样的程序出现。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_55_303_Open_Image onclick="this.style.display='none'; Codehighlighter1_55_303_Open_Text.style.display='none'; Codehighlighter1_55_303_Closed_Image.style.display='inline'; Codehighlighter1_55_303_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_55_303_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_55_303_Closed_Text.style.display='none'; Codehighlighter1_55_303_Open_Image.style.display='inline'; Codehighlighter1_55_303_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;move(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n&nbsp;,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;one&nbsp;,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;two,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;three)</span><span id=Codehighlighter1_55_303_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_55_303_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(n</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">第</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">n</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">只盘子由</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">one</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">three);<br><img id=Codehighlighter1_122_301_Open_Image onclick="this.style.display='none'; Codehighlighter1_122_301_Open_Text.style.display='none'; Codehighlighter1_122_301_Closed_Image.style.display='inline'; Codehighlighter1_122_301_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_122_301_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_122_301_Closed_Text.style.display='none'; Codehighlighter1_122_301_Open_Image.style.display='inline'; Codehighlighter1_122_301_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #0000ff">else</span><span id=Codehighlighter1_122_301_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_122_301_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;move(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;one&nbsp;,&nbsp;three&nbsp;,&nbsp;two);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将第n-1只盘子从one通过three移动到two;</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">第</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">n</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">只盘子由</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">one</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">three);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;move(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;two&nbsp;,&nbsp;one&nbsp;,&nbsp;three););</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将第n-1只盘子从two通过one移动到three;</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
然后我们要做的就是通过一个主函数来调用这个方法就可以了。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;HanN<br><img id=Codehighlighter1_18_116_Open_Image onclick="this.style.display='none'; Codehighlighter1_18_116_Open_Text.style.display='none'; Codehighlighter1_18_116_Closed_Image.style.display='inline'; Codehighlighter1_18_116_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_18_116_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_18_116_Closed_Text.style.display='none'; Codehighlighter1_18_116_Open_Image.style.display='inline'; Codehighlighter1_18_116_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_18_116_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_18_116_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String&nbsp;[]&nbsp;args)<br><img id=Codehighlighter1_62_114_Open_Image onclick="this.style.display='none'; Codehighlighter1_62_114_Open_Text.style.display='none'; Codehighlighter1_62_114_Closed_Image.style.display='inline'; Codehighlighter1_62_114_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_62_114_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_62_114_Closed_Text.style.display='none'; Codehighlighter1_62_114_Open_Image.style.display='inline'; Codehighlighter1_62_114_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_62_114_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_62_114_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;HanN&nbsp;hn&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HanN();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;hn.move(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">B</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<img src ="http://www.blogjava.net/kwbb/aggbug/114249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kwbb/" target="_blank">执手麦田</a> 2007-04-28 09:27 <a href="http://www.blogjava.net/kwbb/archive/2007/04/28/114249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>检索字符的程序</title><link>http://www.blogjava.net/kwbb/archive/2007/04/27/114056.html</link><dc:creator>执手麦田</dc:creator><author>执手麦田</author><pubDate>Fri, 27 Apr 2007 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/kwbb/archive/2007/04/27/114056.html</guid><wfw:comment>http://www.blogjava.net/kwbb/comments/114056.html</wfw:comment><comments>http://www.blogjava.net/kwbb/archive/2007/04/27/114056.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kwbb/comments/commentRss/114056.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kwbb/services/trackbacks/114056.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用来检索字符的程序&nbsp;&nbsp;<a href='http://www.blogjava.net/kwbb/archive/2007/04/27/114056.html'>阅读全文</a><img src ="http://www.blogjava.net/kwbb/aggbug/114056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kwbb/" target="_blank">执手麦田</a> 2007-04-27 13:37 <a href="http://www.blogjava.net/kwbb/archive/2007/04/27/114056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于foreach的使用</title><link>http://www.blogjava.net/kwbb/archive/2007/04/26/113821.html</link><dc:creator>执手麦田</dc:creator><author>执手麦田</author><pubDate>Thu, 26 Apr 2007 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/kwbb/archive/2007/04/26/113821.html</guid><wfw:comment>http://www.blogjava.net/kwbb/comments/113821.html</wfw:comment><comments>http://www.blogjava.net/kwbb/archive/2007/04/26/113821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kwbb/comments/commentRss/113821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kwbb/services/trackbacks/113821.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt">在jdk1.5以后的版本中，新增了一个名叫foreach的语法，它可以在循环语句中使用，方法可见以下实例。<br>例如，定义一个一维数组 a[&nbsp; ]={1,15,20,33}，此时要求打印该数组值，按照以往的方法，可以这样做，代码如下：<br></span>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;TestForEach<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id=Codehighlighter1_25_165_Open_Image onclick="this.style.display='none'; Codehighlighter1_25_165_Open_Text.style.display='none'; Codehighlighter1_25_165_Closed_Image.style.display='inline'; Codehighlighter1_25_165_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_25_165_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_25_165_Closed_Text.style.display='none'; Codehighlighter1_25_165_Open_Image.style.display='inline'; Codehighlighter1_25_165_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_25_165_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_25_165_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String&nbsp;[]&nbsp;args)<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img id=Codehighlighter1_68_163_Open_Image onclick="this.style.display='none'; Codehighlighter1_68_163_Open_Text.style.display='none'; Codehighlighter1_68_163_Closed_Image.style.display='inline'; Codehighlighter1_68_163_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_68_163_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_68_163_Closed_Text.style.display='none'; Codehighlighter1_68_163_Open_Image.style.display='inline'; Codehighlighter1_68_163_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_68_163_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_68_163_Open_Text><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[]&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span id=Codehighlighter1_80_91_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_80_91_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">33</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">a.length();i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(a[i]);<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<br><span style="FONT-SIZE: 10pt">但是，当我们运用了foreach的语法后就不一样了，以上的语句可以写成如下格式：<br></span>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;TestForEach<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id=Codehighlighter1_25_172_Open_Image onclick="this.style.display='none'; Codehighlighter1_25_172_Open_Text.style.display='none'; Codehighlighter1_25_172_Closed_Image.style.display='inline'; Codehighlighter1_25_172_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_25_172_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_25_172_Closed_Text.style.display='none'; Codehighlighter1_25_172_Open_Image.style.display='inline'; Codehighlighter1_25_172_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_25_172_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_25_172_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String&nbsp;[]&nbsp;args)<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img id=Codehighlighter1_71_170_Open_Image onclick="this.style.display='none'; Codehighlighter1_71_170_Open_Text.style.display='none'; Codehighlighter1_71_170_Closed_Image.style.display='inline'; Codehighlighter1_71_170_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_71_170_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_71_170_Closed_Text.style.display='none'; Codehighlighter1_71_170_Open_Image.style.display='inline'; Codehighlighter1_71_170_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_71_170_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_71_170_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img id=Codehighlighter1_86_97_Open_Image onclick="this.style.display='none'; Codehighlighter1_86_97_Open_Text.style.display='none'; Codehighlighter1_86_97_Closed_Image.style.display='inline'; Codehighlighter1_86_97_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_86_97_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_86_97_Closed_Text.style.display='none'; Codehighlighter1_86_97_Open_Image.style.display='inline'; Codehighlighter1_86_97_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[]&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span id=Codehighlighter1_86_97_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_86_97_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">33</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;:&nbsp;a)&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">注，这里定义的i必须在for结构中，</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">7</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i);<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br><span style="FONT-SIZE: 10pt">写到这里不由得赞叹一下，Java真是牛呀！</span>
<img src ="http://www.blogjava.net/kwbb/aggbug/113821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kwbb/" target="_blank">执手麦田</a> 2007-04-26 16:10 <a href="http://www.blogjava.net/kwbb/archive/2007/04/26/113821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提问：如何避免下列情况</title><link>http://www.blogjava.net/kwbb/archive/2007/04/26/113753.html</link><dc:creator>执手麦田</dc:creator><author>执手麦田</author><pubDate>Thu, 26 Apr 2007 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/kwbb/archive/2007/04/26/113753.html</guid><wfw:comment>http://www.blogjava.net/kwbb/comments/113753.html</wfw:comment><comments>http://www.blogjava.net/kwbb/archive/2007/04/26/113753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kwbb/comments/commentRss/113753.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kwbb/services/trackbacks/113753.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Comic Sans MS">有程序如下：<br></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Comic Sans MS">&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;FPoint<br><img id=Codehighlighter1_20_212_Open_Image onclick="this.style.display='none'; Codehighlighter1_20_212_Open_Text.style.display='none'; Codehighlighter1_20_212_Closed_Image.style.display='inline'; Codehighlighter1_20_212_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_20_212_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_20_212_Closed_Text.style.display='none'; Codehighlighter1_20_212_Open_Image.style.display='inline'; Codehighlighter1_20_212_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_20_212_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_20_212_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String&nbsp;[]&nbsp;args)<br><img id=Codehighlighter1_67_210_Open_Image onclick="this.style.display='none'; Codehighlighter1_67_210_Open_Text.style.display='none'; Codehighlighter1_67_210_Closed_Image.style.display='inline'; Codehighlighter1_67_210_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_67_210_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_210_Closed_Text.style.display='none'; Codehighlighter1_67_210_Open_Image.style.display='inline'; Codehighlighter1_67_210_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_67_210_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_67_210_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;f&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(f);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_148_205_Open_Image onclick="this.style.display='none'; Codehighlighter1_148_205_Open_Text.style.display='none'; Codehighlighter1_148_205_Closed_Image.style.display='inline'; Codehighlighter1_148_205_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_148_205_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_148_205_Closed_Text.style.display='none'; Codehighlighter1_148_205_Open_Image.style.display='inline'; Codehighlighter1_148_205_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_148_205_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_148_205_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">0.1f</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(f);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Comic Sans MS"><br><br>此程序理想的打印结果应该是：<br>0.0<br>0.1<br>0.2<br>0.3<br>0.4<br>0.5<br>0.6<br>0.7<br>0.8<br>0.9<br>1.0<br>但实际打印结果却是：<br>0.0<br>0.1<br>0.2<br>0.3<br>0.4<br>0.5<br>0.6<br>0.70000005<br>0.8000001<br>0.9000001<br>1.0000001<br><br>请问这是为什么？又该如何避免？ </p>
<img src ="http://www.blogjava.net/kwbb/aggbug/113753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kwbb/" target="_blank">执手麦田</a> 2007-04-26 13:09 <a href="http://www.blogjava.net/kwbb/archive/2007/04/26/113753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>