------------------- android培训、java培训、期待与您交流!------------------
/*
 System:类中的方法和属性都是静态的。
 out:标准输出,默认是控制台。
 in:标准输入,默认是键盘。
 描述系统一些信息。
 获取系统属性信息:Properties getProperties();
 */
 import java.util.*;
 class SystemDemo 
 {
 public static void main(String[] args) 
 {
 Properties prop = System.getProperties();
  //因为Properties是Hashtable的子类,也就是Map集合的一个子类对象。
 //那么可以通过map的方法取出该集合中的元素。
 //该集合中存储都是字符串。没有泛型定义。
 //如何在系统中自定义一些特有信息呢?
 System.setProperty("mykey","myvalue");//自定义设置键和值
 //获取指定属性信息。
 String value = System.getProperty("os.name");//传个key,返回value
 System.out.println("value="+value);//结果:windos xp
 //可不可以在jvm启动时,动态加载一些属性信息呢?
 String v = System.getProperty("haha");
 System.out.println("v="+v);//v=null
 //java -Dhaha=qqqqq SystemDemo//动态设置系统属性
 /*
 //获取所有属性信息。
 for(Object obj : prop.keySet())
 {
 String value = (String)prop.get(obj);
 System.out.println(obj+"::"+value);
 }
 */
 }
 }
------------------------------------------------------------------------------------------------------------
                
------------------------------------------------------------------------------------------------------------
          
------------------------------------------------------------------------------------------------------------
 
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
  
------------------------------------------------------------------------------------------------------------  
            
 
------------------------------------------------------------------------------------------------------------
                
------------------------------------------------------------------------------------------------------------
                                  
 ------------------------------------------------------------------------------------------------------------
/*
 Runtime对象
 该类并没有提供构造函数。
 说明不可以new对象。那么会直接想到该类中的方法都是静态的。
 发现该类中还有非静态方法。
 说明该类肯定会提供了方法获取本类对象。而且该方法是静态的,并返回值类型是本类类型。
 由这个特点可以看出该类使用了单例设计模式完成。
 该方式是static Runtime getRuntime();
 */
 class  RuntimeDemo
 {
 public static void main(String[] args) throws Exception
 {
 Runtime r = Runtime.getRuntime();
  //java命令打开电脑里任意一个文件
 //Process p = r.exec("winmine.exe");//可以不写路径,默认当前路径找,找不到,再在其他盘找
 //Thread.sleep(4000);//让线程等4s,再杀掉子进程
 //p.destroy();//杀掉子进程,刚一运行扫雷,就被秒杀掉了
 Process p = r.exec("notepad.exe  SystemDemo.java");//用记事本打开**.java文件
 }
 }
 ------------------------------------------------------------------------------------------------------------
import java.util.*;
 import java.text.*;//日期格式化在这个包
 class DateDemo 
 {
 public static void main(String[] args) 
 {
 Date d = new Date();
 System.out.println(d);//打印的时间看不懂,希望有些格式。
 //将模式封装到SimpleDateformat对象中。
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E hh:mm:ss");
   //调用format方法让模式格式化指定Date对象。
 String time = sdf.format(d);
 System.out.println("time="+time);
  long l = System.currentTimeMillis();
 Date d1 = new Date(l);
 System.out.println("d1:"+d1);
 }
 }
 ------------------------------------------------------------------------------------------------------------
import java.util.*;
 import java.text.*;
   class  CalendarDemo
 {
 public static void main(String[] args) 
 {
  Calendar c = Calendar.getInstance();
   String[] mons = {"一月","二月","三月","四月"
 ,"五月","六月","七月","八月"
 ,"九月","十月","十一月","十二月"};//查表法~!
   String[] weeks = {
 "","星期日","星期一","星期二","星期三","星期四","星期五","星期六",
 };//第一天是星期日,第二天是星期一....,前面加个空格解决!
  int index = c.get(Calendar.MONTH);
  int index1 = c.get(Calendar.DAY_OF_WEEK);
  sop(c.get(Calendar.YEAR)+"年");
  //sop((c.get(Calendar.MONTH)+1)+"月");//从零开始
 sop(mons[index]);
  sop(c.get(Calendar.DAY_OF_MONTH)+"日");
  //sop("星期"+c.get(Calendar.DAY_OF_WEEK));
 sop(weeks[index1]);
   /*
 Date d = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  String year = sdf.format(d);
  System.out.println(year);
  */
 }
  public static void sop(Object obj)
 {
 System.out.println(obj);
 }
 }
  ------------------------------------------------------------------------------------------------------------
import java.util.*;
  /*
 两个练习:
 1,获取任意年的二月有多少天。
 思路:根据指定年设置一个时间就是 
 c.set(year,2,1)//某一年的3月1日。
 c.add(Calendar.DAY_OF_MONTH,-1);//3月1日,往前推一天,就是2月最后一天。
    2,获取昨天的现在这个时刻。
 c.add(Calenar.DAY_OF_MONTH,-1);
   */
   class  CalendarDemo2
 {
 public static void main(String[] args) 
 {
  Calendar c = Calendar.getInstance();
  //c.set(2012,2,23);//0代表1月------2代表3月
  c.add(Calendar.DAY_OF_MONTH,-18);//对时间量的偏移!
  printCalendar(c);
 }
  public static void printCalendar(Calendar c)
 {
 String[] mons = {"一月","二月","三月","四月"
 ,"五月","六月","七月","八月"
 ,"九月","十月","十一月","十二月"};
   String[] weeks = {
 "","星期日","星期一","星期二","星期三","星期四","星期五","星期六",
 };
 int index = c.get(Calendar.MONTH);
  int index1 = c.get(Calendar.DAY_OF_WEEK);
  sop(c.get(Calendar.YEAR)+"年");
 //sop((c.get(Calendar.MONTH)+1)+"月");
 sop(mons[index]);
 sop(c.get(Calendar.DAY_OF_MONTH)+"日");
 //sop("星期"+c.get(Calendar.DAY_OF_WEEK));
 sop(weeks[index1]);
 }
 public static void sop(Object obj)
 {
 System.out.println(obj);
 }
 }
  ------------------------------------------------------------------------------------------------------------
/*
 练习。给定一个小数。
 保留该小数的后两位。
  选作。可以考虑,保留时进行四舍五入。
  */
 import java.util.*;
  class  MathDemo
 {
 public static void main(String[] args) 
 {
  /*-------必要掌握!!!!
  Random r = new Random();//大于等于0,小于1的伪随机数【有算法】
 for(int x=0; x<10; x++)
 {
 //int d = (int)(Math.random()*10+1);//1到10的随机数
 int d = r.nextInt(10)+1;//"1-10"----不包括
 sop(d);
 }
 */
 saveTwo(12.3456,2,true);//12.35
 }
  public static void saveTwo(double d,int scale,boolean isRound)
 {
  double base = Math.pow(10,scale);
   double num = isRound?Math.round(d*base)/base:((int)(d*base))/base;
  sop("num="+num);
    /*
 double d1 = d*100;
 sop("d1="+d1);
 d1 = d1+0.5;
 double d2 = (int)d1;
 sop("d2="+d2);
 double d3 = d2/100;
 sop("d3="+d3);
  */
 }
  public static void show()//常见的方法!!
 {
 double d = Math.ceil(16.34);//cell返回大于指定数据的最小整数。
 double d1 = Math.floor(16.67);//floor返回小于指定数据的最大整数
 long l = Math.round(12.34);//四舍五入
 sop("d="+d);
 sop("d1="+d1);
 sop("l="+l);
  double d2 = Math.pow(2,3);//2的3次方
 sop("d2="+d2);//结果:8
 }
  public static void sop(Object obj)
 {
  System.out.println(obj);
 }
 }
  ------------------------------------------------------------------------------------------------------------
/*
 字符流和字节流:
  字节流两个基类:
 InputStream   OutputStream
   字符流两个基类:
 Reader Writer
  先学习一下字符流的特点。
  既然IO流是用于操作数据的,
 那么数据的最常见体现形式是:文件。
  那么先以操作文件为主来演示。
  需求:在硬盘上,创建一个文件并写入一些文字数据。
  找到一个专门用于操作文件的Writer子类对象。FileWriter。  后缀名是父类名。 前缀名是该流对象的功能。
   */
 import java.io.*;
 class  FileWriterDemo
 {
 public static void main(String[] args) throws IOException
 {
 //创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
 //而且该文件会被创建到指定目录下。----如果该目录下已有同名文件,将被覆盖。
 //其实该步就是在明确数据要存放的目的地。
 FileWriter fw = new FileWriter("demo.txt");
  //调用write方法,将字符串写入到流中【内存中】。
 fw.write("abcde");
  //刷新流对象中的缓冲中的数据。
 //将数据刷到目的地中。
 //fw.flush();//这时,Demo.txt中会有abcde
  //fw.write("haha");
 //fw.flush();//继续写
  //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
 //将数据刷到目的地中。
 //和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
 fw.close();//最终要做的动作
 }
 }
  ------------------------------------------------------------------------------------------------------------
/*
 IO异常的处理方式。
 */
 import java.io.*;
  class  FileWriterDemo2
 {
 public static void main(String[] args) 
 {
 FileWriter fw = null;
 try
 {
 //这俩异常一起处理
 fw = new FileWriter("demo2.txt");//
 fw.write("abcdefg");//
  }
 catch (IOException e)
 {
 System.out.println("catch:"+e.toString());
 }
 finally
 {
 try
 {
 if(fw!=null)//fw为空不能调用close
 fw.close();//
 }
 catch (IOException e)
 {
 System.out.println(e.toString());
 }
  }
  }
 }
  ------------------------------------------------------------------------------------------------------------
/*
 演示对已有文件的数据续写。
 */
  import java.io.*;
 class  FileWriterDemo3
 {
 public static void main(String[] args) throws IOException//开发时不能抛,要写FileWriterDemo2的异常处理!!!!!
 {
  //传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
 FileWriter fw = new FileWriter("demo2.txt",true);
  fw.write("nihao\r\nxiexie");//windos中记事本的换行是\r\n;     linux中是\n;
  fw.close();
 }
 }
  ------------------------------------------------------------------------------------------------------------
import java.io.*;
  class  FileReaderDemo
 {
 public static void main(String[] args) throws IOException
 {
 //创建一个文件读取流对象,和指定名称的文件相关联。
 //要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
 FileReader fr = new FileReader("demo.txt");
  //调用读取流对象的read方法。
 //read():一次读一个字符。而且会自动往下读。
  int ch = 0;
  while((ch=fr.read())!=-1)//判断是不是到达末尾,-1代表结束---//fr.read()运行一次,返回一个字符
 {
 System.out.println(
 }
   /*
 while(true)
 {
 int ch = fr.read();
 if(ch==-1)//读到末尾就break
 break;
 System.out.println("ch="+(char)ch);//char强转成字符
 }
 */
    fr.close();
   }
 }
  ------------------------------------------------------------------------------------------------------------
/*
 第二种方式:通过字符数组进行读取。
 */
 import java.io.*;
 class FileReaderDemo2 
 {
 public static void main(String[] args) throws IOException
 {
 FileReader fr = new FileReader("demo.txt");
  //定义一个字符数组。用于存储读到的字符。
 //该read(char[])返回的是读到字符个数。
 char[] buf = new char[1024];//一个字符两字节,所以这个是2K
 int num = 0;
 while((num=fr.read(buf))!=-1)//读取几个,fr.read()返回几
 {
 System.out.println(new String(buf,0,num));//读到几个,打印几个
 }
  fr.close();
 }
 }
  ------------------------------------------------------------------------------------------------------------
//读取一个.java文件,并打印在控制台上。
 import java.io.*;
 class FileReaderTest 
 {
 public static void main(String[] args) throws IOException
 {
 FileReader  fr = new FileReader("DateDemo.java");
 char[] buf = new  char[1024];
 int num = 0;
 while((num=fr.read(buf))!=-1)
 {
 System.out.print(new String(buf,0,num));
 }
 fr.close();
 }
 }
  ------------------------------------------------------------------------------------------------------------
//将C盘一个文本文件复制到D盘。
 /*
 复制的原理:
 其实就是将C盘下的文件数据存储到D盘的一个文件中。
 步骤:
 1,在D盘创建一个文件。用于存储C盘文件中的数据。
 2,定义读取流和C盘文件关联。
 3,通过不断的读写完成数据存储。
 4,关闭资源。
 */
 import java.io.*;
 class CopyText 
 {
 public static void main(String[] args) throws IOException
 {
 //copy_1();
 copy_2();
 }
 public static void copy_2()
 {
 FileWriter fw = null;
 FileReader fr = null;
 try
 {
 fw = new FileWriter("SystemDemo_copy.txt");
 fr = new FileReader("SystemDemo.java");
 char[] buf = new char[1024];//定义缓冲区
 int len = 0;
 while((len=fr.read(buf))!=-1)
 {
 fw.write(buf,0,len);
 }
 }
 catch (IOException e)
 {
 throw new RuntimeException("读写失败");
 }
 finally
 {
 if(fr!=null)
 try
 {
 fr.close();
 }
 catch (IOException e)
 {
 }
 if(fw!=null)
 try
 {
 fw.close();
 }
 catch (IOException e)
 {
 }
 }
 }
 //从C盘读一个字符,就往D盘写一个字符。
 public static void copy_1()throws IOException
 {
 //创建目的地。
 FileWriter fw = new FileWriter("RuntimeDemo_copy.txt");
 //与已有文件关联。
 FileReader fr = new FileReader("RuntimeDemo.java");
 int ch = 0;
 while((ch=fr.read())!=-1)
 {
 fw.write(ch);
 }
  fw.close();
 fr.close();
 }
 }