参照网上其他童鞋的例子与介绍,修改了一下:
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
/**
* 动态编译Java 源文件
*
* @author shenshouer
*
*/
public class CompilerTest {
public static void main(String[] args) throws Exception {
String source = "public class Main { " + "public static void main(String[]args) {"
+ "System.out.println(\"Hello World!\");" + "} " + "}";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
StringSourceJavaObject sourceObject = new CompilerTest.StringSourceJavaObject("Main",
source);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);
// 获取编译类根路径,不然会报找不到类的错误
String path = Class.class.getClass().getResource("/").getPath();
Iterable< String> options = Arrays.asList("-d", path);
// 增加options参数
// CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);
CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);
boolean result = task.call();
if (result) {
System.out.println("编译成功。");
ClassLoader loader = CompilerTest.class.getClassLoader();
try {
Class<?> clazz = loader.loadClass("Main");
Method method = clazz.getMethod("main", String[].class);
// 修改调用参数,不然会报参数个数不对
// Object value = method.invoke(null, new Object[] {});
Object value = method.invoke(null, new Object[] {new String[]{}});
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
static class StringSourceJavaObject extends SimpleJavaFileObject {
private String content = null;
public StringSourceJavaObject(String name, String content) throws URISyntaxException {
super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension),
Kind.SOURCE);
this.content = content;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return content;
}
}
}
❷ 文件存在file找不到
文件存在file找不到(文件存在file找不到文件)File (不是访问文件数据的)
每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)主要是JAVA为文件这块的操作(如创建、删除、新增等)而设计的相关类包名是java.io,其实现了Serializable, Comparable两大接口以便于其对象可序列化和比较。
// File file = new File("c:/xxx/xxx/xx/xxx.txt"); //-----绝对路径不推荐使用名词解释1)相对路径顾名思义,相对路径就是相对于当前文件的路径。开发中一般表示路径使用这个方法。2)绝对路径 绝对路径就是你的电脑上的文件或目录在硬盘上真正的路径。 //使用File访问当前项目目录下的demo.txt文件File file = new File("./demo.txt");//获取文件名字String name = file.getName();System.out.println(name);//获取文件大小(单位是字节)long len = file.length();System.out.println(len+"字节");//是否可读可写boolean cr = file.canRead();boolean cw = file.canWrite();System.out.println("是否可读:"+cr);System.out.println("是否可写:"+cw);//是否隐藏文件boolean ih = file.isHidden();System.out.println("是否隐藏:"+ih);createNewFile()方法 创建新文件//在当前目录下新建一个文件:test.txtFile file = new File("./test.txt");//boolean exists()判断当前File表示的位置是否已经实际存在该文件或目录if(file.exists()){ System.out.println("该文件已存在!");}else{ file.createNewFile();//将File表示的文件创建出来 System.out.println("文件已创建!");}delete()方法 文件删除File file = new File("test.txt");//同属于一个文件夹,可以不写 "./"if(file.exists()){ file.delete(); //删除文件 System.out.println("文件已删除!");}else{ System.out.println("文件不存在!");}mkDir()、mkDirs(): 创建目录//在当前目录下新建一个目录:demo// File dir = new File("demo");File dir = new File("./a/b/c/d/e/f");if(dir.exists()){ System.out.println("该目录已存在!");}else{ //dir.mkdir();//创建目录时要求所在的目录必须存在 ,所以一般不用 dir.mkdirs();//创建目录时会将路径上所有不存在的目录一同创建 System.out.println("目录已创建!");}delete() 删除一个目录,但是只能删除空目录 //将当前目录下的demo目录删除File dir = new File("demo");// File dir = new File("a");if(dir.exists()){ dir.delete();//delete方法删除目录时只能删除空目录 System.out.println("目录已删除!");}else{ System.out.println("目录不存在!");}listFiles方法 可以访问一个目录中的所有子项//获取当前目录中的所有子项File dir = new File(".");/* boolean isFile() 判断当前File表示的是否为一个文件 boolean isDirectory() 判断当前File表示的是否为一个目录 */if(dir.isDirectory()){ /* File[] listFiles() 将当前目录中的所有子项返回。返回的数组中每个File实例表示其中的一个子项 */ File[] subs = dir.listFiles(); System.out.println("当前目录包含"+subs.length+"个子项"); for(int i=0;i<subs.length;i++){ File sub = subs[i]; System.out.println(sub.getName()); }}重载的 listFiles方法: 有参的//该方法要求传入一个文件过滤器,并仅将满足该过滤器要求的子项返回。File dir = new File(".");if(dir.isDirectory()){ File[] subs = dir.listFiles(new FileFilter(){ public boolean accept(File file) { return file.getName().startsWith("."); }});System.out.println(subs.length);Lambda表达式:
JDK8之后,java支持了lambda表达式这个特性.可以用更精简的代码创建匿名内部类.但是该匿名内部类实现的接口只能有一个抽象方法,否则无法使用!是编译器认可的,最终会将其改为内部类编译到class文件中
Lambda特征:
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。可选的大括号:如果主体包含了一个语句,就不需要使用大括号。可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
// 语法(参数列表) ->{ 方法体} //匿名内部类形式创建FileFilter ---- ①FileFilter filter = new FileFilter() { public boolean accept(File file) { return file.getName().startsWith("."); }};//lambda 写法 写① 的匿名内部类创建 FileFilter ---- ②FileFilter filter2 = (File file)->{ return file.getName().startsWith(".");};//lambda表达式中参数的类型可以忽略不写 lambda 再次简化②的版本----③FileFilter filter3 = (file)->{ return file.getName().startsWith(".");};/* lambda表达式方法体中若只有一句代码,则{}可以省略 如果这句话有return关键字,那么return也要一并省略! ------基于③ 再次简化的写法版本*/FileFilter filter4 = (file)->file.getName().startsWith("."); 学习记录,如有侵权请联系删除。