向文件里写文本
  PrintWriter out=new PrintWriter(
  new OutputStreamWriter(new FileOutputStream(...),"UTF-8"));
  try{
  out.print("Hello");
  out.print(42);
  out.println("world!");
  }finally{
  out.close();
  }
  Printwriter对象的创建显得很冗长。这是因为Java把字节和字符当成两个不同的概念来看待(这与C语言不同)。
  像System.out,你可以使用print()和println()打印多种类型的值。
  你可以使用其他的字符编码而不使用UTF-8,但好不要这样做。
  参考:java.io.PrintWriter、java.io.OutputStreamWriter。
  预防性检测(Defensive checking)数值
  int factorial(int n){
  if(n<0)
  throw new IllegalArgumentException("Undefined");
  else if(n>=13)
  throw new ArithmeticException("Result overflow");
  else if(n==0)
  return 1;
  else
  return n*factorial(n-1);
  }
  不要认为输入的数值都是正数、足够小的数等等。要显式地检测这些条件。
  一个设计良好的函数应该对所有可能性的输入值都能够正确地执行。要确保所有的情况都考虑到了并且不会产生错误的输出(比如溢出)。
  预防性检测对象
  int findIndex(List<String>list,String target){
  if(list==null||target==null)
  throw new NullPointerException();
  ...
  }
  不要认为对象参数不会为空(null)。要显式地检测这个条件。
  预防性检测数组索引
  void frob(byte[]b,int index){
  if(b==null)
  throw new NullPointerException();
  if(index<0||index>=b.length)
  throw new IndexOutOfBoundsException();
  ...
  }
  不要认为所以给的数组索引不会越界。要显式地检测它。
  预防性检测数组区间
  void frob(byte[]b,int off,int len){
  if(b==null)
  throw new NullPointerException();
  if(off<0||off>b.length
  ||len<0||b.length-off<len)
  throw new IndexOutOfBoundsException();
  ...
  }
  不要认为所给的数组区间(比如,从off开始,读取len个元素)是不会越界。要显式地检测它。
  填充数组元素
  使用循环:
  //Fill each element of array'a'with 123
  byte[]a=(...);
  for(int i=0;i<a.length;i++)
  a[i]=123;
  (优先)使用标准库的方法:
  Arrays.fill(a,(byte)123);
  参考:java.util.Arrays.fill(T[],T)。
  参考:java.util.Arrays.fill(T[],int,int,T)。
  复制一个范围内的数组元素
  使用循环:
  //Copy 8 elements from array'a'starting at offset 3
  //to array'b'starting at offset 6,
  //assuming'a'and'b'are distinct arrays
  byte[]a=(...);
  byte[]b=(...);
  for(int i=0;i<8;i++)
  b[6+i]=a[3+i];
  (优先)使用标准库的方法:
  System.arraycopy(a,3,b,6,8);
  参考:java.lang.System.arraycopy(Object,int,Object,int,int)。
  调整数组大小
  使用循环(扩大规模):
  //Make array'a'larger to newLen
  byte[]a=(...);
  byte[]b=new byte[newLen];
  for(int i=0;i<a.length;i++)//Goes up to length of A
  b[i]=a[i];
  a=b;
  使用循环(减小规模):
  //Make array'a'smaller to newLen
  byte[]a=(...);
  byte[]b=new byte[newLen];
  for(int i=0;i<b.length;i++)//Goes up to length of B
  b[i]=a[i];
  a=b;
  (优先)使用标准库的方法:
  a=Arrays.copyOf(a,newLen);
  参考:java.util.Arrays.copyOf(T[],int)。
  参考:java.util.Arrays.copyOfRange(T[],int,int)。
  把4个字节包装(packing)成一个int
  int packBigEndian(byte[]b){
  return(b[0]&0xFF)<<24
  |(b[1]&0xFF)<<16
  |(b[2]&0xFF)<<8
  |(b[3]&0xFF)<<0;
  }
  int packLittleEndian(byte[]b){
  return(b[0]&0xFF)<<0
  |(b[1]&0xFF)<<8
  |(b[2]&0xFF)<<16
  |(b[3]&0xFF)<<24;
  }
  把int分解(Unpacking)成4个字节
  byte[]unpackBigEndian(int x){
  return new byte[]{
  (byte)(x>>>24),
  (byte)(x>>>16),
  (byte)(x>>>8),
  (byte)(x>>>0)
  };
  }
  byte[]unpackLittleEndian(int x){
  return new byte[]{
  (byte)(x>>>0),
  (byte)(x>>>8),
  (byte)(x>>>16),
  (byte)(x>>>24)
  };
  }
  总是使用无符号右移操作符(>>>)对位进行包装(packing),不要使用算术右移操作符(>>)。