2017-08-28 121 views
0

虐待尽量保持这个尽可能短:) 所以我有这个代码和它的功能是如此使用户指定的目录中的文件。这段代码的部分包括:如何检查特定字符前是否有字符串

  1. 找出甚至想让摆在首位
  2. 文件查找出来的文件名的用户(扫描仪,确保文件名具有扩展名)
  3. 查找用户指定的目录(扫描仪,检查目录用户输入是否有效,检查目录是否存在,如果不存在,则创建一个新目录)
  4. 使文件(鉴于该文件不存在)

我的问题在1和2中。

问题1:用户可以输入类似“.txt”的东西,并在实际情况下制作文件时,您需要输入实际名称。 (我做了一些检查,如果该文件有一个扩展也许类似的东西?)

问题2:不要while循环开始部分不退出...为什么...

CODE:

package filecreator; 

import java.io.File; 
import java.io.IOException; 
import java.util.*; 

public class FileCreator { 

public static Scanner sc = new Scanner(System.in); 
public static boolean success = false; 
public static String filename; 
public static String filedir; 
public static String fileexten; 
public static String filedir2; 
public static File file; 
public static File dir; 

public static void main(String[] args) throws IOException { 

    System.out.println("********************************"); 
    System.out.println("* Welcome to File Creator 2.0! *"); 
    System.out.println("********************************"); 
    System.out.println(" "); 

    //Starting prompt 
    while(!success) { 

     System.out.println("Would you like to create a file? Y/N?"); 
     String usrans = sc.nextLine(); 

     if(usrans.equalsIgnoreCase("y")) { 

      System.out.println("Proceeding with file creation..."); 
      System.out.println(" "); 
      break; 

     } else if(usrans.equalsIgnoreCase("n")) { 

      System.out.println("Exiting Program..."); 
      System.exit(0); 

     } else if(!usrans.equalsIgnoreCase("y") || !usrans.equalsIgnoreCase("n")) { 

      System.out.println("That is not a valid answer! Please try again!"); 
      System.out.println(" "); 
     } 
    } 

    System.out.println("Please enter a valid file name:"); 

    //choosing name of file 
    while(!success) { 

     filename = sc.nextLine(); 
     fileexten = filename.substring(filename.lastIndexOf(".") + 1); 

     if(filename.isEmpty()) { 

      System.out.println("Please enter a file name!"); 

     } else if(filename.contains("/") || filename.contains(":") || 
        filename.contains("*") || filename.contains("?") || 
        filename.contains("<") || filename.contains(">") || 
        filename.contains("|") || filename.contains("\"") || 
        filename.contains("\\")) { 

      System.out.println("Please do not include/\\ : * ? \" < > |"); 

     } else if(!filename.contains(".")) { 

      System.out.println(" "); 
      System.out.println("Please specify a valid file extension!"); 

     } else if (fileexten.isEmpty() || fileexten.contains("[^\\p{IsDigit}\\p{IsAlphabetic}]")) { 

      System.out.println(" "); 
      System.out.println("Please specify a valid file extension!"); 

     } else { 

      System.out.println(" "); 
      System.out.println("File name \"" + filename + "\" chosen"); 
      break; 
     } 
    } 

    System.out.println(" "); 
    System.out.println("Where would you like to have your file saved?"); 
    System.out.println("Please enter a valid directory"); 

    //finding directory if directory exists and creating one if it dosent 
    while(!success) { 

     filedir = sc.nextLine(); 
     dir = new File(filedir); 

     do { 

      System.out.println("" 
        + "That is not a valid directory"); 
      filedir = sc.nextLine(); 

     } while((!filedir.contains(":") && !filedir.contains("\\"))); 

     System.out.println("Checking to see if directory exists..."); 

     if(!dir.exists()) { 

      System.out.println("Directory does not exist! Would you like to create one? Y/N?"); 
      String usrans = sc.nextLine(); 

      if(usrans.equalsIgnoreCase("y")) { 

       dir = new File(filedir); 
       success = dir.createNewFile(); 

       if(!success) { 

        System.out.println("Created!"); 
        break; 

       } else { 

        System.out.println("Something went wrong! Aborting Program..."); 
        System.exit(0); 
       } 

      } else if(usrans.equalsIgnoreCase("n")) { 

       System.out.println("Directory not created! Aborting program..."); 
       System.exit(0); 

      } else if(!usrans.equalsIgnoreCase("y") || !usrans.equalsIgnoreCase("n")) { 

       System.out.println("That is not a valid answer!"); 
      } 
     } 
    } 

    System.out.println(" "); 
    System.out.println("Looking to see if \"" + filename + "\" already exists..."); 

    file = new File(filedir,filename); 

    if(file.exists()) { 

     System.out.println(" "); 
     System.out.println("\"" + filename + "\"" + " already exists! Closing Program..."); 
     System.exit(0); 

    } else { 

     System.out.println(" "); 
     System.out.println("\"" + filename + "\"" + " doesn't exists! Creating now..."); 
     file.createNewFile(); 
     success = file.createNewFile(); 

     if(!success) { 

      System.out.println(" "); 
      System.out.println("\"" + filename + "\"" + " successfully created!"); 

     } else { 

      System.out.println(" "); 
      System.out.println("Error! File not created"); 
     } 
    } 
} 

}

+0

听起来像是你需要一个正则表达式 – MyStackRunnethOver

+0

@MyStackRunnethOver可以PLZ详细点吗? –

+0

哪个循环不退出?你能发表一个你的输入的例子,以及重复哪些打印输出? – Assafs

回答

2

解决方法1:使用下列检查文件名的有效性,而不是那些长期有条件的条款。

if (filename.toLowerCase().matches("[a-z0-9_-][a-z0-9_.-]*\\.[a-z0-9]+")) 

解决方案2:因为你的程序需要用户输入ň戒烟,而不是由自身完成。

1

关于第一个问题,你可以创建一个regex to validate the filename

boolean validFilename = filename.matches("[_a-zA-Z0-9\\-\\.]+"); //regex to validate a filename 

if(!validFilename){ 
    //output error to user and ask to try again 
} 

关于第二个问题,你asigning你success变量设置为false,你是不是改变其值。然后你而条件while(!success)将始终返回true,你的循环将运行“永远”

+0

它不是被卡住的while循环。它的dir后面的do while循环被声明为一个新文件 –

相关问题