Bytes counting : File Size « File Input Output « Java






Bytes counting

      
/*
 * @(#)Bytes.java  2.0 Sept 30, 2008
 *
 *  The MIT License
 *
 *  Copyright (c) 2008 Malachi de AElfweald <malachid@gmail.com>
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *  THE SOFTWARE.
 */
//package org.eoti.util.size;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public enum Bytes
{
    B("byte"),
    KB("kilobyte"),
    MB("megabyte"),
    GB("gigabyte"),
    TB("terabyte"),
    PB("petabyte"),
    EB("exabyte"),
    ZB("zettabyte"),
    YB("yottabyte");
    Bytes(String name)
    {
        this.name = name;
    }
    private String name;
    public String getName(){return name;}
    public BigInteger convertFrom(BigInteger originalAmount, Bytes originalType)
    {
        /**
         * So, B.convertFrom(BigInteger.ONE, YB)
         * should be used to convert 1 yottabyte to bytes...
         */

        BigInteger currentAmount = originalAmount;
        int convertTo = ordinal();
        int convertFrom = originalType.ordinal();
        while(convertTo != convertFrom)
        {
            if(convertTo < convertFrom)
            {
                currentAmount = currentAmount.shiftLeft(10);
                convertFrom--;
            }else{
                currentAmount = currentAmount.shiftRight(10);
                convertFrom++;
            }
        }
        return currentAmount;
    }

    private static List<Bytes> reversed = reverse(Bytes.values());
    private static final BigInteger TWO = BigInteger.valueOf(2);
    private static final String friendlyFMT = "%s %s";

    public static String friendly(long bytes)
    {
        return friendly(Bytes.B, BigInteger.valueOf(bytes));
    }
    
    /**
     * Convert the specified amount into a human readable (though slightly less accurate)
     * result. IE:
     * '4096 B' to '4 KB'
     * '5080 B' to '5 KB' even though it is really '4 KB + 984 B'
     */
    public static String friendly(Bytes type, BigInteger value)
    {
        /**
         * Logic:
         * Loop from YB to B
         * If result = 0, continue
         * Else, round off
         *
         * NOTE: BigIntegers are not reusable, so not point in caching them outside the loop
         */
        for(Bytes newType : reversed)
        {
            BigInteger newAmount = newType.convertFrom(value, type);
            if(newAmount.equals(BigInteger.ZERO)) continue;
            // Found the right one. Now to round off
            BigInteger unitBytes = Bytes.B.convertFrom(BigInteger.ONE, newType);
            BigInteger usedBytes = newAmount.multiply(unitBytes);
            BigInteger remainingBytes = Bytes.B.convertFrom(value, type).subtract(usedBytes);
            if(remainingBytes.equals(BigInteger.ZERO))
                return String.format(friendlyFMT, newAmount.toString(), newType);
            if(remainingBytes.equals(value))
                return String.format(friendlyFMT, newAmount.toString(), newType);
            
            BigInteger halfUnit = unitBytes.divide(TWO);
            if( (remainingBytes.subtract(halfUnit)).signum() < 0)
                return String.format(friendlyFMT, newAmount.toString(), newType);

            return String.format(friendlyFMT, (newAmount.add(BigInteger.ONE)).toString(), newType);
        }
        
        // Give up
        return String.format(friendlyFMT, value.toString(), type);
    }
  public static <T> List<T> reverse(T[] array)
  {
    List<T> list = Arrays.asList(array);
    Collections.reverse(list);
    return list;
  }
}

/*
 * @(#)BytesTest.java  1.0 Sept 30, 2008
 *
 *  The MIT License
 *
 *  Copyright (c) 2008 Malachi de AElfweald <malachid@gmail.com>
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *  THE SOFTWARE.
 */
/*
package org.eoti.util.size;

import static org.junit.Assert.*;
import org.junit.Test;

import java.math.BigInteger;
*/
// 1 YB[yottabyte(s)] =
// 1208925819614629174706176 B[byte(s)]
// 1180591620717411303424 KB[kilobyte(s)]
// 1152921504606846976 MB[megabyte(s)]
// 1125899906842624 GB[gigabyte(s)]
// 1099511627776 TB[terabyte(s)]
// 1073741824 PB[petabyte(s)]
// 1048576 EB[exabyte(s)]
// 1024 ZB[zettabyte(s)]
// 1 YB[yottabyte(s)]
/*
public class BytesTest
{
    @Test
    public void YBtoB()
    {
        assertEquals("YBtoB", "1208925819614629174706176", convertFrom(Bytes.YB, "1", Bytes.B));
    }

    @Test
    public void YBtoYB()
    {
        assertEquals("YBtoYB", "1", convertFrom(Bytes.YB, "1", Bytes.YB));
    }

    @Test
    public void BtoB()
    {
        assertEquals("BtoB", "1", convertFrom(Bytes.B, "1", Bytes.B));
    }

    @Test
    public void BtoYB()
    {
        assertEquals("BtoYB", "0", convertFrom(Bytes.B, "1", Bytes.YB));
    }

    @Test
    public void roundUp()
    {
        assertEquals("roundUp", "5 KB", Bytes.friendly(Bytes.B, new BigInteger("5080")));
    }

    @Test
    public void roundDown()
    {
        assertEquals("roundDown", "4 KB", Bytes.friendly(Bytes.B, new BigInteger("4588")));
    }

    private String convertFrom(Bytes sourceType, String sourceAmt, Bytes destType)
    {
        return destType.convertFrom((new BigInteger(sourceAmt)), sourceType).toString();
    }
}
*/

   
    
    
    
    
    
  








Related examples in the same category

1.Get File Size In Bytes
2.Get File Size In MB
3.Returns a human-readable version of the file size, where the input represents a specific number of bytes.
4.display Bytes Size
5.Size formatting utility.