使用 scala 代码从 windows 中的共享文件夹复制大量日志文件
Copy Large No. of log files from a shared folder in windows using scala code
我正在尝试使用 Scala 代码将大量文件(数百万)从网络共享复制到我的电脑。我使用的方法是 listfiles() 来获取一个文件夹中的所有文件,然后通过列表复制我 want.It 的文件,对于小号来说效果很好。的文件,但作为没有。文件的数量变成数百万,它会抛出内存超出限制的异常。是否有任何其他方法可用于迭代文件并选择我想要复制的方法,该方法不会在 java 或 scala 中引发此异常。当我用谷歌搜索这个问题时,我看到了简单的文件访问器,任何人都可以帮助我如何在从文件夹中过滤后使用它来复制文件。
def copyRenamedFiles(directoryName: String, trackerFileName: String, loggerFileName: String): Unit = {
val destFolder = "D:\data\"
val logWriter = Logger.getLogger("UploadServiceLog")
logWriter.setUseParentHandlers(false)
val hashMapForFileTracking = FileTracking.getTracker(trackerFileName, logWriter)
try {
println("Inside try block")
//LogFile Informations........................
val fh = new FileHandler(loggerFileName)
logWriter.addHandler(fh)
val formatter = new SimpleFormatter()
fh.setFormatter(formatter)
//............................................
if (!new File(directoryName).exists()) {
throw new FileNotFoundException("Specified Path is not found")
}
val rootFile = new File(directoryName)
println(rootFile.isDirectory)
if (rootFile.isDirectory) {
// println("Inside rootfolder\n"+rootFile.listFiles().length)
rootFile.listFiles().foreach {
machineFile => if (machineFile.isDirectory) {
// My filter logic and copying goes here
}
但是rootFile.listFiles(也有rootFile.list)本身会抛出内存越界异常。文件夹层次结构为根文件夹 -> 许多机器文件夹 -> 每个机器文件夹包含许多 dailylogfolders -> 每个 daily 文件夹包含一个日志文件。
如果您的问题是文件数组太大而无法放入内存,您应该考虑如何获得惰性求值的东西,Stream 或 Iterator。快速搜索,我找到了这个:
http://www.adam-bien.com/roller/abien/entry/listing_directory_contents_with_jdk
这是从上面的link复制过来的
public static List<String> fileList(String directory) {
List<String> fileNames = new ArrayList<>();
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(directory))) {
for (Path path : directoryStream) {
fileNames.add(path.toString());
}
} catch (IOException ex) {}
return fileNames;
}
它是新 java io 库的一部分,展示了如何创建不应占用您全部内存的 DirectoryStream。
我正在尝试使用 Scala 代码将大量文件(数百万)从网络共享复制到我的电脑。我使用的方法是 listfiles() 来获取一个文件夹中的所有文件,然后通过列表复制我 want.It 的文件,对于小号来说效果很好。的文件,但作为没有。文件的数量变成数百万,它会抛出内存超出限制的异常。是否有任何其他方法可用于迭代文件并选择我想要复制的方法,该方法不会在 java 或 scala 中引发此异常。当我用谷歌搜索这个问题时,我看到了简单的文件访问器,任何人都可以帮助我如何在从文件夹中过滤后使用它来复制文件。
def copyRenamedFiles(directoryName: String, trackerFileName: String, loggerFileName: String): Unit = {
val destFolder = "D:\data\"
val logWriter = Logger.getLogger("UploadServiceLog")
logWriter.setUseParentHandlers(false)
val hashMapForFileTracking = FileTracking.getTracker(trackerFileName, logWriter)
try {
println("Inside try block")
//LogFile Informations........................
val fh = new FileHandler(loggerFileName)
logWriter.addHandler(fh)
val formatter = new SimpleFormatter()
fh.setFormatter(formatter)
//............................................
if (!new File(directoryName).exists()) {
throw new FileNotFoundException("Specified Path is not found")
}
val rootFile = new File(directoryName)
println(rootFile.isDirectory)
if (rootFile.isDirectory) {
// println("Inside rootfolder\n"+rootFile.listFiles().length)
rootFile.listFiles().foreach {
machineFile => if (machineFile.isDirectory) {
// My filter logic and copying goes here
}
但是rootFile.listFiles(也有rootFile.list)本身会抛出内存越界异常。文件夹层次结构为根文件夹 -> 许多机器文件夹 -> 每个机器文件夹包含许多 dailylogfolders -> 每个 daily 文件夹包含一个日志文件。
如果您的问题是文件数组太大而无法放入内存,您应该考虑如何获得惰性求值的东西,Stream 或 Iterator。快速搜索,我找到了这个:
http://www.adam-bien.com/roller/abien/entry/listing_directory_contents_with_jdk
这是从上面的link复制过来的
public static List<String> fileList(String directory) {
List<String> fileNames = new ArrayList<>();
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(directory))) {
for (Path path : directoryStream) {
fileNames.add(path.toString());
}
} catch (IOException ex) {}
return fileNames;
}
它是新 java io 库的一部分,展示了如何创建不应占用您全部内存的 DirectoryStream。