2011-07-23 100 views
0

在Java中我想創建一個文件並在其上保存數據。帶有路徑的File名稱取自用戶。現在,如果用戶給出無效路徑,如C:\temp\./user\fir/st.csv這是一條無效路徑,因爲"."/在路徑中,而在Windows操作系統"\"被用作路徑分隔符。如何知道在java中保存文件的無效路徑

執行程序(一命令行工具)之前,沒有temp文件夾中C:\目錄,但是當我運行該程序會創建temp文件夾,然後在temp它創建user然後在user它創建fir文件夾終於在st.csv裏面。雖然我希望如果用戶用戶給出這種類型的無效路徑或文件名應通過消息"Invalid path or file name"注意。

我該怎麼辦?程序代碼如下圖所示:

public class FileTest { 
    public static void main(String args[]) { 
     try { 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      System.out.println("Please enter path:"); 
      String path = br.readLine(); 
      File file = new File(path); 
      String path1 = file.getParent(); 
      File file2 = new File(path1); 
      if (!file2.exists()) { 
       System.out.println("Directory does not exist , So creating directory"); 
       file2.mkdirs(); 
      } 
      if (!file2.exists()) { 
       System.out.println("Directory can not be created"); 
      } else { 
       FileWriter writer = new FileWriter(file); 
       PrintWriter out = new PrintWriter(writer); 
       System.out.println("Please enter text to write on the file, print exit at new line to if finished"); 
       String line = ""; 
       while ((line = br.readLine()) != null) { 
        if (line.equalsIgnoreCase("exit")) { 
         System.out.println("Thanks for using our system"); 
         System.exit(0); 
        } else { 
         out.println(line); 
         out.flush(); 
        } 
       } 
      } 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

現在,如果我給作爲C:\tump\./user\fir/st.csv那麼它在C驅動器tump創建tump文件夾,然後用戶,然後在firuser然後st.csv文件在它的路徑。

+0

請不要僅從您的其他站點複製並粘貼您的問題。至少要爲StackOverflow正確設置格式。 –

+0

這是我自己在我的項目中遇到的問題,代碼如上,但實際的代碼非常大,這是一個命令行工具,現在我執行縮進 –

回答

0

在我來說,我需要這個工作

 
if(!path.equals(file.getCanonicalPath())){ 
       System.out.println("FAILED:Either invalid filename, directory or volume label , syntax error"); 
       System.exit(0); 
      } 

通過添加該代碼剛過
檔案文件=新的文件(路徑);
它會正常工作,如果給定的路徑是不正確


由於只有兩個選擇要麼java會創建一些路徑上的文件,這將是規範的路徑,或者無法創建文件它將會注意到用戶給予例外。所以如果用戶給出的路徑和規範路徑有任何不匹配的地方,那麼它意味着用戶類型錯誤的路徑,而java不能在文件系統上創建,所以我們會注意到用戶,或者如果java給出異常,那麼我們可以捕獲它並會通知用戶路徑不正確

2
boolean exists = (new File("filename")).exists(); 
if (exists) { 
    // File or directory exists 
} else { 
    // File or directory does not exist 
} 

PLUS:您絕不能使用硬編碼的路徑分隔符。你具有的問題,改用靜態屬性

File.separator - string with file separator 
File.separatorChar - char with file separator 
File.pathSeparator - string with path separator 
File.pathSeparatorChar - char with path separator 
+0

Clear&Concise! –

+0

首先創建文件的代碼不是整個代碼?這不是整個故事。 –

+1

只需追加路徑分隔符部分即可。感謝您讓我注意。 –

1

看起來很類似: Is there a way in Java to determine if a path is valid without attempting to create a file?

有一個在其中一個答案在這裏的鏈接: http://www.thekua.com/atwork/2008/09/javaiofile-setreadonly-and-canwrite-broken-on-windows/

哪詳細可能爲你工作: 通過Peter Tsenga

public static boolean canWrite(String path) { 
    File file = new File(path); 
    if (!file.canWrite()) { 
     return false; 
    } 
    /* Java lies on Windows */ 
    try { 
     new FileOutputStream(file, true).close(); 
    } catch (IOException e) { 
     LOGGER.info(path + 」 is not writable: 」 + e.getLocalizedMessage()); 
     return false; 
    } 
    return true; 
} 
+0

它工作如果文件夾不存在,但與我的代碼文件夾和子文件夾創建它不會給任何例外,如果有。在文件夾分隔符\後,如果/存在路徑 –

0

你提到這是一個命令行工具。這是否意味着它將始終從命令行運行,還是可以從假定沒有進一步用戶交互的環境(如批處理文件或Ant)中調用?

從命令行可以彈出一個JFileChooser。這是接受用戶文件名的好方法。對用戶來說更容易,對程序更可靠。

這是基於你的代碼的例子:

import java.io.*; 
import javax.swing.*; 

public class FileTest { 

    public static void main(String args[]) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     JFileChooser fileChooser = new JFileChooser(); 
     int returnVal = fileChooser.showOpenDialog(null); 
     if (returnVal==JFileChooser.APPROVE_OPTION) { 
      File file = fileChooser.getSelectedFile(); 
      try { 
      if (!file.getParentFile().exists()) { 
       System.out.println("Directory does not exist, creating.."); 
       file.getParentFile().mkdirs(); 
      } 
      if (!file.getParentFile().exists()) { 
       System.out.println("Directory can not be created"); 
      } else { 
       BufferedReader br = new BufferedReader(
       new InputStreamReader(System.in)); 
       FileWriter writer = new FileWriter(file); 
       PrintWriter out = new PrintWriter(writer); 
       System.out.println("Please enter text to write on the file," + 
       " print exit at new line to if finished"); 
       String line = ""; 
       while ((line = br.readLine()) != null) { 
       if (line.equalsIgnoreCase("exit")) { 
        System.out.println("Thanks for using our system"); 
        System.exit(0); 
       } else { 
        out.println(line); 
        out.flush(); 
       } 
       } 
      } 
      } 
      catch (IOException e) { 
      e.printStackTrace(); 
      } 
     } else { 
      System.out.println("Maybe next time.."); 
     } 
     } 
    }); 
    } 
} 

需要注意的是,如果我被編碼這一點,我會再繼續擺脫InputStreamReader的,而是顯示在JTextArea內文JFrame,JDialog或(最簡單)JOptionPaneJButton調用保存編輯的文本。我的意思是,一個基於命令行的文件編輯器?這是千禧一代(該死的!)。

+0

否我只會工作扔命令行,如果給定的路徑字符串是錯誤的,那麼我會注意到用戶沒有創建文件的正確原因,如FAILED:outfile文件夾無法創建。或失敗:文件名無效 –

+0

我仍然不確定您是否說(Swing)GUI元素是否正常。無論如何,我用一個例子編輯了我的答案。試一試,看看它是否適合你。 –

+0

但是我只能使用命令行工具,我不能使用JFileChooser來達到這個目的。我只是想通過java驗證給定的路徑和文件 –

相關問題