net.mindview.util.TextFile 類 java編程思想

轉載參考   https://blog.csdn.net/kencolin/article/details/42246661html

關於對Java編程思想中,P546頁TextFile這個類在Eclipse中運行出錯,而在控制檯編譯運行正確的問題。
今天在把Java編程思想這本書中的代碼在Eclipse中執行的時候出現了一個問題,一直困擾着我。
 
 1     //: net/mindview/util/TextFile.java  
 2     // Static functions for reading and writing text files as  
 3     // a single string, and treating a file as an ArrayList.  
 4     package net.mindview.util;  
 5     import java.io.*;  
 6     import java.util.*;  
 7       
 8     public class TextFile extends ArrayList<String> {  
 9       // Read a file as a single string:  
10       public static String read(String fileName) {  
11         StringBuilder sb = new StringBuilder();  
12         try {  
13           BufferedReader in= new BufferedReader(new FileReader(  
14             new File(fileName).getAbsoluteFile()));  
15           try {  
16             String s;  
17             while((s = in.readLine()) != null) {  
18               sb.append(s);  
19               sb.append("\n");//???難道讀出來的不包括這一個嗎?  
20             }  
21           } finally {  
22             in.close();  
23           }  
24         } catch(IOException e) {  
25           throw new RuntimeException(e);  
26         }  
27         return sb.toString();  
28       }  
29       // Write a single file in one method call:  
30       public static void write(String fileName, String text) {  
31         try {  
32           PrintWriter out = new PrintWriter(  
33             new File(fileName).getAbsoluteFile());  
34           try {  
35             out.print(text);  
36           } finally {  
37             out.close();  
38           }  
39         } catch(IOException e) {  
40           throw new RuntimeException(e);  
41         }  
42       }  
43       // Read a file, split by any regular expression:  
44       public TextFile(String fileName, String splitter) {  
45         super(Arrays.asList(read(fileName).split(splitter)));  
46         // Regular expression split() often leaves an empty  
47         // String at the first position:  
48         if(get(0).equals("")) remove(0);  
49       }  
50       // Normally read by lines:  
51       public TextFile(String fileName) {  
52         this(fileName, "\n");  
53       }  
54       public void write(String fileName) {  
55         try {  
56           PrintWriter out = new PrintWriter(  
57             new File(fileName).getAbsoluteFile());  
58           try {  
59             for(String item : this)  
60               out.println(item);  
61           } finally {  
62             out.close();  
63           }  
64         } catch(IOException e) {  
65           throw new RuntimeException(e);  
66         }  
67       }  
68       // Simple test:  
69       public static void main(String[] args) {  
70         String file = read("TextFile.java");  
71         write("test.txt", file);  
72         TextFile text = new TextFile("test.txt");  
73         text.write("test2.txt");  
74         // Break into unique sorted list of words:  
75         TreeSet<String> words = new TreeSet<String>(  
76           new TextFile("TextFile.java", "\\W+"));  
77         // Display the capitalized words:  
78         System.out.println(words.headSet("a"));  
79       }  
80     } /* Output: 
81     [0, ArrayList, Arrays, Break, BufferedReader, BufferedWriter, Clean, Display, File, FileReader, FileWriter, IOException, Normally, Output, PrintWriter, Read, Regular, RuntimeException, Simple, Static, String, StringBuilder, System, TextFile, Tools, TreeSet, W, Write] 
82     *///:~  

 


代碼其實很簡單,可是在Eclipse中運行就會報出一個java.lang.RuntimeException: java.io.FileNotFoundException:的問題,通過調試我發現問題的緣由是程序中間有一個根據文件的抽象路徑名 獲得 它的絕對路徑的一個過程,getAbsolutePath()這個函數執行後返回的絕對路徑是這個工程所在的路徑,而不是這個TextFile.class所在的路徑。所以就會報錯。
 
而我在命令行下進入到class文件所在的目錄下,用javac先編譯,而後java運行這個class文件的時候,又一切正常(固然,是把那行pachage的代碼給註釋掉之後運行正常的)。說明其實代碼自己是沒有問題的。
 
當時我查看了這個getAbusotePath()方法的具體實現,它是調用了一個FIleSystem類的resolve方法來實現的這個抽象路徑轉絕對路徑的功能,而這部分功能的具體實現貌似是操做系統來實現的,因此沒有源代碼可看。由此我推斷應該是這個getAbsolutePath()函數在我以上兩種運行方式執行的時候,返回的結果是不同的,至於爲何不同,就應該是運行環境的不一樣,而致使操做系統層面的系統調用返回的是不一樣的結果。
 
解決方案以下:
Run ->Run Configuration,而後進入到下圖界面。
修改working directory,改到你的目標class文件的目錄,而後run就能夠正確運行了。
 
 
 
這裏我其實還遺留了一個問題,就是咱們在Eclipse上對一個java源文件點擊run as a java application的時候,它整個的執行過程是怎樣的?Eclipse一步步地都幹了些什麼?
相關文章
相關標籤/搜索