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 * https://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 package org.apache.commons.compress.compressors.lzma; 20 21 import java.io.IOException; 22 import java.io.OutputStream; 23 24 import org.apache.commons.compress.compressors.CompressorOutputStream; 25 import org.apache.commons.io.build.AbstractStreamBuilder; 26 import org.tukaani.xz.LZMA2Options; 27 import org.tukaani.xz.LZMAOutputStream; 28 29 /** 30 * LZMA compressor. 31 * 32 * @since 1.13 33 */ 34 public class LZMACompressorOutputStream extends CompressorOutputStream<LZMAOutputStream> { 35 36 // @formatter:off 37 /** 38 * Builds a new {@link LZMACompressorOutputStream}. 39 * 40 * <p> 41 * For example: 42 * </p> 43 * <pre>{@code 44 * LZMACompressorOutputStream s = LZMACompressorOutputStream.builder() 45 * .setPath(path) 46 * .setLzma2Options(new LZMA2Options(...)) 47 * .get(); 48 * } 49 * </pre> 50 * 51 * @see #get() 52 * @see LZMA2Options 53 * @since 1.28.0 54 */ 55 // @formatter:on 56 public static class Builder extends AbstractStreamBuilder<LZMACompressorOutputStream, Builder> { 57 58 private LZMA2Options lzma2Options = new LZMA2Options(); 59 60 /** 61 * Constructs a new builder of {@link LZMACompressorOutputStream}. 62 */ 63 public Builder() { 64 // empty 65 } 66 67 @Override 68 public LZMACompressorOutputStream get() throws IOException { 69 return new LZMACompressorOutputStream(this); 70 } 71 72 /** 73 * Sets LZMA options. 74 * <p> 75 * Passing {@code null} resets to the default value {@link LZMA2Options#LZMA2Options()}. 76 * </p> 77 * 78 * @param lzma2Options LZMA options. 79 * @return this instance. 80 */ 81 public Builder setLzma2Options(final LZMA2Options lzma2Options) { 82 this.lzma2Options = lzma2Options != null ? lzma2Options : new LZMA2Options(); 83 return this; 84 } 85 86 } 87 88 /** 89 * Constructs a new builder of {@link LZMACompressorOutputStream}. 90 * 91 * @return a new builder of {@link LZMACompressorOutputStream}. 92 * @since 1.28.0 93 */ 94 public static Builder builder() { 95 return new Builder(); 96 } 97 98 @SuppressWarnings("resource") // Caller closes 99 private LZMACompressorOutputStream(final Builder builder) throws IOException { 100 super(new LZMAOutputStream(builder.getOutputStream(), builder.lzma2Options, -1)); 101 } 102 103 /** 104 * Creates a LZMA compressor. 105 * 106 * @param outputStream the stream to wrap 107 * @throws IOException on error 108 */ 109 public LZMACompressorOutputStream(final OutputStream outputStream) throws IOException { 110 this(builder().setOutputStream(outputStream)); 111 } 112 113 /** 114 * Finishes compression without closing the underlying stream. No more data can be written to this stream after finishing. 115 * 116 * @throws IOException on error 117 */ 118 @Override 119 @SuppressWarnings("resource") // instance variable access 120 public void finish() throws IOException { 121 out().finish(); 122 } 123 124 /** 125 * Doesn't do anything as {@link LZMAOutputStream} doesn't support flushing. 126 */ 127 @Override 128 public void flush() throws IOException { 129 // noop 130 } 131 132 /** {@inheritDoc} */ 133 @Override 134 public void write(final byte[] buf, final int off, final int len) throws IOException { 135 out.write(buf, off, len); 136 } 137 138 }