參照網上其他童鞋的例子與介紹,修改了一下:
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("."); 學習記錄,如有侵權請聯系刪除。