|
|
在启动Java控制台应用程序,可以一次性地向程序中传递零至多个参数,这些参数被称为命令行参数(Command Line Arguments),这些参数将被系统接收并静态初始化为一个一维的String数组对象,然后将该数组对象作为实参传给应用程序入口main(),其语法格式为:
java <应用程序类名>[<命令行参数>]* 简单的测试程序如下:
public class TestCommandLineArgs {public static void main(String args[]){for(int i =0; i< args.length; i++){System.out.println(args);}}} 其中 args[0] 代表的是第一个参数,与C的命令行参数有所不同。
注意:
1.命令行参数使用空格符分隔,如果参数本身包含空格符的话则必须使用双引号““ ”括起来,如果参数中包含双引 号字符的话,则需要使用两个连续的双引号进行转移。
2.如果没有给出任何命令行参数,则系统也会创建一个长度为0的一维String数组对象,并将其传递给main()方法的参数,此时参数args的值不是null,而是相当于:”args = new String[0];"
2.系统属性
- Java系统属性是以“键-值”对的形式存在--由属性名称,属性值两部分组成,均为字符串形式,记录了当前操作系统和JVM等相关的环境信息。
- 可以使用System.getProperties()方法获得Properties类的对象,其中包含了所有可用的系统属性信息。
- 可使用System或Properties类的getProperty(String)方法获得特定系统属性的属性值。
- 可使用System或Properties类的setProperty(String,String)方法添加新的系统属性信息。
- 在命令行运行Java程序时,可以使用-D选项添加新的系统属性。
public class TestSystemProperty {public static void main(String args[]){Properties ps = System.getProperties();ps.setProperty("crazy", "grass");Enumeration pn = ps.propertyNames();while(pn.hasMoreElements()){String pName =(String) pn.nextElement();String pValue = ps.getProperty(pName);System.out.println(pName + "-----" + pValue);}}} 3.标准输入/输出
控制台输入/输出是应用程序最基本且常用的功能之一,java.lang.System类的三个静态类成员提供了有关的I/O操作功能:
public static final PrintStream out
标准输出工具,提供向“标准输出“写出数据的功能。System.out对象为 java.io.PrintStream类型,在Java虚拟机启动时,已被初始化并关联到运行Java程序的终端窗口。
public static final InputStream in
标准输入工具,提供从“标准输入”读入数据的功能。System.in对象为java.io.InputStream类型,已被初始话关联到用户键盘。
public static final PrintStrem err (很少使用)
简单的使用:
public class TestStandardInput {public static void main(String args[]){String s;InputStreamReader isr = new InputStreamReader(System.in);BufferedReader reader = new BufferedReader(isr);try {s = reader.readLine();while(!s.equals("")){System.out.println(s);s = reader.readLine();}} catch (IOException e) {e.printStackTrace();}}} 4.文件操作
File类型对象的内容是不可变的;也就是说,File对象已经创建其所封装的路径/文件名信息将不可改变直至销毁。
File类中定义了多个方法,介绍下常用的:
public File(String pathname)
通过给定的路径/文件名字符串创建一个新File实例。
public File(String parent, String child)
通过分别给定的parent路径和child文件名(也可能是自路径名)或字符串来创建一个新的File实例。
public String getName()
返回此File对象所表示的文件名或目录名(最后一级子目录名)。
public String getPath()
返回此File对象所对应的路径。
public String getAbsolutePath()
返回此File对象所对应的绝对路径名。
public String getParent()
返回此File对象对应目录(最后一级子目录)的父目录路径名。
public long length()
返回当前File对象所表示的文件的长度,单位为字节。如果当前对象对应的是一个目录而不是一个文件,则返回值是不确定的。
public String[] list()
返回当前File对象所表示的目录中包含的所有文件及子目录的名称所组成的字符串数组。
public File[] listFiles()
返回当前File对象所表示的目录中包含的所有文件和子目录对应的File对象。
public boolean exists()
测试当前File对象所表示的文件或目录是否存在。
public boolean canRead()
测试应用程序是否可以读取当前File对象所表示的文件。
public boolean canWrite()
测试应用程序是否可以修改当前File对象所表示的文件。
public boolean isFile()
测试当前File对象所表示的是否是一个标准文件
public boolean isHidden()
测试当前File对象所表示的是否是一个隐藏文件
public boolean isDirectory()
测试当前File对象所表示的是否是一个目录(目录也当作文件处理)
public boolean isAbsolute()
测试当前File对象所表示的是否为绝对路径名。
public boolean delete()
删除此File对象所对应的文件或目录。如对应的是目录,则该目录必须为空才能删除。只有当文件或目录删除成功时返回true,否则返回false。
public void deleteOnExit()
在Java虚拟机关闭时,删除当前File对象所对应的文件或目录。
public boolean createNewFile() throws IOException
检查当前File对象对应的文件是否存在,如不存在则创建该文件。如果指定的文件不存在并成功地创建则返回true,否则返回false。
public boolean setReadOnly()
设置当前File对象所表示的文件或目录为只读的,此操作成功返回true
public boolean renameTo(File dest)
移动并重命名此File对象对应的文件。
public boolean mkdir()
创建当前File对象所表示的目录。
public class TestFile {public static void main(String args[]){File f1 = new File("a.jpg");File f2 = new File("D:\\Temp\\","c.jpg");File f3 = new File("D:\\Temp\\a.jpg");File f4 = new File("D:\\Temp\\");print("Name:" + f1.getName());print("Path:" + f1.getPath());print("AbsolutePath:" + f1.getAbsolutePath());print("parent: " + f1.getParent());print("lastModified:" + new Date(f1.lastModified()));print("length:" + f1.length() +"bytes");print("exists:" + f1.exists());print("canRead:" + f1.canRead());print("canWrite:" + f1.canWrite());f1.setReadOnly();print("after: canWrite?:" + f1.canWrite());print("isFile:" + f1.isFile());//delete a.jpg//f3.delete();try {print("createNewFile:" + new File("c.txt").createNewFile());} catch (IOException e) {e.printStackTrace();}f1.renameTo(f2);for(File f: f4.listFiles()){print("Name:" + f.getName());}}public static void print(Object o){System.out.println(o);}}
在文件操作过程中可能会涉及文件过滤,即只检索和处理符合特定条件的文件,其中最常见的情形是按照文件类型(后缀)进行划分,比如只查找.class or .xml文件等,这种情况下可以使用java.io.Filter接口,顾名思义,此接口起到了文件过滤器的功能。FileFilter接口中只定义了一个抽象的方法:
boolean accept(File pathname)
测试参数指定的File对象对应的文件(子目录)是否应保留在文件列表中,即不被过滤掉。
我们知道,接口本身并不实现其所规划的功能,在实际应用中,可以定义一个该接口的实现类,重写其中的accept()方法,在方法体中加入所需要的文件过滤逻辑,然后创建一个该实现类的对象作为参数传递给File对象的文件列表方法list()就可以了,在list()方法执行的过程中会自动调用前者的accept()方法来过滤文件。看下例:
文件过滤器:
public class MyFilter implements FileFilter {private String extension;public MyFilter(String extension){this.extension = extension;}public boolean accept(File file) {if(file.isDirectory()){return false;}//get file nameString fileName = file.getName();//get file extensionint idx = fileName.lastIndexOf(".");if((-1 == idx) || ((fileName.length()-1) == idx)){return false;}else{return fileName.substring(idx, fileName.length()).equals(extension);}}} 测试过滤器
public class TestFileFilter {public static void main(String args[]){TestFileFilter test = new TestFileFilter();test.dir("D:\\JAVA_CODE\\study\\src\\com\\test",".java");}public void dir(String path,String extension){File directory = new File(path);MyFilter filter = new MyFilter(extension);File files[] = directory.listFiles(filter);print("file path:" + path);print("file extension:" + extension);for(File file: files){print("\t fileName: " + file.getName());}}private void print(Object o){System.out.println(o);}}
public class TestVararges {public static void main(String args[]){varPrint("test",10,"aa","bb","cc");}public static void varPrint(String s, int i,Object... obj){for(Object o:obj){System.out.println(o);}}} 可变参数是通过一维数组进行封装的,因此也可以改写为for(int i=0; i < obj.length;i++)...
|
|