有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java创建具有增量值的新文件

我需要创建一个具有给定名称的文件

例如,“样本文件”

如果给定目录中存在这样的文件,则我希望创建附加“1”或“(1)”的文件

“示例文件1”

有没有办法做到这一点

我正在寻找一种命名新文件的方法,因为文件夹从不同的系统更新,并且没有办法使用增量变量

对于eg,int i=1

文件f=新文件(路径)

如果(f.exists()){ f=新文件(路径+i)

}

我不能采用这种技术,因为如果有一个名为sample1的文件,它可能会再次替换它

根据最新的可用名称,我必须附加下一个值

例如,如果我有sample27,我需要程序理解并创建一个文件作为sample28

Windows在复制文件并粘贴到同一文件夹时所做的事情。我想在我的Java程序中复制它

感谢您的帮助:)

干杯


共 (5) 个答案

  1. # 1 楼答案

    尝试使用当前日期将其附加到文件名,以便文件名始终唯一

  2. # 2 楼答案

    您还可以使用以下选项:

    String filename="Sample";
    
    int count=new File("").list(new FilenameFilter() {          
        @Override
        public boolean accept(File dir, String name) {
            if(name.contains(filename)) {
                return true;
            }
            return false;
        }
    }).length;
    
    String nextName=filename+count;
    

    添加额外条件以避免重复

  3. # 3 楼答案

    让语言为你做工作。使用java。nio包,使用路径。解析同级方法。给定所需位置和文件名的路径,以及文件名和扩展名(您可以通过apache FilenameUtils轻松获得),执行以下操作:

    Path createUniqueFilename(Path destFile, String filename, String extension) {
        Path updatedDestFile = destFile;
        for (int i = 1; Files.exists(updatedDestFile); i++) {
            String newFilename = String.format("%s(%d).%s", filename, i, extension);
            updatedDestFile = destFile.resolveSibling(newFilename);
        }
        return updatedDestFile;
    }
    
  4. # 4 楼答案

    也许你可以试试这样的

    String fileName = "sampleFile";
    String newFilename;
    File f = new File("path" + fileName);
    int version = 1;
    while (f.exists())
    {
            newFilename= fileName + version;
            f = new File("path" + newFilename);
            version++;
    }
    f.mkdirs(); 
    f.createNewFile();
    
  5. # 5 楼答案

    现在将复制文件内容

    此实现在下面的示例集上非常有效(您可以将其复制并粘贴到java文件中,它将编译并执行您想要的操作)。唯一的潜在缺点是它会跳过中间的“版本”。如果它有A1。txt和A3。txt,它将只创建A4。txt。它也不能处理没有扩展名的文件,但我认为这对您来说没有多大关系

    如果文件已经存在或由于某种原因无法创建文件,则会打印“Failure”

    请注意,您可以在命令行上指定文件目录,否则它将使用当前工作目录

    它还递归地搜索下面的文件夹,如果您只希望它搜索当前/指定的文件目录,只需删除getFilesForFolder方法中return fileMap;前面的else语句即可

    之前

    ~/currentdirectory

    • A1。文本
    • A4。文本
    • B1。文本
    • ~/currentdirectory/asdf
      • A1。文本
      • B1。文本
      • B5。文本

    之后

    ~/currentdirectory

    • A1。文本
    • A4。文本
    • A5。文本
    • B1。文本
    • B2。文本
    • ~/currentdirectory/asdf
      • A1。文本
      • A2。文本
      • B1。文本
      • B5。文本
      • B6。文本

    import java.io.File;
    import java.io.IOException;
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.Map;
    import java.util.HashMap;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    public class Files {
        static File folder;
        static List<String> files;
    
        public static void main(String[] args) {
            if (args.length > 0)
                folder = new File(args[0]);
            else
                folder = new File(System.getProperty("user.dir") + "/testfiles");
    
    
            Map<File, Map<String, Integer>> files = new HashMap<File, Map<String, Integer>>();
            files = getFilesForFolder(folder);
            writeFile(files); 
        }
    
    
        public static void writeFile(Map<File, Map<String, Integer>> files) {
            String fileName;
    
            for (Map.Entry<File, Map<String, Integer>> mapOfMapEntry : files.entrySet()) {
                File originalFile = mapOfMapEntry.getKey();
                for (Map.Entry<String, Integer> entry : (mapOfMapEntry.getValue()).entrySet()) {
                    fileName = entry.getKey();
                    try {
                        int i = fileName.contains(".") ? fileName.lastIndexOf('.') : fileName.length();
                        fileName = fileName.substring(0, i) + Integer.toString(entry.getValue() + 1) + fileName.substring(i);
                        File file = new File(fileName);
    
                        if (file.createNewFile()) {
                            System.out.println("Success: " + file.getAbsolutePath());
                            //File originalFile = new File(entry.getKey());
                            InputStream in = new FileInputStream(originalFile);
                            OutputStream out = new FileOutputStream(file);
                            byte[] buffer = new byte[1024];
                            int length;
                            while ((length = in.read(buffer)) > 0) {
                                out.write(buffer, 0, length);
                            }
                            in.close();
                            out.close();
                        } else {
                            //currently has duplicate value in map
                            //I tried to remove them but it was taking too long to debug
                            //I might come back to it later,
                            //otherwise you're just wasting a bit of computational resources
                            //by trying to create the same file multiple times
                            System.out.println("Failure: " + file.getAbsolutePath());
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        //note this is recursive and will search files
        //in subdirectories. you can change this by removing the else clause before return map
        public static Map<File, Map<String, Integer>> getFilesForFolder(File folder) {
            Map<File, Map<String, Integer>> mapOfMap = new HashMap<File, Map<String, Integer>>();
            Map<String, Integer> fileMap = new HashMap<String, Integer>();
            Integer number;
    
            //any non-digit character 0-inf amount of times, any digit character, 0-inf amount of times, 
            //then a period, then the rest of the extension
            Pattern pattern = Pattern.compile("(\\D*)(\\d*)(\\.\\w*)?"); 
    
    
            //match each file in the file directory with the above regex expr
            for (final File fileEntry : folder.listFiles()) {
                if (!(fileEntry.isDirectory())) {
                    Matcher m = pattern.matcher(fileEntry.getAbsolutePath());
                    while (m.find()) {
                        number = fileMap.get(m.group(1) + m.group(3));
                        if (number != null) {
                            //the key/value already exist in the filemap
                            //check to see if we should use the new number or not
                            if (Integer.parseInt(m.group(2)) > number) {
                                fileMap.put(m.group(1) + m.group(3), (Integer.parseInt(m.group(2))));
                                mapOfMap.put(fileEntry, fileMap);
                            }
                        } else if (!m.group(1).equals("")) {
                            //the map is empty and the file has no number appended to it
                            if (m.group(3) == null) {
                                fileMap.put(m.group(1), 0);
                                mapOfMap.put(fileEntry, fileMap);
                            } else {
                            //the map is empty and the file already has a number appended to it
                                fileMap.put(m.group(1) + m.group(3), (Integer.parseInt(m.group(2))));
                                mapOfMap.put(fileEntry, fileMap);
                            }
                        }
                    }
                }
                else {
                    for (Map.Entry<File, Map<String, Integer>> entry : getFilesForFolder(fileEntry).entrySet()) {
                        mapOfMap.put(entry.getKey(), entry.getValue());
                    }
                }
            }
            return mapOfMap;
        }
    }