/*******************************************************************************
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.files.CopyTask.Event;
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);
}
}
// public static CopyTask copy(URL from,File to,boolean append, long sizeToCopy,int blockSize){
// if (from== null)throw new IllegalArgumentException("from==null");
// if (to== null)throw new IllegalArgumentException("to==null");
// if (blockSize<1)throw new IllegalArgumentException("blockSize<1");
//
// final URL ffrom = from;
// final File fto = to;
// final long s2copy = sizeToCopy;
// final int bs = blockSize;
// final boolean appnd = append;
//
// return new CopyTask() {
// @Override
// public void run() {
// this.currentSize = 0;
// this.done = false;
// this.exception = null;
// this.maxSize = s2copy;
//
// this.fireBegin(ffrom, fto);
// try {
// FileOutputStream fout = new FileOutputStream(fto,appnd);
// CopyTask ct = FileUtil.copy(ffrom,fout,s2copy,bs);
// final CopyTask me = this;
// ct.addListener(new Adapter()
// {
// @Override
// protected void progressCopy(CopyTask task) {
// me.currentSize = task.getCurrentSize();
// fireProgress(ffrom, fto);
// }
// });
// ct.run();
// fout.close();
// } catch (IOException ex) {
// this.exception = ex;
// }
// this.fireEnd(ffrom, fto);
// }
// };
// }
public static CopyTask copy(InputStream from, File to, boolean append, long sizeToCopy,int blockSize){
if (from== null)throw new IllegalArgumentException("from==null");
if (to== null)throw new IllegalArgumentException("to==null");
if (blockSize<1)throw new IllegalArgumentException("blockSize<1");
final InputStream ffrom = from;
final File fto = to;
final long s2copy = sizeToCopy;
final int bs = blockSize;
final boolean appnd = append;
return new CopyTask() {
@Override
public void run() {
this.currentSize = 0;
this.done = false;
this.exception = null;
this.maxSize = s2copy;
this.fireBegin(ffrom, fto);
try {
FileOutputStream fout = new FileOutputStream(fto,appnd);
CopyTask ct = FileUtil.copy(ffrom,fout,s2copy,bs);
final CopyTask me = this;
ct.addListener(new Adapter()
{
@Override
protected void progressCopy(CopyTask task) {
me.currentSize = task.getCurrentSize();
fireProgress(ffrom, fto);
}
});
ct.run();
fout.close();
} catch (IOException ex) {
this.exception = ex;
}
this.fireEnd(ffrom, fto);
}
};
}
/**
* Копирование символьного потока
* @param from Откуда копировать
* @param to Куда копировать
* @param sizeToCopy Кол-во копированных данных (в символах) (-1 - все данные из from)
* @param blockSize Размер блока (в символах)
* @return Задача
*/
public static CopyTask copy(Reader from,Writer to,long sizeToCopy,int blockSize){
if (from== null)throw new IllegalArgumentException("from==null");
if (to== null)throw new IllegalArgumentException("to==null");
if (blockSize<1)throw new IllegalArgumentException("blockSize<1");
final Reader fFrom = from;
final Writer fTo = to;
final long s2copy = sizeToCopy;
final int bs = blockSize;
return new CopyTask() {
@Override
public void run() {
char[] buff = new char[bs];
if( s2copy<0 ){
this.currentSize = 0;
this.done = false;
this.exception = null;
this.maxSize = -1;
this.fireBegin(fFrom,fTo);
while( true ){
try {
int rd = fFrom.read(buff);
if( rd<0 )break;
fTo.write(buff,0,rd);
this.currentSize += (long)rd;
this.fireProgress(fFrom,fTo);
} catch (IOException ex) {
// Logger.getLogger(FileUtil.class.getName()).log(Level.SEVERE, null, ex);
this.exception = ex;
break;
}
}
this.fireEnd(fFrom,fTo);
}else{
long tot = 0;
int s2read = 0;
this.currentSize = 0;
this.done = false;
this.exception = null;
this.maxSize = s2copy;
this.fireBegin(fFrom,fTo);
while( tot<s2copy ){
long need = s2copy - tot;
if( need > ((long)bs) ){
s2read = bs;
}else{
s2read = (int)(need);
}
try {
int rd = fFrom.read(buff,0,s2read);
if( rd<0 )break;
fTo.write(buff,0,rd);
tot += (long)rd;
this.currentSize += (long)rd;
this.fireProgress(fFrom,fTo);
} catch (IOException ex) {
// Logger.getLogger(FileUtil.class.getName()).log(Level.SEVERE, null, ex);
this.exception = ex;
break;
}
}
this.fireEnd(fFrom,fTo);
}
}
};
}
/**
* Копирование символьного потока
* @param from Откуда копировать
* @param to Куда копировать
* @param sizeToCopy Кол-во копированных данных (в символах) (-1 - все данные из from)
* @param blockSize Размер блока (в символах)
* @return Задача
*/
public static CopyTask copy(InputStreamReader from, OutputStreamWriter to,long sizeToCopy,int blockSize){
if (from== null)throw new IllegalArgumentException("from==null");
if (to== null)throw new IllegalArgumentException("to==null");
if (blockSize<1)throw new IllegalArgumentException("blockSize<1");
final InputStreamReader fFrom = from;
final OutputStreamWriter fTo = to;
final long s2copy = sizeToCopy;
final int bs = blockSize;
return new CopyTask() {
@Override
public void run() {
char[] buff = new char[bs];
if( s2copy<0 ){
this.currentSize = 0;
this.done = false;
this.exception = null;
this.maxSize = -1;
this.fireBegin(fFrom,fTo);
while( true ){
try {
int rd = fFrom.read(buff);
if( rd<0 )break;
fTo.write(buff,0,rd);
this.currentSize += (long)rd;
this.fireProgress(fFrom,fTo);
} catch (IOException ex) {
// Logger.getLogger(FileUtil.class.getName()).log(Level.SEVERE, null, ex);
this.exception = ex;
break;
}
}
this.fireEnd(fFrom,fTo);
}else{
long tot = 0;
int s2read = 0;
this.currentSize = 0;
this.done = false;
this.exception = null;
this.maxSize = s2copy;
this.fireBegin(fFrom,fTo);
while( tot<s2copy ){
long need = s2copy - tot;
if( need > ((long)bs) ){
s2read = bs;
}else{
s2read = (int)(need);
}
try {
int rd = fFrom.read(buff,0,s2read);
if( rd<0 )break;
fTo.write(buff,0,rd);
tot += (long)rd;
this.currentSize += (long)rd;
this.fireProgress(fFrom,fTo);
} catch (IOException ex) {
// Logger.getLogger(FileUtil.class.getName()).log(Level.SEVERE, null, ex);
this.exception = ex;
break;
}
}
this.fireEnd(fFrom,fTo);
}
}
};
}
/**
* Копирование байтового потока
* @param from Откуда копировать
* @param to Куда копировать
* @param sizeToCopy Кол-во копированных данных в байтах (-1 - все данные из from)
* @param blockSize Размер блока в байтах
* @return Задача
*/
public static CopyTask copy(InputStream from,OutputStream to,long sizeToCopy,int blockSize)
{
if (from== null) throw new IllegalArgumentException("from==null");
if (to== null) throw new IllegalArgumentException("to==null");
if (blockSize<1) throw new IllegalArgumentException("blockSize<1");
final InputStream fFrom = from;
final OutputStream fTo = to;
final long s2copy = sizeToCopy;
final int bs = blockSize;
return new CopyTask() {
@Override
public void run() {
byte[] buff = new byte[bs];
if( s2copy<0 ){
this.currentSize = 0;
this.done = false;
this.exception = null;
this.maxSize = -1;
this.fireBegin(fFrom,fTo);
while( true ){
try {
int rd = fFrom.read(buff);
if( rd<0 )break;
fTo.write(buff,0,rd);
this.currentSize += (long)rd;
this.fireProgress(fFrom,fTo);
} catch (IOException ex) {
// Logger.getLogger(FileUtil.class.getName()).log(Level.SEVERE, null, ex);
this.exception = ex;
break;
}
}
this.fireEnd(fFrom,fTo);
}else{
this.currentSize = 0;
this.done = false;
this.exception = null;
this.maxSize = s2copy;
this.fireBegin(fFrom,fTo);
long tot = 0;
int s2read = 0;
while( tot<s2copy ){
long need = s2copy - tot;
if( need > ((long)bs) ){
s2read = bs;
}else{
s2read = (int)(need);
}
try {
int rd = fFrom.read(buff,0,s2read);
if( rd<0 )break;
fTo.write(buff,0,rd);
tot += (long)rd;
this.currentSize += (long)rd;
this.fireProgress(fFrom,fTo);
} catch (IOException ex) {
// Logger.getLogger(FileUtil.class.getName()).log(Level.SEVERE, null, ex);
this.exception = ex;
break;
}
}
this.fireEnd(fFrom,fTo);
}
}
};
}
/**
* Читает из входного потока все байты и возвращает как массив
* @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());
}
/**
* Считывает текстовую карту (ключ/значение) из потока байтов.
* Используется формат файла .properties в кодировке utf8.
* @param inputStream Поток байтов
* @return Текстовая карта (ключ/значение)
* @throws IOException Ошибка IO
*/
public static Properties readProperties(InputStream inputStream) throws IOException{
if (inputStream== null)
throw new IllegalArgumentException("inputStream==null");
Properties p = new Properties();
Reader reader = new InputStreamReader(inputStream, UTF8());
p.load(reader);
return p;
}
/**
* Считывает текстовую карту (ключ/значение) из потока байтов в указанной кодировке.
* Используется формат файла .properties.
* @param inputStream Поток байтов
* @param cs Кодировка (если не указана, то используется UTF-8)
* @return Текстовая карта (ключ/значение)
* @throws IOException Ошибка IO
*/
public static Properties readProperties(InputStream inputStream,Charset cs) throws IOException{
if (inputStream== null)
throw new IllegalArgumentException("inputStream==null");
if( cs==null )cs = UTF8();
Properties p = new Properties();
Reader reader = new InputStreamReader(inputStream, cs);
p.load(reader);
return p;
}
/**
* Считывает текстовую карту (ключ/значение) из потока символов.
* Используется формат файла .properties.
* @param reader Поток символов
* @return Текстовая карта (ключ/значение)
* @throws IOException Ошибка IO
*/
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;
}
/**
* Считывает текстовую карту (ключ/значение) из потока байтов.
* Используется формат XML:<br/>
* <pre>
* <?xml version="1.0" encoding="UTF-8"?>
* <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
* <properties>
* <comment> <i>Комментарии не обязательны</i> </comment>
* <entry key="<i>Ключ</i>"> <i>Значение</i> </entry>
* </properties>
* </pre>
* @param inputStream Поток байтов
* @return Текстовая карта (ключ/значение)
* @throws IOException Ошибка IO
*/
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;
}
/**
* Считывает текстовую карту (ключ/значение) из файла.
* В зависимости от расширения файла (.xml) читает ее либо как XML, либо как properties файл.
* Для properties использует указанную кодировку
* @param file Файл
* @param cs Кодировка (может быть null)
* @return Текстовая карта (ключ/значение)
* @throws IOException Ошибка IO
* @see #readXMLProperties(java.io.InputStream)
* @see #readProperties(java.io.InputStream, java.nio.charset.Charset)
*/
public static Properties readProperties(File file,Charset cs) 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,cs);
fin.close();
return p;
}
/**
* Считывает текстовую карту (ключ/значение) из файла.
* В зависимости от расширения файла (.xml) читает ее либо как XML, либо как properties файл.
* Для properties использует указанную кодировку по умолчанию
* @param file Файл
* @return Текстовая карта (ключ/значение)
* @throws IOException Ошибка IO
* @see #readXMLProperties(java.io.InputStream)
* @see #readProperties(java.io.InputStream, java.nio.charset.Charset)
*/
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";
/**
* Записывает текстовую карту (ключ/значение) в файл.
* В зависимости от расширения (.xml/.properties) будет выбран соот. формат.
* Для .properties будет использоваться кодировка UTF-8
* @param file Файл
* @param props Записываемое значение
* @throws IOException Ошибка IO
* @see #readProperties(java.io.File)
*/
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{
Writer w = new OutputStreamWriter(fout,UTF8());
props.store(w, DEF_COMMENTS);
w.flush();
}
fout.close();
}
/**
* Записывает текстовую карту (ключ/значение) в поток, используя формат XML.
* @param output Поток байтов
* @param props Текстовая карта (ключ/значение)
* @throws IOException Ошибка IO.
* @see #readXMLProperties(java.io.InputStream)
*/
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);
}
/**
* Записывает текстовую карту (ключ/значение) в поток используя формат properties
* @param output Поток
* @param props Текстовая карта (ключ/значение)
* @throws IOException Ошибка IO.
*/
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);
}
/**
* Записывает текстовую карту (ключ/значение) в поток используя формат properties
* @param output Поток
* @param props Текстовая карта (ключ/значение)
* @throws IOException Ошибка IO.
*/
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.Iterators.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.Iterators.propertiesOf(propOwner);
Properties p = new Properties();
TypesUtil.valueControllersToTextMap(
properties, p, null,
Convertors.concatBefore(propPrefix),
null,
null);
writeProperties(file, p);
}
}