【问题标题】:File Merging in Java with .00x extensionJava 中的文件合并,扩展名为 .00x
【发布时间】:2016-01-10 11:47:19
【问题描述】:

我目前正在练习拆分和合并文件。我在网上找到了一段由“krishna”编写的带有拆分和合并类的代码。分离器就像一个魅力,我做了一些修改,让它按照我喜欢的方式工作。

这里有一个问题:我希望合并类打开拆分器生成的 .00x 文件。但它仅限于恰好八个 .00x 文件,不多不少。

如果我能让它读取文件夹中的所有 .00x 文件就好了。我一直在想一个解决方案,但我似乎无法产生一个。我想制作一些东西来扫描扩展名为 .00x 的文件的数量并基于它进行循环。请帮助我,或者至少给我提示。谢谢!代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;


public class MergeFile {

private static String FILE_NAME = JOptionPane.showInputDialog("Enter the    file name");
public static void main(String[] args) {
    File ofile = new File(FILE_NAME);
    FileOutputStream fos;
    FileInputStream fis;
    short[] fileBytes;
    int bytesRead = 0;
    List<File> list = new ArrayList<File>();
    list.add(new File(FILE_NAME+".001"));
    list.add(new File(FILE_NAME+".002"));
    list.add(new File(FILE_NAME+".003"));
    list.add(new File(FILE_NAME+".004"));
    list.add(new File(FILE_NAME+".005"));
    list.add(new File(FILE_NAME+".006"));
    list.add(new File(FILE_NAME+".007"));
    list.add(new File(FILE_NAME+".008"));
    try {
        fos = new FileOutputStream(ofile,true);
        for (File file : list) {
            fis = new FileInputStream(file);
            fileBytes = new byte[(int) file.length()];
            bytesRead = fis.read(fileBytes, 0,(int)  file.length());
            assert(bytesRead == fileBytes.length);
            assert(bytesRead == (int) file.length());
            fos.write(fileBytes);
            fos.flush();
            fileBytes = null;
            fis.close();
            fis = null;
        }
        fos.close();
        fos = null;
    }catch (Exception exception){
        exception.printStackTrace();
    }
  }
}

【问题讨论】:

标签: java file splitter


【解决方案1】:

您可以实现一个 FileFilter 并将其传递给方法 File.listFiles(),如下所示:

import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
import java.util.List;


public class Test {
    public static void main(String[] args) {
        final String FILE_NAME = "testfile";
        /* The method listFiles returns all the files in the path 
           (I used "." to select the working directory).
           This method accept a FileFilter as parameter. The file filter
           decides what files to return. It is a simple interface with just
           one method. */
        File[] fileList = new File(".").listFiles(new FileFilter() {

            @Override
            public boolean accept(File pathname) {
                /* Return true to include the file in the list */
                return pathname.getName().startsWith(FILE_NAME);
            }
        });

        List<File> list = Arrays.asList(fileList);

        for (File f: list) {
            System.out.println(f);
        }
    }
}

如果您不喜欢使用匿名类,您可以在自己的文件中将 FileFilter 实现为公共类。

【讨论】:

    【解决方案2】:

    如果您使用的是 Java 8,那么您可以使用 Files#list 轻松完成。获取以 FILE_NAME 开头并以 .001、.002、.003... 结尾的文件列表应该像这样工作:

    Path path = Paths.get(FILE_NAME);
    Pattern pattern = Pattern.compile(Pattern.quote(path.getFileName().toString()) + "\\.\\d{3}");
    List<File> list = Files.list(path.getParent())
            .filter(f -> pattern.matcher(f.getFileName().toString()).matches())
            .map(Path::toFile)
            .collect(Collectors.toList());
    

    这只是我的想法,我没有测试它,因为我周围没有 .00x 文件。

    【讨论】:

      【解决方案3】:
      import java.io.File;
      import java.io.FilenameFilter;
      import java.util.Arrays;
      import java.util.regex.Pattern;
      
      public class ListFiles {
      
      private static final String BASE_DIR = "<your directory>";
      private static final String FILE_EXT = ".*\\.[0-9]{3,3}";
      
      private class FileFilter implements FilenameFilter {
      
          private String ext;
      
          public FileFilter(String ext) {
      
              this.ext = ext;
      
          }
      
          public boolean accept(File dir, String name) {
      
              return Pattern.matches(ext, name) ? true : false;
      
          }
      }
      
      public static void main(String args[]) {
      
          System.out.println(Arrays.toString(new ListFiles().listFile(BASE_DIR, FILE_EXT)));
      
      }
      
      public String[] listFile(String folder, String ext) {
      
          File dir = new File(folder);
          String[] list = dir.list(new FileFilter(ext));
          return list;
      
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        相关资源
        最近更新 更多