java - 如何检查特定字符之前是否有字符串

标签 java

我会尽量保持简短:) 所以我有这段代码,它的功能是在用户指定的目录中生成文件。该代码的部分包括:

  1. 首先发现用户甚至想要创建该文件
  2. 找出文件名(扫描仪,确保文件名有扩展名)
  3. 找出用户指定的目录(扫描程序,检查用户输入的目录是否有效,检查目录是否存在,如果不存在,则创建一个新目录)
  4. 创建文件(假设该文件尚不存在)

我的问题在 1 和 2 中。

问题 1:用户可以输入“.txt”之类的内容,然后就可以创建文件,而实际上,您需要输入实际名称。 (我做了一些检查文件是否有扩展名的东西。也许类似的东西?)

问题2:开始部分的Do while循环没有退出...为什么...

代码:

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");
        } 
    }
}

}

最佳答案

解决方案 1:使用以下内容来检查文件名的有效性,而不是那些长条件子句。

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

解决方案 2:因为您的程序希望用户输入 n 来退出,而不是自行结束。

关于java - 如何检查特定字符之前是否有字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45923165/

相关文章:

java - Hibernate 将重复项插入到一对多集合中 - eager fetch

jsp - 将 Java Restful Service 中的值填充到 JSP 页面中

java - List<List<String>> 到 ArrayList<List<String>>

java - 通过 Java 访问 Sheet API 时的 NoSuchMethod

java - 从 Maven 或 IDE 运行 Spring boot 项目

JavaFX:在不引用属性的情况下取消绑定(bind)属性

java - 使用 merge() 删除 JPA 中的多对一关系

java - 从 WEB-INF 文件夹获取图像

Java : Check equivalence of two text files?

java - 通用和类型转换 Java 规则