注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Reloadbug

黑夜给了我黑色的眼睛,我用她寻找Bug

 
 
 

日志

 
 

Java解惑 (Java Puzzlers) 神秘的转义字符  

2007-01-21 20:50:31|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

首先向大家介绍史上最牛的 java 代码:代码如下:

\p\u\b\l\i\c\ \c\l\a\s\s\ \H\e\l\l\o\W\o\r\l\d\ \{\ \ \p\u\b\l\i\c\ \s\t\a\t\i\c\ \v\o\i\d\ \m\a\i\n\(\S\t\r\i\n\g\[\]\ \a\r\g\s\)\ \{\ \ \ \ \S\y\s\t\e\m\.\o\u\t\.\p\r\i\n\t\l\n\(\"\H\e\l\l\o\ \W\o\r\l\d\ \!\"\)\;\ \ \}\}

猜猜这些东西能编译吗?如果可以会输出什么呢??嘿嘿。。酷吧?想知道结果就继续看。。

答案是能够编译,会打印 Hello World ! 。怎么样 很酷吧????想要运行就把那对字符拷贝下来,然后复制到一个名为 :HelloWorld.java的文件里。编译运行都OK。他代表的实际代码如下:

        public class HelloWorld {
            public static void main(String[] args) {
                  System.out.println("Hello World !");
            }
        }

如果你感到疑惑,现在就来讲解。那就是Java中的一个有趣的“毛病”。在编译之前先将所有的转义字符转换成它所表达的实际字符,也就有人发出狂想,写下了以上的代码。可以说上面的代码是把这种机制运用到了极致。

一般人是不会写这样的代码的,所以我做了一个程序来将正常的代码转换成这样的代码。下载之后记得改名哦。

下载地址:http://javabug.blogbus.com/files/1169384178.java

自己编译执行就可以了。

下载不了的可以直接复制以下代码:

import java.io.*;

public class HexCodeConverter {
  /**
   * 转换后 每个字符串的长度 一般十六进制用4位表示
   */
  public static final int CHAR_LENGTH = 4;
  /**
   * 根据参数进行转换,第一个参数是源文件名,第二个是目标文件名。
   * 如果使用相同的文件名则将源文件覆盖掉。
   * @param args String[]
   * @throws FileNotFoundException
   * @throws IOException
   */
  public static void main(String[] args) throws FileNotFoundException,
      IOException {
    if(args.length == 2){
      String sourceFile = args[0];
      String targetFile = args[1];
      File sf = new File(sourceFile);
      File tf = new File(targetFile);
      String src = HexCodeConverter.loadFromFile(sf);
      HexCodeConverter.saveToFile(tf,HexCodeConverter.convert(src));
    }
  }

  /**
   * 从指定的文件里读取所有的代码。
   * @param file File
   * @return String
   * @throws FileNotFoundException
   * @throws IOException
   */
  public static String loadFromFile(File file) throws
      FileNotFoundException, IOException {
    BufferedReader br = new BufferedReader(new FileReader(file));
    StringBuilder sb = new StringBuilder();
    while (true) {
      String line = br.readLine();
      if (line != null) {
        sb.append(line);
      }
      else {
        break;
      }
    }
    br.close();
    return sb.toString();
  }
  /**
   * 将源代码转换成用十六进制表示的字符序列
   * 例如: c 转换 成 
\\c
   * @param source String
   * @return String
   */
  public static String convert(String source) {
    char[] sourceCodes = source.toCharArray();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < sourceCodes.length; i++) {
      String character = Integer.toHexString(sourceCodes[i]);
      StringBuilder charSB = new StringBuilder();
      int len = character.length();
      len = CHAR_LENGTH - len;
      for (int j = 0; j < len; j++) {
        charSB.append("0");
      }
      sb.append("
\\u" + charSB.toString()+ character);
    }
    return sb.toString();
  }
  /**
   * 将代码字符串存储到指定的文件里
   * @param file File
   * @param codes String
   * @throws IOException
   */
  public static void saveToFile(File file, String codes) throws IOException {
    BufferedWriter bw = new BufferedWriter(new FileWriter(file, false));
    bw.write(codes);
    bw.flush();
    bw.close();
  }
}

  评论这张
 
阅读(219)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017