Package org.gocha.files

Source Code of org.gocha.files.FileUtil$FileWriteStreamClousre

/*******************************************************************************
gocha.org-lib-java Библеотека общего назначения
(с) Камнев Георгий Павлович 2009 GPLv2

Данная программа является свободным программным обеспечением. Вы вправе
распространять ее и/или модифицировать в соответствии с условиями версии 2
либо по вашему выбору с условиями более поздней версии
Стандартной Общественной Лицензии GNU, опубликованной Free Software Foundation.

Мы распространяем данную программу в надежде на то, что она будет вам полезной,
однако НЕ ПРЕДОСТАВЛЯЕМ НА НЕЕ НИКАКИХ ГАРАНТИЙ,
в том числе ГАРАНТИИ ТОВАРНОГО СОСТОЯНИЯ ПРИ ПРОДАЖЕ
и ПРИГОДНОСТИ ДЛЯ ИСПОЛЬЗОВАНИЯ В КОНКРЕТНЫХ ЦЕЛЯХ.
Для получения более подробной информации ознакомьтесь
со Стандартной Общественной Лицензией GNU.

Вместе с данной программой вы должны были получить экземпляр
Стандартной Общественной Лицензии GNU.
Если вы его не получили, сообщите об этом в Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*******************************************************************************/

package org.gocha.files;

import java.beans.ExceptionListener;
import java.beans.PersistenceDelegate;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
import java.util.Map;
import java.util.Properties;
import org.gocha.text.TextUtil;
import org.gocha.text.TextUtil.Convertors;
import org.gocha.types.TypesUtil;
import org.gocha.types.ValueController;

/**
* Класс для обчения работы с файлами
* @author Камнев Георгий Павлович
*/
public class FileUtil
{

    private static Charset defaultCharSet = null;

    /**
     * Возврщает кодировку по умолчанию используемой в классе FileUtil
     * @return Кодировка
     */
    public static Charset getDefaultCharset()
    {
        if (defaultCharSet == null)
        {
            defaultCharSet = Charset.defaultCharset();
        }

        return defaultCharSet;
    }

    /**
     * Устанавливает кодировку по умолчанию используемой в классе FileUtil
     * @param newDefaultCharset Кодировка (может быть null, тогда будет использоваться стандартная)
     */
    public static void setDefaultCharset(Charset newDefaultCharset)
    {
        defaultCharSet = newDefaultCharset;
    }
    private static ArrayList<ExceptionListener> exlisteners = new ArrayList<ExceptionListener>();

    /**
     * Добаляет слушателя исключений
     * @param listener Слушатель
     */
    public static void addExceptionListenr(ExceptionListener listener)
    {
        if (listener != null)
        {
            if( listener==_redirectException )return;
            exlisteners.add(listener);
        }
    }

    /**
     * Удаляет слушателя исключений
     * @param listener Слушатель
     */
    public static void removeExceptionListener(ExceptionListener listener)
    {
        exlisteners.remove(listener);
    }

    static void fireException(Exception exception)
    {
        if (exlisteners != null)
        {
            for (ExceptionListener listener : exlisteners.toArray(new ExceptionListener[]
                {
                }))
            {
                listener.exceptionThrown(exception);
            }
        }
        else
        {
            exception.printStackTrace();
        }
    }
    private static Charset utf8 = null;

    private static ExceptionListener _redirectException = new ExceptionListener()
    {
        @Override
        public void exceptionThrown(Exception e)
        {
            fireException(e);
        }
    };

    public static ExceptionListener redirectException()
    {
        return _redirectException;
    }

    /**
     * Возвращает кодировку UTF8
     * @return Кодировка
     */
    public static Charset UTF8()
    {
        if (utf8 == null)
        {
            utf8 = Charset.forName("UTF8");
        }
        return utf8;
    }
   
    /**
     * Возвращает символы перевода строки определенные системой
     * @return символы перевода строки
     */
    public static String getDefaultEOL()
    {
        return System.getProperty("line.separator","\n");
    }

    /**
     * Читает весь текст из файла и возвращает его по строчно
     * @param file Файл
     * @param cs Кодировка файла (Может быть null, тогда будет использоваться системная кодировка)
     * @param eol Символы перевода строки (Может быть null, тогда будут использоваться системные)
     * @return Строки содержащиейся в файле
     */
    public static String[] readAllLines(String file,Charset cs,String eol)
    {
        if( eol==null )eol = getDefaultEOL();
        if( cs==null )cs = getDefaultCharset();

        String text = readAllText(file, cs);
        if( text==null )return null;

        return TextUtil.split(text, eol);
    }

    /**
     * Читает весь текст из файла и возвращает его по строчно
     * @param file Файл
     * @param cs Кодировка файла (Может быть null, тогда будет использоваться системная кодировка)
     * @param eol Символы перевода строки (Может быть null, тогда будут использоваться системные)
     * @return Строки содержащиейся в файле
     */
    public static String[] readAllLines(File file,Charset cs,String eol)
    {
        if( eol==null )eol = getDefaultEOL();
        if( cs==null )cs = getDefaultCharset();

        String text = readAllText(file, cs);
        if( text==null )return null;

        return TextUtil.split(text, eol);
    }

    /**
     * Читает весь текст из файла и возвращает его по строчно
     * @param file Файл
     * @param cs Кодировка файла (Может быть null, тогда будет использоваться системная кодировка)
     * @param eol Символы перевода строки (Может быть null, тогда будут использоваться системные)
     * @return Строки содержащиейся в файле
     */
    public static String[] readAllLines(String file,String cs,String eol)
    {
        if( eol==null )eol = getDefaultEOL();

        String text = cs==null ? readAllText(file, getDefaultCharset()) : readAllText(file, cs);
        if( text==null )return null;

        return TextUtil.split(text, eol);
    }

    /**
     * Читает весь текст из файла и возвращает его по строчно
     * @param file Файл
     * @param cs Кодировка файла (Может быть null, тогда будет использоваться системная кодировка)
     * @param eol Символы перевода строки (Может быть null, тогда будут использоваться системные)
     * @return Строки содержащиейся в файле
     */
    public static String[] readAllLines(File file,String cs,String eol)
    {
        if( eol==null )eol = getDefaultEOL();

        String text = cs==null ? readAllText(file, getDefaultCharset()) : readAllText(file, cs);
        if( text==null )return null;

        return TextUtil.split(text, eol);
    }

    /**
     * Читает весь текст из файла и возвращает его по строчно
     * @param file Файл
     * @param cs Кодировка файла (Может быть null, тогда будет использоваться системная кодировка)
     * @param eol Символы перевода строки (Может быть null, тогда будут использоваться системные)
     * @return Строки содержащиейся в файле
     */
    public static String[] readAllLines(URL file,String cs,String eol)
    {
        if( eol==null )eol = getDefaultEOL();

        String text = cs==null ? readAllText(file, getDefaultCharset()) : readAllText(file, cs);
        if( text==null )return null;

        return TextUtil.split(text, eol);
    }

    /**
     * Читает весь текст из файла и возвращает его по строчно
     * @param file Файл
     * @param cs Кодировка файла (Может быть null, тогда будет использоваться системная кодировка)
     * @param eol Символы перевода строки (Может быть null, тогда будут использоваться системные)
     * @return Строки содержащиейся в файле
     */
    public static String[] readAllLines(URL file,Charset cs,String eol)
    {
        if( eol==null )eol = getDefaultEOL();
        if( cs==null )cs = getDefaultCharset();

        String text = readAllText(file, cs);
        if( text==null )return null;

        return TextUtil.split(text, eol);
    }

    /**
     * Читает весь текст из файла и возвращает его по строчно
     * @param file Файл
     * @param cs Кодировка файла (Может быть null, тогда будет использоваться системная кодировка)
     * @param eol Символы перевода строки (Может быть null, тогда будут использоваться системные)
     * @return Строки содержащиейся в файле
     */
    public static String[] readAllLines(InputStream file,Charset cs,String eol)
    {
        if( eol==null )eol = getDefaultEOL();
        if( cs==null )cs = getDefaultCharset();

        String text = readAllText(file, cs);
        if( text==null )return null;

        return TextUtil.split(text, eol);
    }

    /**
     * Читает весь текст из файла и возвращает его по строчно
     * @param file Файл
     * @param cs Кодировка файла (Может быть null, тогда будет использоваться системная кодировка)
     * @param eol Символы перевода строки (Может быть null, тогда будут использоваться системные)
     * @return Строки содержащиейся в файле
     */
    public static String[] readAllLines(InputStream file,String cs,String eol)
    {
        if( eol==null )eol = getDefaultEOL();

        String text = cs==null ? readAllText(file, getDefaultCharset()) : readAllText(file, cs);
        if( text==null )return null;

        return TextUtil.split(text, eol);
    }

    /**
     * Читает весь текст из файла и возвращает его по строчно
     * @param file Файл
     * @param eol Символы перевода строки (Может быть null, тогда будут использоваться системные)
     * @return Строки содержащиейся в файле
     */
    public static String[] readAllLines(InputStreamReader file,String eol)
    {
        if( eol==null )eol = getDefaultEOL();

        String text = readAllText(file);
        if( text==null )return null;

        return TextUtil.split(text, eol);
    }

    /**
     * Читает весь текст из файла и возвращает его
     * @param file Файл
     * @param charset Кодировка
     * @return Содержиое файла в виде текста или null в случаии ошибки
     */
    public static String readAllText(String file, String charset)
    {
        try
        {
            return readAllText(file, Charset.forName(charset));
        }
        catch (UnsupportedCharsetException ex)
        {
            fireException(ex);
        }
        catch (IllegalCharsetNameException ex)
        {
            fireException(ex);
        }
        catch (IllegalArgumentException ex)
        {
            fireException(ex);
        }
        return null;
    }

    /**
     * Читает весь текст из файла и возвращает его
     * @param file Файл
     * @param charset Кодировка
     * @return Содержиое файла в виде текста или null в случаии ошибки
     */
    public static String readAllText(File file, String charset)
    {
        try
        {
            return readAllText(file, Charset.forName(charset));
        }
        catch (UnsupportedCharsetException ex)
        {
            fireException(ex);
        }
        catch (IllegalCharsetNameException ex)
        {
            fireException(ex);
        }
        catch (IllegalArgumentException ex)
        {
            fireException(ex);
        }
        return null;
    }

    /**
     * Читает весь текст из файла и возвращает его
     * @param file Файл
     * @param charset Кодировка
     * @return Содержиое файла в виде текста или null в случаии ошибки
     */
    public static String readAllText(URL file, String charset)
    {
        try
        {
            return readAllText(file, Charset.forName(charset));
        }
        catch (UnsupportedCharsetException ex)
        {
            fireException(ex);
        }
        catch (IllegalCharsetNameException ex)
        {
            fireException(ex);
        }
        catch (IllegalArgumentException ex)
        {
            fireException(ex);
        }
        return null;
    }

    private FileReadStreamClousre openRead(File file, Charset charset)
    {
        final File _file = file;
        final Charset _charset = charset;

        FileReadStreamClousre clousre = new FileReadStreamClousre()
        {

            @Override
            public FileReadStream openRead() throws IOException
            {
                FileReadStream result = new FileReadStream();
                result.inputStream = new FileInputStream(_file);
                result.inputReader = new InputStreamReader(result.inputStream, _charset);

                return result;
            }
        };

        return clousre;
    }

    /**
     * Читает весь текст из файла и возвращает его
     * @param file Файл
     * @param charset Кодировка
     * @return Содержиое файла в виде текста или null в случаии ошибки
     */
    public static String readAllText(File file, Charset charset)
    {
        return _ReadAllText(new FileUtil().openRead(file, charset));
    }

    private FileReadStreamClousre openRead(String file, Charset charset)
    {
        final String _file = file;
        final Charset _charset = charset;

        FileReadStreamClousre clousre = new FileReadStreamClousre()
        {

            @Override
            public FileReadStream openRead() throws IOException
            {
                FileReadStream result = new FileReadStream();
                result.inputStream = new FileInputStream(_file);
                result.inputReader = new InputStreamReader(result.inputStream, _charset);

                return result;
            }
        };

        return clousre;
    }

    /**
     * Читает весь текст из файла и возвращает его
     * @param fileName Файл
     * @param charset Кодировка
     * @return Содержиое файла в виде текста или null в случаии ошибки
     */
    public static String readAllText(String fileName, Charset charset)
    {
        return _ReadAllText(new FileUtil().openRead(fileName, charset));
    }

    private FileReadStreamClousre openRead(URL file, Charset charset)
    {
        final URL _file = file;
        final Charset _charset = charset;

        FileReadStreamClousre clousre = new FileReadStreamClousre()
        {

            @Override
            public FileReadStream openRead() throws IOException
            {
                FileReadStream result = new FileReadStream();
                result.inputStream = _file.openStream();
                result.inputReader = new InputStreamReader(result.inputStream, _charset);

                return result;
            }
        };

        return clousre;
    }

    /**
     * Читает весь текст из файла и возвращает его
     * @param file Файл
     * @param charset Кодировка
     * @return Содержиое файла в виде текста или null в случаии ошибки
     */
    public static String readAllText(URL file, Charset charset)
    {
        return _ReadAllText(new FileUtil().openRead(file, charset));
    }

    /**
     * Читает весь текст (до конца файла) и возвращает его.
     * Входной поток не закрывается.
     * @param inputStream Исходный поток байтов
     * @param cs Кодировка файла
     * @return Содержимое потока в виде текста или null в случаии ошибки
     */
    public static String readAllText(InputStream inputStream,String cs)
    {
        try
        {
            Charset _cs = Charset.forName(cs);
            String _txt = readAllText(inputStream, _cs);
            return _txt;
        }
        catch(Exception ex)
        {
            fireException(ex);
        }

        return null;
    }

    /**
     * Читает весь текст (до конца файла) и возвращает его.
     * Входной поток не закрывается.
     * @param inputStream Исходный поток байтов
     * @param cs Кодировка файла
     * @return Содержимое потока в виде текста или null в случаии ошибки
     */
    public static String readAllText(InputStream inputStream,Charset cs)
    {
        if (inputStream == null) {
            throw new IllegalArgumentException("inputStream == null");
        }
        if (cs == null) {
            throw new IllegalArgumentException("cs == null");
        }

        InputStreamReader inReader = new InputStreamReader(inputStream, cs);
        String _txt = readAllText(inReader);
        return _txt;
    }

    /**
     * Читает весь текст (до конца файла) и возвращает его.
     * Входной поток не закрывается.
     * @param reader Исходный поток текста
     * @return Содержимое потока в виде текста или null в случаии ошибки
     */
    public static String readAllText(InputStreamReader reader)
    {
        String result = null;
        try
        {
            result = _readAllText(reader);
        }
        catch(Exception ex)
        {
            fireException(ex);
            return null;
        }
        return result;
    }

    private static String _readAllText(InputStreamReader reader) throws IOException
    {
        if( reader==null )
            throw new IOException("Нет источника данных (org.gocha.files.FileUtil#_ReadAllText(InputStreamReader))");
       
        char[] cbuff = new char[1000];
        String buff = "";
        while (true)
        {
            int rd = reader.read(cbuff);
            if (rd < 0)
            {
                break;
            }
            buff += new String(cbuff, 0, rd);
        }

        return buff;
    }

    static String _ReadAllText(FileReadStreamClousre clousre)
    {
        FileReadStream fileReadStrm = null;
        try
        {
            try
            {
                fileReadStrm = clousre.openRead();

                return _readAllText(fileReadStrm.inputReader);
            }
            catch (IOException ex)
            {
                fireException(ex);
            }
        }
        finally
        {
            if( fileReadStrm!=null )
            {
                if (fileReadStrm.inputReader != null)
                {
                    try
                    {
                        fileReadStrm.inputReader.close();
                    }
                    catch (IOException ex)
                    {
                        fireException(ex);
                    }
                }
                if (fileReadStrm.inputStream != null)
                {
                    try
                    {
                        fileReadStrm.inputStream.close();
                    }
                    catch (IOException ex)
                    {
                        fireException(ex);
                    }
                }
            }
        }
        return null;
    }

    private class FileWriteStream
    {
        public OutputStream outputStream;
        public OutputStreamWriter outputWriter;
    }

    private abstract class FileWriteStreamClousre
    {

        public abstract FileWriteStream openWrite() throws IOException;
    }

    private static boolean _writeAllText(FileWriteStreamClousre openClousre, String text)
    {
        FileWriteStream fStream = null;
        try
        {
            try
            {
                fStream = openClousre.openWrite();
               
                OutputStreamWriter writer = fStream.outputWriter;
                writer.write(text);
                writer.flush();
               
                return true;
            }
            catch (IOException ex)
            {
                fireException(ex);
            }
        }
        finally
        {
            if(fStream!=null )
            {
                if (fStream.outputWriter != null)
                {
                    try
                    {
                        fStream.outputWriter.close();
                    }
                    catch (IOException ex)
                    {
                        fireException(ex);
                    }
                }
                if (fStream.outputStream != null)
                {
                    try
                    {
                        fStream.outputStream.close();
                    }
                    catch (IOException ex)
                    {
                        fireException(ex);
                    }
                }
            }
        }
        return false;
    }

    private FileWriteStreamClousre openWrite(String file, Charset charset)
    {
        final String _file = file;
        final Charset _charset = charset;

        FileWriteStreamClousre clousre = new FileWriteStreamClousre()
        {
            @Override
            public FileWriteStream openWrite() throws IOException
            {
                FileWriteStream result = new FileWriteStream();
                result.outputStream = new FileOutputStream(_file);
                result.outputWriter = new OutputStreamWriter(result.outputStream, _charset);

                return result;
            }
        };

        return clousre;
    }

    private FileWriteStreamClousre openWrite(File file, Charset charset)
    {
        final File _file = file;
        final Charset _charset = charset;

        FileWriteStreamClousre clousre = new FileWriteStreamClousre()
        {

            @Override
            public FileWriteStream openWrite() throws IOException
            {
                FileWriteStream result = new FileWriteStream();
                result.outputStream = new FileOutputStream(_file);
                result.outputWriter = new OutputStreamWriter(result.outputStream, _charset);

                return result;
            }
        };

        return clousre;
    }
   
    /**
     * Записывает текст в файл по строчно
     * @param file Файл
     * @param charset Кодировка (Может быть null, тогда используется по умолчанию)
     * @param content Текст для записи
     * @param eol Символы перевода строки (
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllLines(File file, Charset charset, String[] content,String eol)
    {
        if( eol==null )eol = getDefaultEOL();
        if( charset==null )charset = getDefaultCharset();

        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }

        String cntnt = TextUtil.join(content, eol);
        return writeAllText(file, charset, cntnt);
    }

    /**
     * Записывает текст в файл по строчно
     * @param file Файл
     * @param charset Кодировка (Может быть null, тогда используется по умолчанию)
     * @param content Текст для записи
     * @param eol Символы перевода строки (
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllLines(String file, Charset charset, String[] content,String eol)
    {
        if( eol==null )eol = getDefaultEOL();
        if( charset==null )charset = getDefaultCharset();

        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }

        String cntnt = TextUtil.join(content, eol);
        return writeAllText(file, charset, cntnt);
    }

    /**
     * Записывает текст в файл по строчно
     * @param file Файл
     * @param charset Кодировка (Может быть null, тогда используется по умолчанию)
     * @param content Текст для записи
     * @param eol Символы перевода строки (
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllLines(File file, String charset, String[] content,String eol)
    {
        if( eol==null )eol = getDefaultEOL();

        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }

        String cntnt = TextUtil.join(content, eol);
        return charset==null ? writeAllText(file, getDefaultCharset(), cntnt) : writeAllText(file, charset, cntnt);
    }

    /**
     * Записывает текст в файл по строчно
     * @param file Файл
     * @param charset Кодировка (Может быть null, тогда используется по умолчанию)
     * @param content Текст для записи
     * @param eol Символы перевода строки (Может быть null, тогда используется по умолчанию)
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllLines(String file, String charset, String[] content,String eol)
    {
        if( eol==null )eol = getDefaultEOL();

        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }

        String cntnt = TextUtil.join(content, eol);
        return charset==null ? writeAllText(file, getDefaultCharset(), cntnt) : writeAllText(file, charset, cntnt);
    }

    /**
     * Записывает текст в файл по строчно
     * @param file Файл
     * @param charset Кодировка (Может быть null, тогда используется по умолчанию)
     * @param content Текст для записи
     * @param eol Символы перевода строки (Может быть null, тогда используется по умолчанию)
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllLines(OutputStream file, String charset, String[] content,String eol)
    {
        if( eol==null )eol = getDefaultEOL();

        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }

        String cntnt = TextUtil.join(content, eol);
        return charset==null ? writeAllText(file, getDefaultCharset(), cntnt) : writeAllText(file, charset, cntnt);
    }

    /**
     * Записывает текст в файл по строчно
     * @param file Файл
     * @param charset Кодировка (Может быть null, тогда используется по умолчанию)
     * @param content Текст для записи
     * @param eol Символы перевода строки (Может быть null, тогда используется по умолчанию)
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllLines(OutputStream file, Charset charset, String[] content,String eol)
    {
        if( eol==null )eol = getDefaultEOL();

        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }

        String cntnt = TextUtil.join(content, eol);
        return charset==null ? writeAllText(file, getDefaultCharset(), cntnt) : writeAllText(file, charset, cntnt);
    }

    /**
     * Записывает текст в файл по строчно
     * @param file Файл
     * @param content Текст для записи
     * @param eol Символы перевода строки (Может быть null, тогда используется по умолчанию)
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllLines(OutputStreamWriter file, String[] content,String eol)
    {
        if( eol==null )eol = getDefaultEOL();

        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }

        String cntnt = TextUtil.join(content, eol);
        return writeAllText(file, cntnt);
    }

    /**
     * Записывает текст в файл
     * @param fileName Файл
     * @param charset Кодировка
     * @param content Текст для записи
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllText(String fileName, Charset charset, String content)
    {
        return _writeAllText(new FileUtil().openWrite(fileName, charset), content);
    }

    /**
     * Записывает текст в файл
     * @param fileName Файл
     * @param charset Кодировка
     * @param content Текст для записи
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllText(File fileName, Charset charset, String content)
    {
        return _writeAllText(new FileUtil().openWrite(fileName, charset), content);
    }

    /**
     * Записывает текст в файл
     * @param fileName Файл
     * @param charset Кодировка
     * @param content Текст для записи
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllText(File fileName, String charset, String content)
    {
        try
        {
            return writeAllText(fileName, Charset.forName(charset), content);
        }
        catch (UnsupportedCharsetException ex)
        {
            fireException(ex);
        }
        catch (IllegalCharsetNameException ex)
        {
            fireException(ex);
        }
        catch (IllegalArgumentException ex)
        {
            fireException(ex);
        }

        return false;
    }

    /**
     * Записывает текст в файл
     * @param fileName Файл
     * @param charset Кодировка
     * @param content Текст для записи
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllText(String fileName, String charset, String content)
    {
        try
        {
            return writeAllText(fileName, Charset.forName(charset), content);
        }
        catch (UnsupportedCharsetException ex)
        {
            fireException(ex);
        }
        catch (IllegalCharsetNameException ex)
        {
            fireException(ex);
        }
        catch (IllegalArgumentException ex)
        {
            fireException(ex);
        }
        return false;
    }

    /**
     * Записывает текст в поток. Поток не закрывается
     * @param output Поток
     * @param cs Кодировка
     * @param content Содержимое
     * @return true - файл записан; false - файл не записан
     */
    public static boolean writeAllText(OutputStream output,String cs,String content)
    {
        if (output == null) {
            throw new IllegalArgumentException("output == null");
        }
        if (cs == null) {
            throw new IllegalArgumentException("cs == null");
        }
        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }

        Charset _cs = null;
        try
        {
            _cs = Charset.forName(cs);
        }
        catch(Exception ex)
        {
            fireException(ex);
            return false;
        }

        return writeAllText(output, _cs, content);
    }

    /**
     * Записывает текст в поток. Поток не закрывается
     * @param output Поток
     * @param cs Кодировка
     * @param content Содержимое
     */
    public static boolean writeAllText(OutputStream output,Charset cs,String content)
    {
        if (output == null) {
            throw new IllegalArgumentException("output == null");
        }
        if (cs == null) {
            throw new IllegalArgumentException("cs == null");
        }
        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }

        OutputStreamWriter writer = new OutputStreamWriter(output, cs);
        return writeAllText(writer, content);
    }

    /**
     * Записывает текст в поток.
     * Поток не закрывается
     * @param output Поток
     * @param content Текст для записи
     */
    public static boolean writeAllText(OutputStreamWriter output, String content)
    {
        if (output == null) {
            throw new IllegalArgumentException("output == null");
        }
        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }
        try {
            output.write(content);
            output.flush();
        } catch (IOException ex) {
            fireException(ex);
            return false;
        }
        return true;
    }

    public static void appendAllText(File file,String content,Charset cs) throws IOException
    {
        if (file == null) {
            throw new IllegalArgumentException("file == null");
        }
        if (content == null) {
            throw new IllegalArgumentException("content == null");
        }
        if (cs == null) {
            throw new IllegalArgumentException("cs == null");
        }

        FileOutputStream fout = new FileOutputStream(file, true);
        OutputStreamWriter writer = new OutputStreamWriter(fout, cs);
        writer.write(content);
        writer.flush();
        writer.close();
        fout.close();
    }

    /**
     * Копирует все данные из входного потока в выходной поток
     * @param from Из какого потока копировать
     * @param to В какой поток копировать
     * @throws java.io.IOException Если не может
     */
    public static void copyAllData(InputStream from,OutputStream to) throws IOException
    {
        if (from == null) {
            throw new IllegalArgumentException("from == null");
        }
        if (to == null) {
            throw new IllegalArgumentException("to == null");
        }
        while(true)
        {
            byte[] buff = new byte[1024];
            int rd = from.read(buff);
            if( rd<0 )break;
            to.write(buff, 0, rd);
        }
    }

    /**
     * Читает из входного потока все байты и возвращает как массив
     * @param input Входной поток
     * @return Массив байтов
     * @throws java.io.IOException Если не может
     */
    public static byte[] readAllData(InputStream input) throws IOException
    {
        if (input == null) {
            throw new IllegalArgumentException("input == null");
        }

        ByteArrayOutputStream ba = new ByteArrayOutputStream();
        try
        {
            copyAllData(input, ba);
            return ba.toByteArray();
        }
        finally
        {
            ba.close();
        }
    }

    /**
     * Читает из входного потока все байты и возвращает как массив
     * @param input Входной поток
     * @param close true - Закрывать поток по завершению; false - Оставлять как есть
     * @return Массив байтов или null если не смог прочитать
     */
    public static byte[] readAllData(InputStream input,boolean close)
    {
        if (input == null) {
            fireException(new IllegalArgumentException("input == null"));
            return null;
        }

        try
        {
            byte[] data = readAllData(input);
            if( close )
            {
                input.close();
            }
            return data;
        } catch (IOException ex) {
            fireException(ex);
        }

        return null;
    }

    /**
     * Читает из входного потока все байты и возвращает как входной массив
     * @param in Входной поток
     * @return Поток байтов
     * @throws java.io.IOException Если не может
     */
    public static ByteArrayInputStream readAllDataAsByteInStream(InputStream in) throws IOException
    {
        if (in == null) {
            throw new IllegalArgumentException("in == null");
        }

        byte[] data = readAllData(in);
        ByteArrayInputStream bi = new ByteArrayInputStream(data);
        return bi;
    }

    /**
     * Сохраняет объект (bean) в поток
     * @param output Поток
     * @param obj2save Объект для сохранения
     * @param mapClass2Persistence делегаты сохранения объектов (может быть null)
     */
    public static boolean writeXMLBeanTo(
            OutputStream output,
            Object obj2save,
            Map<? extends Class, ? extends PersistenceDelegate> mapClass2Persistence,
            Object owner
            )
    {
        if (output == null) {
            throw new IllegalArgumentException("output == null");
        }
        if (obj2save == null) {
            throw new IllegalArgumentException("obj2save == null");
        }

        XMLEncoder xe = new XMLEncoder(output);
        if( owner!=null )xe.setOwner(owner);

        if( mapClass2Persistence!=null )
        {
            for( Class c : mapClass2Persistence.keySet() )
            {
                if( c==null )continue;

                PersistenceDelegate pd = mapClass2Persistence.get(c);
                if( pd==null )continue;

                xe.setPersistenceDelegate(c, pd);
            }
        }

        xe.writeObject(obj2save);
        xe.close();

        return true;
    }

    protected static void _writeXMLBeanTo(
            File file,
            Object obj2save,
            Map<? extends Class, ? extends PersistenceDelegate> mapClass2Persistence,
            Object owner)
            throws IOException
    {
        if (file == null) {
            throw new IllegalArgumentException("file == null");
        }
        if (obj2save == null) {
            throw new IllegalArgumentException("obj2save == null");
        }

        FileOutputStream fos = new FileOutputStream(file);
        try
        {
            writeXMLBeanTo(fos, obj2save, mapClass2Persistence,owner);
        }
        finally
        {
            if( fos!=null )
            {
                fos.close();
            }
        }
    }

    /**
     * Сохраянет объект в xml файл, используя XMLEncoder
     * @param file Файл
     * @param obj2save Объект для сохранения
     * @param mapClass2Persistence Классы представители
     * @return факт сохранения
     */
    public static boolean writeXMLBeanTo(
            File file,
            Object obj2save,
            Map<? extends Class, ? extends PersistenceDelegate> mapClass2Persistence,
            Object owner)
    {
        if (file == null) {
            throw new IllegalArgumentException("file == null");
        }
        if (obj2save == null) {
            throw new IllegalArgumentException("obj2save == null");
        }

        try
        {
            _writeXMLBeanTo(file, obj2save, mapClass2Persistence,owner);
        }
        catch(Exception ex)
        {
            fireException(ex);
            return false;
        }

        return true;
    }

//    /**
//     * Сохраянет объект в xml файл, используя XMLEncoder
//     * @param filepath Файл
//     * @param obj2save Объект для сохранения
//     * @param mapClass2Persistence Классы представители
//     */
//    public static void saveXMLBeanTo(
//            String filepath,
//            Object obj2save,
//            Map<? extends Class, ? extends PersistenceDelegate> mapClass2Persistence)
//    {
//        if (filepath == null) {
//            throw new IllegalArgumentException("filepath == null");
//        }
//        if (obj2save == null) {
//            throw new IllegalArgumentException("obj2save == null");
//        }
//
//        try
//        {
//            _saveXMLBeanTo(new File(filepath), obj2save, mapClass2Persistence,null);
//        }
//        catch(Exception ex)
//        {
//            fireException(ex);
//        }
//    }

//    /**
//     * Востанавливает объект (bean) из потока
//     * @param input Поток
//     * @return Объект или null
//     * @throws java.lang.Exception Если что не получилось
//     */
//    protected static Object _loadXMLBeanFrom(InputStream input) throws Exception
//    {
//        if (input == null) {
//            throw new IllegalArgumentException("input == null");
//        }
//
//        XMLDecoder xd = new XMLDecoder(input);
//        try
//        {
//            Object o = xd.readObject();
//            return o;
//        }finally
//        {
//            xd.close();
//        }
//    }

    /**
     * Востанавливает объект из текстового представления
     * @param input Текстовое представление
     * @param owner Объект владелец для восстановления (может быть null)
     * @return Объект или null (все исключения перенаправляюся в FileUtil - exceptionListeners)
     */
    public static Object readXMLBeanFromStirng(String input, Object owner)
    {
        if( input==null )
        {
            fireException(new IllegalArgumentException("input == null"));
            return null;
        }

        Charset cs = UTF8();
        ByteBuffer bb = cs.encode(input);
        ByteArrayInputStream baInputStream = new ByteArrayInputStream(bb.array(), 0, bb.limit());
       
        Object res = readXMLBeanFrom(baInputStream,owner);

        try {
            baInputStream.close();
        } catch (IOException ex) {
//            Logger.getLogger(FileUtil.class.getName()).log(Level.SEVERE, null, ex);
            fireException(ex);
        }
        bb.clear();

        return res;
    }

    /**
     * Востанавливает объект (bean) из потока
     * @param input Поток
     * @param owner Объект владелец для востанновления (может быть null)
     * @return Объект или null (все исключения перенаправляюся в FileUtil - exceptionListeners)
     */
    public static Object readXMLBeanFrom(InputStream input,Object owner)
    {
        if (input == null) {
            throw new IllegalArgumentException("input == null");
        }
        XMLDecoder xd = new XMLDecoder(input);
        if( owner!=null )xd.setOwner(owner);
        try
        {
            xd.setExceptionListener(new ExceptionListener() {
                @Override
                public void exceptionThrown(Exception e) {
                    fireException(e);
                }
            });
            Object o = xd.readObject();
            return o;
        }
        catch(Exception ex)
        {
            return null;
        }
        finally
        {
            xd.close();
        }
    }

    /**
     * Востанавливает объект (bean) из файла
     * @param file Файл
     * @param owner Объект владелец для восстановления (может быть null)
     * @return Объект или null (все исключения перенаправляюся в FileUtil - exceptionListeners)
     */
    public static Object readXMLBeanFrom(File file,Object owner)
    {
        if (file == null) {
            throw new IllegalArgumentException("file == null");
        }

        FileInputStream fis = null;
        try
        {
            fis = new FileInputStream(file);
            return readXMLBeanFrom(fis,owner);
        }
        catch(Exception ex)
        {
            fireException(ex);
            return null;
        }
        finally
        {
            if( fis!=null )
            {
                try
                {
                    fis.close();
                } catch (IOException ex) {
                    fireException(ex);
                }
            }
        }
    }

    /**
     * Востанавливает объект (bean) из ссылки
     * @param url Ссылка
     * @param owner Объект владелец (или null)
     * @return Объект или null (все исключения перенаправляюся в FileUtil - exceptionListeners)
     */
    public static Object readXMLBeanFrom(URL url,Object owner)
    {
        if (url == null) {
            throw new IllegalArgumentException("url == null");
        }

        InputStream ins = null;

        try
        {
            ins = url.openStream();
            return readXMLBeanFrom(ins, owner);
        }
        catch (IOException ex) {
            fireException(ex);
        }
        finally
        {
            if( ins!=null )
            {
                try
                {
                    ins.close();
                } catch (IOException ex) {
                    fireException(ex);
                }
            }
        }

        return null;
    }

    /**
     * Востанавливает объект (bean) из файла
     * @param filepath Путь к файлу
     * @param owner Объект для восстановления (может быть null)
     * @return Объект или null (все исключения перенаправляюся в FileUtil - exceptionListeners)
     */
    public static Object readXMLBeanFromFile(String filepath,Object owner)
    {
        if (filepath == null) {
            throw new IllegalArgumentException("filepath == null");
        }
        return readXMLBeanFrom(new File(filepath),owner);
    }

    /**
     * Разделяет путь на компоненты
     * @param path Путь
     * @param directoryDelimeters Разделители каталогов
     * @return Компоненты пути, пустые строки - в обознаяают разделити которые были в начале/конце или повторялись два (или более) раза
     */
    public static String[] splitPath(String path,String[] directoryDelimeters)
    {
        if (path == null) {
            throw new IllegalArgumentException("path == null");
        }
        if (directoryDelimeters == null) {
            throw new IllegalArgumentException("directoryDelimeters == null");
        }

        ArrayList<String> componentPath = new ArrayList<String>();
        componentPath.add(path);

        for (String dirDelim : directoryDelimeters)
        {
            ArrayList<String> newComponentPath = new ArrayList<String>();
            for (String cmpt : componentPath)
            {
                if (cmpt == null)
                {
                    continue;
                }
                if (cmpt.length() < 1)
                {
                    newComponentPath.add(cmpt);
                    continue;
                }
                int idx = 0;
                while (true)
                {
                    int next = cmpt.indexOf(dirDelim, idx);
                    if (next < 0) {
                        int length = cmpt.length() - idx;
                        if (length == 0)
                        {
                            break;
                        }
                        String toAdd = cmpt.substring(idx);
                        newComponentPath.add(toAdd);
                        break;
                    } else {
                        int length = next - idx;
                        if (length == 0) {
                            newComponentPath.add("");
                            idx = next + dirDelim.length();
                            continue;
                        } else {
                            if (length < 0) {
                                throw new Error("AAAAA");
                            }
                            String toAdd = cmpt.substring(idx, next);
                            idx = next + dirDelim.length();
                            newComponentPath.add(toAdd);
                            if( idx==cmpt.length() )
                            {
                                newComponentPath.add("");
                                break;
                            }
                        }
                    }
                }
            }
            componentPath = newComponentPath;
        }

        return componentPath.toArray(new String[]{});
    }

    /**
     * Создает относительный адрес
     * @param fileBase Относительно этого файла (предпологается каталог; должен быть абсолютный адрес)
     * @param fileTarget Файл на который должна указывать ссылка (должен быть абсолютный адрес)
     * @return Файл
     * @throws IOException Если какая либо ошибка
     */
    public static File makeRelative(File fileBase,File fileTarget) throws IOException
    {
        if (fileBase == null) {
            throw new IllegalArgumentException("fileBase == null");
        }
        if (fileTarget == null) {
            throw new IllegalArgumentException("fileTarget == null");
        }
        if (!fileBase.isAbsolute()) {
            throw new IllegalArgumentException("fileBase not absolute");
        }
        if (!fileTarget.isAbsolute()) {
            throw new IllegalArgumentException("fileTarget not absolute");
        }

        File canonicBase = fileBase.getAbsoluteFile().getCanonicalFile();
        File canonicTarget = fileTarget.getAbsoluteFile().getCanonicalFile();

        String pathBase = canonicBase.getAbsolutePath();
        String pathTarget = canonicTarget.getAbsolutePath();

        String[] pTarget = TextUtil.split(pathTarget, File.separator);
        String[] pBase = TextUtil.split(pathBase, File.separator);

        ArrayList<String> res = new ArrayList<String>();
        int idx = 0;
        while(true){
            if( idx>=pTarget.length )break;
            if( idx>=pBase.length )break;
            if( pTarget[idx].equals(pBase[idx]) )
            {
                idx++;
            }else{
                break;
            }
        }

        for( int i=idx; i<pBase.length; i++ )
        {
            res.add("..");
        }

        for( int i=idx; i<pTarget.length; i++ ){
            res.add(pTarget[i]);
        }

        StringBuilder result = new StringBuilder();
        for( int i=0; i<res.size(); i++ )
        {
            if(i>0)result.append( File.separator );
            result.append( res.get(i) );
        }

        return new File(result.toString());
    }

    public static Properties readProperties(InputStream inputStream) throws IOException{
        if (inputStream== null)
            throw new IllegalArgumentException("inputStream==null");
        Properties p = new Properties();
        p.load(inputStream);
        return p;
    }

    public static Properties readProperties(Reader reader) throws IOException {
        if( reader==null )throw new IllegalArgumentException("reader == null");
        Properties p = new Properties();
        p.load(reader);
        return p;
    }

    public static Properties readXMLProperties(InputStream inputStream) throws IOException {
        if (inputStream== null)
            throw new IllegalArgumentException("inputStream==null");
        Properties p = new Properties();
        p.loadFromXML(inputStream);
        return p;
    }

    public static Properties readProperties(File file) throws IOException {
        if (file== null) throw new IllegalArgumentException("file==null");
        if (!file.exists()) throw new IOException("file \""+file+"\" not exists");
        if (!file.isFile()) throw new IOException("is not file \""+file+"\"");
        if (!file.canRead()) throw new IOException("can't read file \""+file+"\"");
        Properties p = null;
        FileInputStream fin = new FileInputStream(file);
        if( file.getName().toLowerCase().endsWith(".xml") )
            p = readXMLProperties(fin);
        else
            p = readProperties(fin);
        fin.close();
        return p;
    }

    private final static String DEF_COMMENTS = "no comments";

    public static void writeProperties(File file,Properties props) throws IOException {
        if (file == null)throw new IllegalArgumentException("file==null");
        if (props == null)throw new IllegalArgumentException("props==null");

        FileOutputStream fout = new FileOutputStream(file);
        if( file.getName().toLowerCase().endsWith(".xml") )
        {
            props.storeToXML(fout, DEF_COMMENTS);
        }else{
            props.store(fout, DEF_COMMENTS);
        }
        fout.close();
    }

    public static void writeXMLProperties(OutputStream output,Properties props) throws IOException {
        if (output == null)throw new IllegalArgumentException("output==null");
        if (props == null)throw new IllegalArgumentException("props==null");
        props.storeToXML(output, DEF_COMMENTS);
    }

    public static void writeProperties(OutputStream output,Properties props) throws IOException {
        if (output == null)throw new IllegalArgumentException("output==null");
        if (props == null)throw new IllegalArgumentException("props==null");
        props.store(output, DEF_COMMENTS);
    }

    public static void writeProperties(Writer output,Properties props) throws IOException {
        if (output == null)throw new IllegalArgumentException("output==null");
        if (props == null)throw new IllegalArgumentException("props==null");
        props.store(output, DEF_COMMENTS);
    }

    public static void readPropertiesTo(Object propOwner,String propPrefix,File file) throws IOException {
        if( propOwner==null )throw new IllegalArgumentException("propOwner==null");
        if( file==null )throw new IllegalArgumentException("file==null");

        Properties textProperties = readProperties(file);
        Iterable<ValueController> properties = TypesUtil.propertiesOf(propOwner);
        TypesUtil.textMapToValueControllers(
                textProperties, properties, null, null,
                Convertors.concatBefore(propPrefix),
                null);
    }

    public static void writePropertiesTo(File file,Object propOwner,String propPrefix) throws IOException {
        if( propOwner==null )throw new IllegalArgumentException("propOwner==null");
        if( file==null )throw new IllegalArgumentException("file==null");

        Iterable<ValueController> properties = TypesUtil.propertiesOf(propOwner);
        Properties p = new Properties();
        TypesUtil.valueControllersToTextMap(
                properties, p, null,
                Convertors.concatBefore(propPrefix),
                null,
                null);
        writeProperties(file, p);
    }
}
TOP

Related Classes of org.gocha.files.FileUtil$FileWriteStreamClousre

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.