/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.examples;
import alluxio.AlluxioURI;
import alluxio.client.AlluxioStorageType;
import alluxio.client.ReadType;
import alluxio.client.WriteType;
import alluxio.client.file.FileOutStream;
import alluxio.client.file.FileSystem;
import alluxio.client.file.options.CreateFileOptions;
import alluxio.client.file.options.OpenFileOptions;
import alluxio.exception.AlluxioException;
import alluxio.exception.FileAlreadyExistsException;
import alluxio.util.CommonUtils;
import alluxio.util.FormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.concurrent.Callable;
/**
* Basic example of using the {@link FileSystem} for writing to and reading from files.
* <p>
* This class is different from {@link alluxio.examples.BasicOperations} in the way writes happen.
* Over there {@link java.nio.ByteBuffer} is used directly, where as here byte data is done via
* input/output streams.
* </p>
* <p>
* This example also let users play around with how to work with files a bit more. The
* {@link AlluxioStorageType} is something that can be set, as well as ability to
* delete file if exists.
* </p>
*/
public final class BasicNonByteBufferOperations implements Callable<Boolean> {
private static final Logger LOG = LoggerFactory.getLogger(BasicNonByteBufferOperations.class);
private final AlluxioURI mFilePath;
private final ReadType mReadType;
private final WriteType mWriteType;
private final boolean mDeleteIfExists;
private final int mLength;
/**
* @param filePath the path for the files
* @param readType the {@link ReadType}
* @param writeType the {@link WriteType}
* @param deleteIfExists delete files if they already exist
* @param length the number of files
*/
public BasicNonByteBufferOperations(AlluxioURI filePath, ReadType readType, WriteType writeType,
boolean deleteIfExists, int length) {
mFilePath = filePath;
mWriteType = writeType;
mReadType = readType;
mDeleteIfExists = deleteIfExists;
mLength = length;
}
@Override
public Boolean call() throws Exception {
FileSystem alluxioClient = FileSystem.Factory.get();
write(alluxioClient);
return read(alluxioClient);
}
private void write(FileSystem alluxioClient) throws IOException, AlluxioException {
FileOutStream fileOutStream = createFile(alluxioClient, mFilePath, mDeleteIfExists);
long startTimeMs = CommonUtils.getCurrentMs();
try (DataOutputStream os = new DataOutputStream(fileOutStream)) {
os.writeInt(mLength);
for (int i = 0; i < mLength; i++) {
os.writeInt(i);
}
}
LOG.info(FormatUtils.formatTimeTakenMs(startTimeMs, "writeFile to file " + mFilePath));
}
private FileOutStream createFile(FileSystem fileSystem, AlluxioURI filePath,
boolean deleteIfExists) throws IOException, AlluxioException {
CreateFileOptions options = CreateFileOptions.defaults().setWriteType(mWriteType);
if (!fileSystem.exists(filePath)) {
// file doesn't exist yet, so create it
return fileSystem.createFile(filePath, options);
} else if (deleteIfExists) {
// file exists, so delete it and recreate
fileSystem.delete(filePath);
return fileSystem.createFile(filePath, options);
}
// file exists and deleteIfExists is false
throw new FileAlreadyExistsException("File exists and deleteIfExists is false");
}
private boolean read(FileSystem alluxioClient) throws IOException, AlluxioException {
OpenFileOptions options = OpenFileOptions.defaults().setReadType(mReadType);
boolean pass = true;
long startTimeMs = CommonUtils.getCurrentMs();
try (DataInputStream input = new DataInputStream(alluxioClient.openFile(mFilePath, options))) {
int length = input.readInt();
for (int i = 0; i < length; i++) {
if (input.readInt() != i) {
pass = false;
break;
}
}
}
LOG.info(FormatUtils.formatTimeTakenMs(startTimeMs, "readFile file " + mFilePath));
return pass;
}
}