All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.metaeffekt.artifact.analysis.utils.FileAppendable Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2021-2024 the original author or authors.
 *
 * 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.metaeffekt.artifact.analysis.utils;

import org.apache.commons.io.output.FileWriterWithEncoding;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

public class FileAppendable implements Appendable {
    private final FileWriterWithEncoding writer;
    private final StringBuilder buffer;
    private final int bufferSize;

    public FileAppendable(File file, Charset encoding, boolean clearFile, int bufferSize) throws IOException {
        if (clearFile && file.exists()) {
            FileUtils.delete(file);
        }
        if (!file.exists()) {
            file.createNewFile();
        }

        this.writer = new FileWriterWithEncoding(file, encoding, true);
        this.buffer = new StringBuilder();
        this.bufferSize = bufferSize;
    }

    public FileAppendable(File file, Charset encoding, boolean clearFile) throws IOException {
        this(file, encoding, clearFile, 1024);
    }

    @Override
    public Appendable append(CharSequence csq) throws IOException {
        buffer.append(csq);
        flushBufferIfNeeded();
        return this;
    }

    @Override
    public Appendable append(CharSequence csq, int start, int end) throws IOException {
        buffer.append(csq, start, end);
        flushBufferIfNeeded();
        return this;
    }

    @Override
    public Appendable append(char c) throws IOException {
        buffer.append(c);
        flushBufferIfNeeded();
        return this;
    }

    private void flushBufferIfNeeded() throws IOException {
        if (buffer.length() >= bufferSize) {
            writer.write(buffer.toString());
            writer.flush();
            buffer.setLength(0);
        }
    }

    public void flush() throws IOException {
        if (buffer.length() > 0) {
            writer.write(buffer.toString());
            writer.flush();
            buffer.setLength(0);
        }
    }

    public void close() throws IOException {
        flush();
        writer.close();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy