A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始







8、IO

8.1 其他对象API

    8.1.1 System类

    System类中的字段和方法都是静态的。

    常见方法:
    long currentTimeMillis();获取当前时间的毫秒值,可以通过此方法检测程序的执行时间。


   示例:
  1. public class SystemDemo{
  2.      public static void main(String[] args){
  3.           long l1 = System.currentTimeMillis();
  4.           System.out.println(l1);
  5.         
  6.           code...

  7.           long l2 = System.currentTimeMillis();
  8.           System.out.println(l2-l1);
  9.      }
  10. }
复制代码

    Properties getProperties();确定当前的系统属性。
    Properties集合中存储的都是String类型的键和值。
    最好使用它自己的存储和取出的方法来完成元素的操作。


    示例1:
  1. import java.util.Properties;
  2. import java.util.Set;

  3. public class SystemDemo{
  4.        public static void main(String[] args){
  5.              //获取系统的属性信息,并存储到了Properties集合中
  6.             Properties prop = System.getProperties();

  7.             Set<String> nameSet = prop.stringPropertyNames();

  8.              for(String name : nameSet){
  9.                   String value = prop.getProperty(name);
  10.                   System.out.println(name + " = " + value);
  11.             }
  12.       }
  13. }
复制代码
     运行结果:

    Windows系统中换行为\r\n两个转义字符,Linux只有一个\n。

    示例2:
  1. import java.util.Properties;
  2. import java.util.Set;

  3. public class SystemDemo{
  4.        public static void main(String[] args){
  5.             System.out.println( "hello-\r\n world");

  6.              final String LINE_SEPARATOR = System.getProperty("line.separator" );
  7.             System.out.println( "hello" + LINE_SEPARATOR  + "word" );
  8.       }
  9. }
复制代码
   运行结果:


    P.S.
    给属性设置一些属性信息,这些信息是全局的,其他程序都可以使用。例:System.setPeroperty("myclasspath","c:\myclass");。

    8.1.2 Runtime类

    每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。应用程序不能创建自己的 Runtime 类实例。

    P.S.
    Runtime:没有构造方法摘要,说明该类不可以创建对象。又发现还有非静态的方法,说明该类应该提供静态的返回该类对象的方法。而且只有一个,说明Runtime类使用了单例设计模式。

    示例1:
  1. public class RuntimeDemo{
  2.        public static void main(String[] args) throws Exception{
  3.             Runtime r = Runtime.getRuntime();
  4.             
  5.             Process p = r.exec( "notepad.exe D:\\code\\day20\\RuntimeDemo.java");
  6.             Thread.sleep(5000);
  7.             p.destroy();
  8.       }
  9. }
复制代码
   运行结果:



    8.1.3 Math类

    Math:提供了操作数学运算的方法,都是静态的。

    常用方法:
    ceil():返回大于参数的最小整数。
    floor():返回小于参数的最大整数。
    round():返回四舍五入的整数。
    pow(a,b):a的b次方。


    示例1:
  1. import java.util.Random;

  2. public class MathDemo{
  3.        public static void main(String[] args){
  4.              double d1 = Math.ceil(12.56);
  5.              double d2 = Math.floor(12.56);
  6.              double d3 = Math.round(12.56);

  7.             System.out.println(d1);
  8.             System.out.println(d2);
  9.             System.out.println(d3);

  10.              double d4 = Math.pow(10,2);
  11.             System.out.println(d4);

  12.             Random r = new Random();
  13.             
  14.              for(int i = 0; i < 5; i++){
  15.                    double d5 = Math.ceil(Math.random() * 10);
  16.                   System.out.println( "d5 = " + d5);
  17.             }

  18.              for(int i = 0; i < 5; i++){
  19.                    double d6 = (int)(r.nextDouble() * 6 + 1);
  20.                   System.out.println( "d6 = " + d6);
  21.             }
  22.       }
  23. }
复制代码
   运行结果:

    8.1.4 Date、DateFormat类


    示例1:
  1. import java.util.Date;

  2. public class DateDemo{
  3.        public static void main(String[] args){
  4.              long time = System.currentTimeMillis();
  5.             System.out.println(time);

  6.              //将当前日期和时间封装成Date对象
  7.             Date date1 = new Date();
  8.             System.out.println(date1);

  9.              //将指定毫秒值封装成Date对象
  10.             Date date2 = new Date(1405244787235l);
  11.             System.out.println(date2);
  12.       }
  13. }
复制代码
   运行结果:

    日期对象和毫秒值之间的转换
    毫秒值-->日期对象:
    1. 通过Date对象的构造方法 new Date(timeMillis);
    2. 还可以通过setTime设置。
    因为可以通过Date对象的方法对该日期中的各个字段(年月日等)进行操作。

    日期对象-->毫秒值:
    1. getTime方法。
    因为可以通过具体的数值进行运算。

    对日期对象进行格式化:
    将日期对象-->日期格式的字符串。
    使用的是DateFormat类中的format方法。


    示例2:
  1. import java.text.DateFormat;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;

  4. public class DateDemo{
  5.        public static void main(String[] args){
  6.             Date date = new Date();

  7.              //获取日期格式对象,具备着默认的风格。也可以指定为FULL、LONG风格。
  8.             DateFormat df = DateFormat.getDateInstance(DateFormat.FULL);
  9.             String str_date1 = df.format(date);
  10.             System.out.println(str_date1);

  11.             df = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.LONG);
  12.             String str_date2 = df.format(date);
  13.             System.out.println(str_date2);

  14.              //如果风格是自定义的如何解决呢?
  15.             df = new SimpleDateFormat("yyyy--MM--dd" );
  16.             String str_date3 = df.format(date);
  17.             System.out.println(str_date3);
  18.       }
  19. }
复制代码
   运行结果:

    将日期格式的字符串-->日期对象。
    使用的是DateFormat类中的prase方法。


    示例3:
  1. import java.text.DateFormat;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;

  4. public class DateDemo{
  5.        public static void main(String[] args) throws Exception {
  6.             String str_date1 = "2012年4月19日" ;
  7.             String str_date2 = "2012--4--19";

  8.             DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
  9.             Date date1 = dateFormat.parse(str_date1);
  10.             System.out.println(date1);
  11.             
  12.             dateFormat= new SimpleDateFormat("yyyy--MM--dd" );
  13.             Date date2 = dateFormat.parse(str_date2);
  14.             System.out.println(date2);
  15.       }
  16. }
复制代码
   运行结果:

    练习:
    "2012-3-17"到"2012-4-6"中间有多少天?

    思路:
    两个日期相减就可以了。
    必须有两个可以进行减法运算的数。
    能减可以是毫秒值,如何获取毫秒值?通过date对象。
    如何获取date对象呢?可以将字符串转成date对象。

    1. 将日期格式的字符串转成Date对象。
    2. 将Date对象转成毫秒值。
    3. 相减,编程天数。


    代码:
  1. import java.util.Date;
  2. import java.text.DateFormat;
  3. import java.text.SimpleDateFormat;

  4. public class Test{
  5.        public static void main(String[] args) throws Exception {
  6.             String str_date1 = "2014-3-17";
  7.             String str_date2 = "2014-4-6";
  8.             test(str_date1,str_date2);
  9.       }
  10.       
  11.        public static void test(String str_date1,String str_date2) throws Exception {
  12.              //1、将日期字符串转成日期对象
  13.              DateFormat dateFormat = DateFormat.getDateInstance();
  14.              dateFormat = new SimpleDateFormat("yyyy-MM-dd" );

  15.              Date date1 = dateFormat.parse(str_date1);
  16.              Date date2 = dateFormat.parse(str_date2);

  17.              long time1 = date1.getTime();
  18.              long time2 = date2.getTime();

  19.              long time = Math.abs(time2-time1);
  20.              System.out.println(time);

  21.              int day = getDay(time);
  22.              System.out.println(day);
  23.       }

  24.        private static int getDay(long time){
  25.              int day = (int)(time/1000/60/60/24);
  26.              return day;
  27.       }
  28. }
复制代码
   运行结果:


    8.1.5 Calendar类

    Calendar 类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

    示例一:
  1. import java.util.Calendar;

  2. public class CalendarDemo{
  3.       
  4.        public static void main(String[] args){
  5.              //GregorianCalendar
  6.             Calendar c = Calendar.getInstance();
  7.             showDate(c);
  8.       }
  9.       
  10.        public static void showDate(Calendar c){
  11.              int year = c.get(Calendar.YEAR);
  12.              int month = c.get(Calendar.MONTH) + 1;
  13.              int day = c.get(Calendar.DAY_OF_MONTH);
  14.              int week = c.get(Calendar.DAY_OF_WEEK);

  15.              System.out.println(year + "年" + month + "月" + day + "日" + getWeek(week));
  16.       }
  17.       
  18.        public static String getWeek(int i){
  19.              String[] weeks = { "","星期日" ,"星期一" ,"星期二" ,"星期三" ,"星期四" ,"星期五" ,"星期六" };     
  20.              return weeks[i];
  21.       }
  22. }
复制代码
    运行结果:

    示例二:
  1. import java.util.Calendar;

  2. public class CalendarDemo{
  3.       
  4.        public static void main(String[] args){
  5.             Calendar c = Calendar.getInstance();
  6.             c.set(2014,3,20);
  7.             c.add(Calendar.YEAR,-2);
  8.             showDate(c);
  9.       }
  10.       
  11.        public static void showDate(Calendar c){
  12.              int year = c.get(Calendar.YEAR);
  13.              int month = c.get(Calendar.MONTH) + 1;
  14.              int day = c.get(Calendar.DAY_OF_MONTH);
  15.              int week = c.get(Calendar.DAY_OF_WEEK);

  16.             System.out.println(year + "年" + month + "月" + day + "日" + getWeek(week));
  17.       }
  18.       
  19.        public static String getWeek(int i){
  20.             String[] weeks = { "","星期日" ,"星期一" ,"星期二" ,"星期三" ,"星期四" ,"星期五" ,"星期六" };     
  21.              return weeks[i];
  22.       }
  23. }
复制代码
   运算结果:

    练习:
    打印每年2月有多少天

    代码:
  1. import java.util.Calendar;

  2. public class CalendarDemo{
  3.       
  4.        public static void main(String[] args){
  5.              int year = 2014;
  6.             showDays(year);
  7.       }
  8.       
  9.        public static void showDays(int year){
  10.             Calendar c = Calendar.getInstance();
  11.              //将日期设置为3月1日,然后减一天,打印出2月份的最后一天日期,即可知2月有多少天
  12.             c.set(year,2,1);
  13.             c.add(Calendar.DAY_OF_MONTH,-1);
  14.             showDate(c);
  15.       }
  16.       
  17.        public static void showDate(Calendar c){
  18.              int year = c.get(Calendar.YEAR);
  19.              int month = c.get(Calendar.MONTH) + 1;
  20.              int day = c.get(Calendar.DAY_OF_MONTH);
  21.              int week = c.get(Calendar.DAY_OF_WEEK);

  22.             System.out.println(year + "年" + month + "月" + day + "日" + getWeek(week));
  23.       }
  24.       
  25.        public static String getWeek(int i){
  26.             String[] weeks = { "","星期日" ,"星期一" ,"星期二" ,"星期三" ,"星期四" ,"星期五" ,"星期六" };     
  27.              return weeks[i];
  28.       }
  29. }
复制代码
   运行结果:

8.2 IO流

    8.2.1 IO流

    IO流用来处理设备之间的数据传输。Java对数据的操作是通过流的方式。Java用于操作流的对象都在IO包中。
    输入流和输出流相对于内存设备而言。

    将外设中的数据读取到内存中:输入。
    将内存的数写入到外设中:输出。

    流按操作数据分为两种:字节流与字符流。

    字符流的由来:
    其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字。再对这个文字进行操作。简单说:字节流+编码表。


    8.2.2 IO流常用基类-字符流

    字节流的抽象基类:InputStream,OutputStream。

    字符流的抽象基类:Reader,Writer。

    P.S.
    由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
    如:InputStream的子类FileInputStream。
    如:Reader的子类FileReader。


    需求:将一些文字存储到硬盘一个文件中。
    记住:如果要操作文字数据,建议优先考虑字符流。
    而且要将数据从内存写到硬盘上,要使用字符流中的输出流:Writer。
    硬盘的数据基本体现是文件,希望找到一个可以操作文件的Writer:FileWriter。


    示例1:
  1. import java.io.FileWriter;
  2. import java.io.IOException;

  3. public class FileWriterDemo{
  4.        public static void main(String[] args) throws IOException{
  5.              //创建一个可以往文件中写入字符数据的字符输出流对象
  6.              //既然是往一个文件中写入文字数据,那么在创建对象时,就必须明确该文件(用于存储数据的目的地)
  7.              //如果文件不存在,则会自动创建
  8.              //如果文件存在,则会被覆盖
  9.             FileWriter fw = new FileWriter("demo.txt" );
  10.             
  11.              //调用Writer对象中的write(string)方法,写入数据
  12.              //其实数据写入到临时存储缓冲区中
  13.             fw.write( "abcde");
  14.             
  15.              //进行刷新,将数据直接写入到目的地中
  16.             fw.flush();

  17.              //关闭流,关闭资源,在关闭前会先调用flush刷新缓冲中的数据到目的地。
  18.             fw.close();
  19.       }
  20. }
复制代码
   运行结果:




    P.S.
    1. close方法只能用一次。
    2. 流关闭以后不能,不能再调用write方法,否则会报如下异常错误:


    如果构造函数中加入true,可以实现对文件进行续写。

    示例2:
  1. import java.io.FileWriter;
  2. import java.io.IOException;

  3. public class FileWriterDemo{
  4.        public static void main(String[] args) throws IOException{
  5.             FileWriter fw = new FileWriter("demo.txt" ,true);

  6.             fw.write( "xixi");
  7.             fw.close();
  8.       }
  9. }
复制代码
   运行结果:



    IO流的异常处理方式:为防止代码异常导致流无法关闭,因此在finally中对流进行关闭。

    示例3:
  1. import java.io.FileWriter;
  2. import java.io.IOException;

  3. public class IOExceptionDemo{
  4.        public static void main(String[] args){

  5.             FileWriter fw  = null;

  6.              try{
  7.                   fw = new FileWriter("demo.txt" );
  8.       
  9.                   fw.write( "abcde");
  10.             } catch(IOException e){
  11.                   System.out.println(e.toString());
  12.             } finally{
  13.                    try{
  14.                         fw.close();
  15.                   } catch(IOException e){
  16.                          throw new RuntimeException("关闭失败");
  17.                   }
  18.             }
  19.       }
  20. }
复制代码
    运行结果:


    需求:读取一个文文件,将读取到的字符打印到控制台。(使用FileReader)
    第一种读取方式:使用read()方法读取文本文件数据。

    示例4:
  1. import java.io.FileReader;
  2. import java.io.IOException;

  3. public class FileReaderDemo{
  4.        public static void main(String[] args) throws IOException{

  5.             FileReader fr = new FileReader("demo.txt" );

  6.              //用Reader中的read方法读取字符
  7.              int ch = 0;

  8.              while((ch = fr.read()) != -1){
  9.                   System.out.println(( char)ch);
  10.             }

  11.             fr.close();
  12.       }
  13. }
复制代码
   运行结果:

    说明:

    第二种读取方式:使用read(char[])方法读取文本文件数据。

    示例5:
  1. import java.io.FileReader;
  2. import java.io.IOException;

  3. public class FileReaderDemo{
  4.        public static void main(String[] args)throws IOException{
  5.             FileReader fr = new FileReader("demo.txt" );

  6.              //使用read(char[])读取文本文件数据
  7.              //先创建字符数组
  8.              char[] buf = new char[3];

  9.              int len = 0;

  10.              while((len = fr.read(buf)) != -1){
  11.                   System.out.println( new String(buf,0,len));
  12.             }

  13.             fr.close();
  14.       }
  15. }
复制代码
   运行结果:

~END~



~爱上海,爱黑马~


49 个回复

正序浏览
我就喜欢这种直接上代码的
回复 使用道具 举报
昨天刚刚学完这一小节,
回复 使用道具 举报
66666666666666666
回复 使用道具 举报
辛苦; 了...................
回复 使用道具 举报
笔记不错,有助于理解
回复 使用道具 举报
lktz 中级黑马 2016-2-14 01:43:26
43#
标记标记
回复 使用道具 举报
lktz 中级黑马 2016-1-27 01:32:13
42#
好详细...
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
感谢分享
回复 使用道具 举报
很不错的,总结的挺好的
回复 使用道具 举报
又是一天笔记,已吸收
回复 使用道具 举报
it213399 来自手机 中级黑马 2015-10-7 22:34:51
37#
顶!!!!
回复 使用道具 举报
刚刚复习到这一块,这笔记对我来说很重要
回复 使用道具 举报
目前还没到20天,先预习下
回复 使用道具 举报
阳哥笔记,教做人!
回复 使用道具 举报
阳哥又有新作品啦,那必须好好捧场呀。
回复 使用道具 举报
Rzzz 中级黑马 2015-10-7 14:36:23
32#
看到日期对象和毫秒值之间的转换一下清晰!!!1
回复 使用道具 举报
马克,学习学习!!!!
回复 使用道具 举报
阳哥辛苦了。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马