您的位置:首页 > 编程语言 > Java开发

java的System.currentTimeMillis() && Timer和TimerTask && java的File相关 && java的IO相关

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

long start = System.currentTimeMillis();

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

long end = System.currentTimeMillis();

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

示例如下:

import java.text.SimpleDateFormat;  //格式化输出
import java.util.Locale;
public class TestNew 
{
	public static void main(String[] args)throws InterruptedException {
		// TODO Auto-generated method stub
		SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);
		sdf.applyPattern("yyyy年MM月dd日 HH时mm分ss秒");	
		System.out.println(sdf.format(System.currentTimeMillis()));
		System.out.println(System.currentTimeMillis());
	}
}

输出即是

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

1357786454640

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

J***A中也有类似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 stub
		System.out.println("main run");
		Timer timer = new Timer();
		timer.schedule(task, 5000);
	}

}

定义了一个定时器任务,里面必须完成抽象函数run。由于main是static函数,所以必须把task也申明成static,否则会有错误提示。定时器在5秒后调度执行定时器任务。如上执行结果是:

main run

schedule run

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

文件(File)是 最常见的数据源之一,在程序中经常需要将数据存储到文件中,例如图片文件、声音文件等数据文件,也经常需要根据需要从指定的文件中进行数据的读取。绝对路径是指书写文件的完整路径,例如d:\java\Hello.java,该路径中包含文件的完整路径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 stub
		FileInputStream 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_SIZE

			inputBuffer = 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: