Monthly Archives: Ноябрь 2013

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

Метод считывает все строки из переданного файла, добавляет их в List<String> и возвращает этот List

public static List<String> getStringList(String fileName) throws IOException{
	BufferedReader br = null;
	List<String> list = new ArrayList<String>();
	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<String> getFileLines(String fileName) throws IOException {
	List<String> list = new ArrayList<String>();
	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<String> 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

Скорее всего, где то в настройках еще нужно переписать путь.
Как в следующий раз появиться возможность произвести подобный перенос, разберусь с этой проблемной. А экспериментировать с боевым сервером не комильфо.