Monthly Archives: Ноябрь 2013

FileUtils — Сборка методов по работе с файлами

Метод считывает все строки из переданного файла, добавляет их в List<String> и возвращает этот List
public static List getStringList(String fileName) throws IOException{
	BufferedReader br = null;
	List list = new ArrayList();
	String str;
	try{
		br = new BufferedReader(new FileReader(fileName));
		while( (str = br.readLine()) != null ){
			list.add(str);
		}
	}finally{
		if(br != null) br.close();
	}
	return list;
}

Получить все строки файла в виде List<String> (чтение в UTF-8)
public static List getFileLines(String fileName) throws IOException {
	List list = new ArrayList();
	BufferedReader br = null;
	try{
		br = new BufferedReader(
				new InputStreamReader(
						new FileInputStream(fileName),"UTF-8"));
		String str;
		while( (str = br.readLine()) != null ){
			list.add(str);
		}
	}finally {
		if(br != null)
			br.close();
	}
	return list;
}

Получение байтов файла по URL
public static byte[] downloadFile(URL url) throws IOException {
	byte[] bytes = null;
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	InputStream is = null;
	try {
		is = url.openStream();
		int ch;
		while( (ch = is.read()) != - 1){
			baos.write((byte)ch);
		}
		baos.flush();
		bytes = baos.toByteArray();
		return bytes;
	} finally {
		baos.close();
		if(is != null)is.close();
	}
}

Запись переданных строк в файл в кодировке UTF-8
public static void writeToFile(String fileName,List lines)
		throws IOException{
	BufferedWriter bw = new BufferedWriter(
		new OutputStreamWriter(new FileOutputStream(fileName),"UTF-8"));
	for(String str : lines){
		bw.append(str).append("\n");
	}
	bw.close();
}

Запись String, StringBuilder, StringBuffer в файл (UTF-8)
public static void writeToFile(String fileName,CharSequence charSequence)
		throws IOException{
	BufferedWriter bw = new BufferedWriter(
		new OutputStreamWriter(
			new FileOutputStream(fileName),"UTF-8"));
	bw.append(charSequence);
	bw.close();
}

Перенос директории с данными MySQL (на примере RedHat)

По умолчанию MySQL хранит файлы базы данных на том же диске, где он установлен, и часто требует перенос этих файлов на другой диск большей вместимости. Допустим, у нас имеется RedHat с установленным MySQL 1) Проверим настройки MySQL, вызовем команду:
cat /etc/my.cnf
Получим примерно следующие данные:
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_allowed_packet = 500M
default-storage-engine=innodb
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
В файле конфигурации параметр datadir указывает на место хранения файлов базы данных. В нашем случае он указывает на /var/lib/mysql 2) Для проведения переноса данных, первым делом, нужно остановить MySQL.
service mysqld stop
3) Определимся с целевой директорией, куда будет осуществлен перенос. Допустим, мы хотим перенести директорию mysql в директорию /600g
У меня фантазии не хватило - я назвал диск по его размеру.
Пример из жизни: на одном сервере диск в 600 гигабайт я назвал /600g, 
на другом диск в 3 терабайта - назвал /3t
Создадим директорию:
mkdir /600g
4) Теперь скопируем саму папку с содержимым с помощью команды:
cp -R -p /var/lib/mysql /600g
Где cp - стандартная команда для копирования. Стоит обратить внимание на ее параметры: -R - говорит о том, что нужно копировать директорию рекурсивно (включая поддиректории и файлы в поддиректориях) -p - копирование с сохранением всех прав доступа и разрешений /var/lib/mysql - здесь указывается переносимая директория /600g - место, куда будет перенесена директория После переноса директории mysql в /600g, мы получим следующий путь:
/600g/mysql
5) Осталось изменить конфигурацию:
nano /etc/my.cnf
Замените строки, указав на новый путь размещения директории:
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
на следующие:
datadir=/600g/mysql
socket=/600g/mysql/mysql.sock
6) К сожалению, это не все. Нужно еще заменить пути в файле демона: /etc/init.d/mysqld 7) Запускаем MySQL
service mysqld start
8) После переноса появиться еще одна проблема, и пока не знаю как ее исправить. Если у вас на этом же сервере есть клиент MySQL и вы могли его раньше запускать следующим образом:
mysql -uroot -p
То сейчас нужно еще будет явно указывать расположение файла сокета:
mysql -uroot -p --socket=/600g/mysql/mysql.sock
Скорее всего, где то в настройках еще нужно переписать путь. Как в следующий раз появиться возможность произвести подобный перенос, разберусь с этой проблемной. А экспериментировать с боевым сервером не комильфо.