Java 中的文件合并,扩展名为 .00x
File Merging in Java with .00x extension
我目前正在练习拆分和合并文件。我在网上找到了一段由 "krishna" 编写的带有拆分和合并 classes 的代码。分离器工作起来很神奇,我做了一些修改,让它按照我喜欢的方式工作。
关键是:我希望合并 class 打开拆分器生成的 .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();
}
}
}
您可以实现一个 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);
}
}
}
如果您不喜欢使用匿名 classes,您可以将您的 FileFilter 作为 public class 在它自己的文件中实现。
如果您使用的是 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 文件。
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;
}
}
我目前正在练习拆分和合并文件。我在网上找到了一段由 "krishna" 编写的带有拆分和合并 classes 的代码。分离器工作起来很神奇,我做了一些修改,让它按照我喜欢的方式工作。
关键是:我希望合并 class 打开拆分器生成的 .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();
}
}
}
您可以实现一个 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);
}
}
}
如果您不喜欢使用匿名 classes,您可以将您的 FileFilter 作为 public class 在它自己的文件中实现。
如果您使用的是 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 文件。
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;
}
}