INode.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.fs.s3;
  19. import java.io.ByteArrayInputStream;
  20. import java.io.ByteArrayOutputStream;
  21. import java.io.DataInputStream;
  22. import java.io.DataOutputStream;
  23. import java.io.IOException;
  24. import java.io.InputStream;
  25. /**
  26.  * Holds file metadata including type (regular file, or directory),
  27.  * and the list of blocks that are pointers to the data.
  28.  */
  29. public class INode {
  30.   enum FileType {
  31.     DIRECTORY, FILE
  32.   }
  33.   
  34.   public static final FileType[] FILE_TYPES = {
  35.     FileType.DIRECTORY,
  36.     FileType.FILE
  37.   };
  38.   public static final INode DIRECTORY_INODE = new INode(FileType.DIRECTORY, null);
  39.   
  40.   private FileType fileType;
  41.   private Block[] blocks;
  42.   public INode(FileType fileType, Block[] blocks) {
  43.     this.fileType = fileType;
  44.     if (isDirectory() && blocks != null) {
  45.       throw new IllegalArgumentException("A directory cannot contain blocks.");
  46.     }
  47.     this.blocks = blocks;
  48.   }
  49.   public Block[] getBlocks() {
  50.     return blocks;
  51.   }
  52.   
  53.   public FileType getFileType() {
  54.     return fileType;
  55.   }
  56.   public boolean isDirectory() {
  57.     return fileType == FileType.DIRECTORY;
  58.   }  
  59.   public boolean isFile() {
  60.     return fileType == FileType.FILE;
  61.   }
  62.   
  63.   public long getSerializedLength() {
  64.     return 1L + (blocks == null ? 0 : 4 + blocks.length * 16);
  65.   }
  66.   
  67.   public InputStream serialize() throws IOException {
  68.     ByteArrayOutputStream bytes = new ByteArrayOutputStream();
  69.     DataOutputStream out = new DataOutputStream(bytes);
  70.     out.writeByte(fileType.ordinal());
  71.     if (isFile()) {
  72.       out.writeInt(blocks.length);
  73.       for (int i = 0; i < blocks.length; i++) {
  74.         out.writeLong(blocks[i].getId());
  75.         out.writeLong(blocks[i].getLength());
  76.       }
  77.     }
  78.     out.close();
  79.     return new ByteArrayInputStream(bytes.toByteArray());
  80.   }
  81.   
  82.   public static INode deserialize(InputStream in) throws IOException {
  83.     if (in == null) {
  84.       return null;
  85.     }
  86.     DataInputStream dataIn = new DataInputStream(in);
  87.     FileType fileType = INode.FILE_TYPES[dataIn.readByte()];
  88.     switch (fileType) {
  89.     case DIRECTORY:
  90.       in.close();
  91.       return INode.DIRECTORY_INODE;
  92.     case FILE:
  93.       int numBlocks = dataIn.readInt();
  94.       Block[] blocks = new Block[numBlocks];
  95.       for (int i = 0; i < numBlocks; i++) {
  96.         long id = dataIn.readLong();
  97.         long length = dataIn.readLong();
  98.         blocks[i] = new Block(id, length);
  99.       }
  100.       in.close();
  101.       return new INode(fileType, blocks);
  102.     default:
  103.       throw new IllegalArgumentException("Cannot deserialize inode.");
  104.     }    
  105.   }  
  106.   
  107. }