System.currentTimeMillis() 设置安卓系统时间 && Timer和TimerTask && java的File相关 && java的IO相关

来源:互联网 发布:eclipse中创建js页面 编辑:程序博客网 时间:2024/05/22 14:43

        System.currentTimeMillis():产生一个当前的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数。常见作用:一般都是用2个时间的差值来得到运行时间。比如:

long start = System.currentTimeMillis();

      // 这里可以加上你要运行的内容

long end = System.currentTimeMillis();

System.out.println("运行时间:"+(end - start));

(1)该函数示例如下:

import java.text.SimpleDateFormat;  //格式化输出import java.util.Locale;public class TestNew {public static void main(String[] args)throws InterruptedException {// TODO Auto-generated method stubSimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);sdf.applyPattern("yyyy年MM月dd日 HH时mm分ss秒");System.out.println(sdf.format(System.currentTimeMillis()));<span style="font-family:Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">sdf.format可用String.valueOf转成字符串输出到UI上</span>System.out.println(System.currentTimeMillis());}}

输出即是

2013年01月10日 10时54分14秒
1357786454640

System.currentTimeMillis的值与java.util.Calendar.getInstance().getTimeInMillis()是一样的。

(2)获取当前时间,安卓系统提供了两种方法:SystemClock.uptimeMillis 和 System.currentTimeMillis,这两种方法有何区别呢?1. SystemClock.uptimeMillis()  // 从开机到现在的毫秒数(手机睡眠的时间不包括在内);2. System.currentTimeMillis() // 从1970年1月1日 UTC到现在的毫秒数;我们多用第二种。

         注意System类没有设置UTC时间的子函数,倒是安卓的类SystemClock(base\core\java\android\os\SystemClock.java)是有这个子函数的setCurrentTimeMillis。所以我们需要更新系统时间的时候,用它就可以。这个是在上层设置,如果需要在内核层设置时间,方法是在RTC驱动设置时间的地方,可以如下修改,也可以修改RTC中有个default值的地方。

seconds = rtc_read_time();printk("init PMU/RTC time to  %ld \n", seconds);if(seconds <= 1325402913) {seconds = 1325402913;/*2012-01-01*/ret = rtc_set_time(seconds);RTC_DBG("Init Set time: %ld, ret =0x%x\n", seconds, ret);}

(3)时区对时间的影响。示例1中没有时区,很多时候时间是跟时区关联的,TimeZone类。

DateFormat dateFormatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");TimeZone pst = TimeZone.getTimeZone("Etc/GMT-0");Date curDate = new Date(); dateFormatter.setTimeZone(pst);System.out.println(dateFormatter.format(curDate));

显示2016-05-12 14:22:13。如果改GMT-8,则是本地北京时间,比GMT-0快8个小时。所以GMT-0时间的秒数,加上28800即是北京时间的秒数。

(4)获得日期时间独立的年/月/日/时/分/秒的值

       要获得以上值,有两种方法。用java的类Calendar

    Calendar calendar = Calendar.getInstance();String created = calendar.get(Calendar.YEAR) + "年"+ (calendar.get(Calendar.MONTH)+1) + "月"//从0计算+ calendar.get(Calendar.DAY_OF_MONTH) + "日"+ calendar.get(Calendar.HOUR_OF_DAY) + "时"+ calendar.get(Calendar.MINUTE) + "分"+calendar.get(Calendar.SECOND)+"s";Log.e("msg", created);
        或者android的类Time
    Time t=new Time(); // or Time t=new Time("GMT+8"); 加上Time Zone资料。    t.setToNow(); // 取得系统时间。    String time=t.year+"年 "+(t.month+1)+"月 "+t.monthDay+"日 "+t.hour+"h "+t.minute+"m "+t.second;    Log.e("msg", time);

CharSequence sysTimeStr; if (DateFormat.is24HourFormat(context)) {     sysTimeStr = DateFormat.format("HH:mm", t.toMillis(false));} else {     sysTimeStr = DateFormat.format("hh:mm", t.toMillis(false));}
===============================================================================================================

      JAVA中也有类似VC中的定时执行函数,分别是定时器Timer、定时器任务TimerTask,两者组合起来使用。示例如下:

import java.util.Timer;import java.util.TimerTask;public class TestNew {static TimerTask task = new TimerTask(){     public void run(){System.out.println("schedule run");}};/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("main run");Timer timer = new Timer();timer.schedule(task, 5000);}}

        定义了一个定时器任务,里面必须完成抽象函数run。定时器在5秒后调度执行定时器任务。如上执行结果是:

main run
schedule run 

        其实timer.schedule的原型是timer.schedule(new MyTask, time0, time1);第一个参数是要执行的TimerTask;第二个参数时间间隔,要等待多长时间才可以第一次执行 run() 方法;第三个参数则是循环时间差,从第二次开始每隔多长时间执行一次run方法。

=========================================================================================================================

        文件(File)是 最常见的数据源之一,在程序中经常需要将数据存储到文件中,例如图片文件、声音文件等数据文件,也经常需要根据需要从指定的文件中进行数据的读取。绝对路径是指书写文件的完整路径,例如d:\java\Hello.java,相对路径是指书写文件的部分路径,例如\test\Hello.java,该路径中只包含文件的部分路径\test和文件的全名Hello.java,使得文件路径产生一定的灵活性。

由于’\’是Java语言中的特殊字符,所以在代码内部书写文件路径时,例如代表“c:\test\java\Hello.java”时,需要书写成“c:\\test\\java\\Hello.java”

(1)java.io包中设计了一个专门的类——File类。在File类中包含了大部分和文件操作的功能方法,该类的对象可以代表一个具体的文件或文件夹

        A,下面是创建的文件对象示例,public File(String pathname),例如:

 File f1 = new File(“d:\\test\\1.txt”);
 File f2 = new File(“1.txt”);
 File f3 = new File(“e:\\abc”);

这里的f1和f2对象分别代表一个文件,f1是绝对路径,而f2是相对路径,f3则代表一个文件夹。也可以使用父路径和子路径结合,实现代表文件路径,例如:File f4 = new File(“d:\\test\\”,”1.txt”);这样代表的文件路径是:d:\test\1.txt。

        B,File类常用方法

createNewFile:public boolean createNewFile() throws IOException,该方法只能用于创建文件,不能用于创建文件夹,且文件路径中包含的文件夹必须存在。

delect:public boolean delete(),该方法的作用是删除当前文件或文件夹。如果删除的是文件夹,则该文件夹必须为空。

exists:public boolean exists(),该方法的作用是判断当前文件或文件夹是否存在。

getAbsolutePath:public String getAbsolutePath(),该方法的作用是获得当前文件或文件夹的绝对路径。

getName:public String getName(),该方法的作用是获得当前文件或文件夹的名称。

getParent:public String getParent(),该方法的作用是获得当前路径中的父路径。

isDirectory:public boolean isDirectory(),该方法的作用是判断当前File对象是否是目录。

isFile:public boolean isFile(),该方法的作用是判断当前File对象是否是文件。

length:public long length(),该方法的作用是返回文件存储时占用的字节数。该数值获得的是文件的实际大小,而不是文件在存储时占用的空间数。

mkdir:public boolean mkdir(),该方法的作用是创建当前路径下的文件夹,而不创建该路径中的其它文件夹。假设d盘下只有一个test文件夹,则创建d:\test\abc文件夹则成功,如果创建d:\a\b文件夹则创建失败,因为该路径中d:\a文件夹不存在。

mkdirs:public boolean mkdirs(),该方法的作用是创建文件夹,如果当前路径中包含的父目录不存在时,也会自动根据需要创建。

flush:输出流类似于一根管道,输出的时候先放到管道里,然后管道满了存到介质上,当我们输出完后管道里面可能还有剩余,就用flush()清空管道全部存到介质上。

list:输出某个文件夹下的文件名列表。比如:File file = new File("/data/app/");String[] files = file.list();

(2)用实例说明File常用函数

public static void main(String[] args) {File f1 = new File("d:\\test");File f2 = new File("1.txt");File f3 = new File("d:\\file.txt");File f4 = new File("d:\\","1.txt");try{boolean b = f3.createNewFile();}catch(Exception e){e.printStackTrace();}System.out.println(f4.exists());System.out.println(f3.getAbsolutePath());System.out.println(f3.getName());System.out.println(f3.getParent());System.out.println(f1.isDirectory());System.out.println(f3.isFile());System.out.println(f3.length());System.out.println(" ");//空行File f6 = new File("d:\\test\\abc");boolean b1 = f6.mkdir();System.out.println(b1);b1 = f6.mkdirs();System.out.println(b1);}
运行结果:

false
d:\file.txt
file.txt
d:\
true
true
0
 
false
true

说明:f4.exists()为false,因为new File只是新建了一个路径对象,并没有文件实体,除非用createNewFile。f3.getAbsolutePath()可以得到正确的路径,因为它是创建过的。f3.getName()就是返回文件名file.txt。f3.getParent()返回该文件的父目录,为d:\。f1.isDirectory()返回f1是否是目录,很显然没有跟后缀名的肯定是目录。f3.isFile()返回是否是文件,这个文件已经创建成功了,为true。f3.length()返回文件长度,目前没有写任何内容,所以是0。f6.mkdir()返回失败,因为首先d的test目录就不存在,更不用说去创建abc目录,f6.mkdirs()返回true,因为它可以一起多目录创建。

====================================================================================================

        Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串;而字节流处理单元为 1 个字节,操作字节和字节数组。类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换(在(3)演示,(1)(2)实现同样的功能不过做法不同)。

字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。

         综合起来,以字节为导向是stream系列,包括输入和输出,如下:


         以字符为导向的是Reader/Writer系列,包括输入和输出,如下:


(1)将文件中的数据读入程序,是将程序外部的数据传入程序中,应该使用输入流——InputStream或Reader。而由于读取的是特定的数据源——文件,则可以使用输入对应的子类FileInputStream或FileReader实现。在Java语言的IO编程中,读取文件是分两个步骤:1、将文件中的数据转换为流,2、读取流内部的数据。其中第一个步骤由系统完成,只需要创建对应的流对象即可,对象创建完成以后步骤1就完成了,第二个步骤使用输入流对象中的read方法即可实现了。

public static void main(String[] args) {// TODO Auto-generated method stubFileInputStream fis = null;                         try{                 //创建流对象                 fis = new FileInputStream("d:\\file.txt");                 //将读取到的数据存储到数组中                 byte[] data = new byte[1024]; //数据存储的数组                 int i = 0; //当前下标                 //读取流中的第一个字节数据                 int n = fis.read();                 //依次读取后续的数据                 while(n != -1){ //未到达流的末尾                          //将有效数据存储到数组中                          data[i] = (byte)n;                          //下标增加                          i++;                          //读取下一个字节的数据                           n = fis.read();                 }                                 //将数组构建成字符串,解析数据                 String s = new String(data,0,i);                 //输出字符串                 System.out.println(s);        }catch(Exception e){                 e.printStackTrace();        }finally{                 try{                          //关闭流,释放资源                          fis.close();                 }catch(Exception e){}        }}

上面循环读取文件数据到数组的过程,其实可以用一句话来代替int i = fis.read(data);返回的i则是真实读取的个数。

         当然,在读取文件时,也可以使用Reader类的子类FileReader进行实现,在编写代码时,只需要将上面示例代码中的byte数组替换成char数组即可。使用FileReader读取文件时,是按照char为单位进行读取的,所以更适合于文本文件的读取,而对于二进制文件或自定义格式的文件来说,还是使用FileInputStream进行读取,方便对于读取到的数据进行解析和操作。

(2)在向文件中输出数据,也就是写文件时,使用对应的文件输出流,包括FileOutputStream和FileWriter两个类,下面以FileOutputStream为例子说明输出流的使用。示例代码如下:

public static void main(String[] args) {        String s = "Java语言";        int n = 100;        //声明流对象        FileOutputStream fos = null;        try{                 //创建流对象                 fos = new FileOutputStream("d:\\out.txt");                 //转换为byte数组                 byte[] b1 = s.getBytes();                 //换行符                 byte[] b2 = "\r\n".getBytes();                 byte[] b3 = String.valueOf(n).getBytes();                 //依次写入文件                 fos.write(b1);                 fos.write(b2);                 fos.write(b3);        } catch (Exception e) {                 e.printStackTrace();        }finally{                 try{                          fos.close();                 }catch(Exception e){}        }}

该示例代码写入的文件使用记事本打开以后,内容为:

Java语言
100

说明:当外部文件不存在时,系统会自动创建该文件,但是如果文件路径中包含未创建的目录时将出现异常。这里书写的文件路径可以是绝对路径也可以是相对路径。

        在 实际写入文件时,有两种写入文件的方式:覆盖和追加。其中“覆盖”是指清除原文件的内容,写入新的内容,默认采用该种形式写文件,“追加”是指在已有文件 的末尾写入内容,保留原来的文件内容,例如写日志文件时,一般采用追加。在实际使用时可以根据需要采用适合的形式。最基本的写入方法只支持byte数组格式的数据,所以如果需要将内容写入文件,则需要把对应的内容首先转换为byte数组。

        其实,所有的数据文件,包括图片文件、声音文件等等,都是以一定的数据格式存储数据的,在保存该文件时,将需要保存的数据按照该文件的数据格式依次写入即可,而在打开该文件时,将读取到的数据按照该文件的格式解析成对应的逻辑即可。

        使用FileWriter写入文件时,步骤和创建流对象的操作都和该示例代码一致,只是在转换数据时,需要将写入的数据转换为char数组,对于字符串来说,可以使用String中的toCharArray方法实现转换,然后按照文件格式写入数据即可。

(3)InputStreamReader和OutputStreamWriter的使用,用一个例子将文本保存到外置SD卡上,然后再从外置SD卡读文本来显示(提示:如果是保存在内置存储器上,在/data/data/appname/目录下查找文件就行)。运行界面


EditText textBox;
textBox = (EditText) findViewById(R.id.txtText1);
static final int READ_BLOCK_SIZE = 100;

save操作:

public void onClickSave(View view) {String str = textBox.getText().toString();try{            //---SD Card Storage---            File sdCard = Environment.getExternalStorageDirectory();            File directory = new File (sdCard.getAbsolutePath() +                "/MyFiles");            directory.mkdirs();            File file = new File(directory, "textfile.txt");            FileOutputStream fOut = new FileOutputStream(file);           OutputStreamWriter osw = new OutputStreamWriter(fOut);//---write the string to the file---osw.write(str);osw.flush(); osw.close();//---display file saved message---Toast.makeText(getBaseContext(),"File saved successfully!",Toast.LENGTH_SHORT).show();//---clears the EditText---textBox.setText("");}catch (IOException ioe){ioe.printStackTrace();}}

load操作:

public void onClickLoad(View view) {try{//---SD Storage---            File sdCard = Environment.getExternalStorageDirectory();            File directory = new File (sdCard.getAbsolutePath() + "/MyFiles");            File file = new File(directory, "textfile.txt");            FileInputStream fIn = new FileInputStream(file);            InputStreamReader isr = new InputStreamReader(fIn);               char[] inputBuffer = new char[READ_BLOCK_SIZE];String s = "";int charRead;while ((charRead = isr.read(inputBuffer))>0){//---convert the chars to a String---String readString = String.copyValueOf(inputBuffer, 0,charRead);s += readString;//add result append to s if file size larger than READ_BLOCK_SIZEinputBuffer = new char[READ_BLOCK_SIZE];//clear buffer}//---set the EditText to the text that has been read---textBox.setText(s);Toast.makeText(getBaseContext(),"File loaded successfully!",Toast.LENGTH_SHORT).show();}catch (IOException ioe) {ioe.printStackTrace();}}
需要注意的是:外置SD路径不能指定硬路径,不同系统上是不一样的,所以一定要用getExternalStorageDirectory函数。另外,读写外部存储器是需要权限的<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />



参考原文:http://blog.csdn.net/ilibaba/article/details/3955799

参考原文:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616367.html

参考原文:http://blog.csdn.net/j00152685/article/details/5354862

参考原文:http://blog.csdn.net/ahxu/article/details/249610 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老赖拒绝还款怎么办 gta5资产不兼容怎么办 平板黑屏闪退怎么办 施工证学历不够怎么办 隧道放炮声大怎么办 58工作被骗了怎么办 学历国家不承认怎么办 福州居住证一年到期怎么办 居住证过期2年怎么办 被房东坑了怎么办 房东违反了合同怎么办 上海居住证过期了怎么办 地铁卡消磁了怎么办 学生卡消磁了怎么办 家属院没房产证怎么办 邮箱收不到邮件怎么办 大学宿舍八人间怎么办 高中档案袋拆了怎么办 公派教师回国后怎么办? 事业单位辞职后档案怎么办 学信支付不了怎么办 校外怎么办北邮校园卡 报考身份证丢了怎么办 买房怎么办不取消低保 自考找不到真题怎么办 自考生考研没有档案怎么办 自考本科无学位怎么办 自考学位证书没拿到怎么办 自考毕业证出生日期错误怎么办 成考没有学位证怎么办 评职称学历认证怎么办 国家不承认学历怎么办 高考分数错了怎么办 签合同了不想干怎么办 贵港教育小学插班生怎么办 学校宿舍限瓦怎么办 苹果锁屏后wifi断开怎么办 兼职一天不给钱怎么办 五月孩子掉床怎么办 孩子五月份掉床怎么办 郑州怎么办暂住证凭条