    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one
    003 * or more contributor license agreements.  See the NOTICE file
    004 * distributed with this work for additional information
    005 * regarding copyright ownership.  The ASF licenses this file
    006 * to you under the Apache License, Version 2.0 (the
    007 * "License"); you may not use this file except in compliance
    008 * with the License.  You may obtain a copy of the License at
    009 *
    010 *   https://www.apache.org/licenses/LICENSE-2.0
    011 *
    012 * Unless required by applicable law or agreed to in writing,
    013 * software distributed under the License is distributed on an
    014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015 * KIND, either express or implied.  See the License for the
    016 * specific language governing permissions and limitations
    017 * under the License.
    018 */
    019package org.apache.commons.compress.parallel;
    020
    021import java.io.File;
    022import java.io.FileNotFoundException;
    023import java.io.IOException;
    024import java.io.InputStream;
    025import java.io.OutputStream;
    026import java.io.UncheckedIOException;
    027import java.nio.file.Files;
    028import java.nio.file.Path;
    029
    030/**
    031 * ScatterGatherBackingStore that is backed by a path.
    032 *
    033 * @since 1.10
    034 */
    035public class FileBasedScatterGatherBackingStore implements ScatterGatherBackingStore {
    036    private final Path target;
    037    private final OutputStream outputStream;
    038    private boolean closed;
    039
    040    /**
    041     * Constructs a new instance.
    042     *
    043     * @param target The path to offload compressed data into.
    044     * @throws FileNotFoundException if the file doesn't exist.
    045     */
    046    public FileBasedScatterGatherBackingStore(final File target) throws FileNotFoundException {
    047        this(target.toPath());
    048    }
    049
    050    /**
    051     * Constructs a new instance for the given path.
    052     *
    053     * @param target The path to offload compressed data into.
    054     * @throws FileNotFoundException if the file doesn't exist.
    055     * @since 1.22
    056     */
    057    public FileBasedScatterGatherBackingStore(final Path target) throws FileNotFoundException {
    058        this.target = target;
    059        try {
    060            outputStream = Files.newOutputStream(target);
    061        } catch (final FileNotFoundException ex) {
    062            throw ex;
    063        } catch (final IOException ex) {
    064            // must convert exception to stay backwards compatible with Compress 1.10 to 1.13
    065            throw new UncheckedIOException(ex); // NOSONAR
    066        }
    067    }
    068
    069    @Override
    070    public void close() throws IOException {
    071        try {
    072            closeForWriting();
    073        } finally {
    074            Files.deleteIfExists(target);
    075        }
    076    }
    077
    078    @Override
    079    public void closeForWriting() throws IOException {
    080        if (!closed) {
    081            outputStream.close();
    082            closed = true;
    083        }
    084    }
    085
    086    @Override
    087    public InputStream getInputStream() throws IOException {
    088        return Files.newInputStream(target);
    089    }
    090
    091    @Override
    092    public void writeOut(final byte[] data, final int offset, final int length) throws IOException {
    093        outputStream.write(data, offset, length);
    094    }
    095}