com.microsoft.azure.storage.SubStreamGenerator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of azure-storage Show documentation
Show all versions of azure-storage Show documentation
SDK for Microsoft Azure Storage Clients
/**
* Copyright Microsoft Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.microsoft.azure.storage;
import com.microsoft.azure.storage.blob.SubStream;
import java.io.InputStream;
import java.util.Iterator;
public final class SubStreamGenerator implements Iterable {
private final Object mutex = new Object();
private final long blockSize;
private final InputStream wrappedStream;
private int currentBlock = 0;
private long lastBlockSize;
private int blocksPending;
public SubStreamGenerator(InputStream wrappedStream, int totalBlocks, long blockSize) {
this.wrappedStream = wrappedStream;
this.blocksPending = totalBlocks;
this.blockSize = blockSize;
this.lastBlockSize = blockSize;
}
public void setLastBlockSize(long blockSize) {
this.lastBlockSize = blockSize;
}
@Override
public Iterator iterator() {
return new SubStreamIterator();
}
private class SubStreamIterator implements Iterator {
@Override
public boolean hasNext() {
return blocksPending > 0;
}
@Override
public SubStream next() {
blocksPending--;
return new SubStream(
wrappedStream,
currentBlock++ * blockSize,
blocksPending > 0 ? blockSize : lastBlockSize,
mutex);
}
@Override
public void remove() {
// No-op
}
}
}