使用 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。