FileNameGenerator.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:3k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.hdfs.server.namenode;
  19. import java.util.Arrays;
  20. /**
  21.  * File name generator.
  22.  * 
  23.  * Each directory contains not more than a fixed number (filesPerDir) 
  24.  * of files and directories.
  25.  * When the number of files in one directory reaches the maximum,
  26.  * the generator creates a new directory and proceeds generating files in it.
  27.  * The generated namespace tree is balanced that is any path to a leaf
  28.  * file is not less than the height of the tree minus one.
  29.  */
  30. public class FileNameGenerator {
  31.   private static final int DEFAULT_FILES_PER_DIRECTORY = 32;
  32.   
  33.   private int[] pathIndecies = new int[20]; // this will support up to 32**20 = 2**100 = 10**30 files
  34.   private String baseDir;
  35.   private String currentDir;
  36.   private int filesPerDirectory;
  37.   private long fileCount;
  38.   FileNameGenerator(String baseDir) {
  39.     this(baseDir, DEFAULT_FILES_PER_DIRECTORY);
  40.   }
  41.   
  42.   FileNameGenerator(String baseDir, int filesPerDir) {
  43.     this.baseDir = baseDir;
  44.     this.filesPerDirectory = filesPerDir;
  45.     reset();
  46.   }
  47.   String getNextDirName(String prefix) {
  48.     int depth = 0;
  49.     while(pathIndecies[depth] >= 0)
  50.       depth++;
  51.     int level;
  52.     for(level = depth-1; 
  53.         level >= 0 && pathIndecies[level] == filesPerDirectory-1; level--)
  54.       pathIndecies[level] = 0;
  55.     if(level < 0)
  56.       pathIndecies[depth] = 0;
  57.     else
  58.       pathIndecies[level]++;
  59.     level = 0;
  60.     String next = baseDir;
  61.     while(pathIndecies[level] >= 0)
  62.       next = next + "/" + prefix + pathIndecies[level++];
  63.     return next; 
  64.   }
  65.   synchronized String getNextFileName(String fileNamePrefix) {
  66.     long fNum = fileCount % filesPerDirectory;
  67.     if(fNum == 0) {
  68.       currentDir = getNextDirName(fileNamePrefix + "Dir");
  69.     }
  70.     String fn = currentDir + "/" + fileNamePrefix + fileCount;
  71.     fileCount++;
  72.     return fn;
  73.   }
  74.   private synchronized void reset() {
  75.     Arrays.fill(pathIndecies, -1);
  76.     fileCount = 0L;
  77.     currentDir = "";
  78.   }
  79.   synchronized int getFilesPerDirectory() {
  80.     return filesPerDirectory;
  81.   }
  82.   synchronized String getCurrentDir() {
  83.     return currentDir;
  84.   }
  85. }