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 个回复

倒序浏览
顶一个!!!
回复 使用道具 举报
顶一个  辛苦了
回复 使用道具 举报
复习IO,  赞一个
回复 使用道具 举报
649053473 来自手机 中级黑马 2015-6-7 16:28:59
报纸
好东西!!
回复 使用道具 举报
学习了,,,
回复 使用道具 举报
王强老师,可以把笔记压缩成文件,找个地方供我们下载么.这样方便一些.

点评

后期会做成pdf,让大家下载。  发表于 2015-6-7 22:51
后期会做成pdf,让大家下载。  发表于 2015-6-7 22:51
回复 使用道具 举报
IO流,我来了,谢谢阳哥的及时雨。。。
回复 使用道具 举报
赞一个。。。。
回复 使用道具 举报
支持一下!!
回复 使用道具 举报
不愧是阳哥 果然是详细,代码图文并茂
回复 使用道具 举报
赞赞赞赞
回复 使用道具 举报
阳哥笔记,质量保证,赞一个
回复 使用道具 举报
十分太很感谢
回复 使用道具 举报
不错 顶一个
回复 使用道具 举报
过来观摩一下大牛的笔记
回复 使用道具 举报
赞一个!!!
回复 使用道具 举报
hw3296416 来自手机 中级黑马 2015-6-16 21:17:06
18#
学习了,赞一个…
回复 使用道具 举报

不愧是阳哥 果然是详细,代码图文并茂
回复 使用道具 举报
顶一个  辛苦了
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马