Проблема довольно проста. Вы звоните close
на BufferedWriter
.
else {
r.write(message);
r.newLine();
}
r.close();
Javadoc для BufferedWriter#close
состояний
Закрывает поток, сбрасывая его первым. Как только поток будет закрыт, дальнейшие вызовы write () или flush () вызовут IOException .
blockquote>
Вы также пишете в один и тот же файл, используя два разных объекта. Я рекомендую вам придерживаться одного и угробить другого.
Это то, что вы пытаетесь сделать?
Джон Скит ответил на это на другом сайте
По сути, вы хотите
(слева)
(original << bits) | (original >> (32 - bits))
или
(справа)
(original >> bits) | (original << (32 - bits))
Кроме того, как уже говорил Мехрдад, это работает только для uint, что является примером, который также приводит Джон.
Наивная версия переключения не будет работать. Причина в том, что смещенные вправо числа со знаком заполнят левые биты знаковым битом , а не 0 :
Этот факт можно проверить с помощью:
Console.WriteLine(-1 >> 1);
Правильный путь:
public static int RotateLeft(this int value, int count)
{
uint val = (uint)value;
return (int)((val << count) | (val >> (32 - count)));
}
public static int RotateRight(this int value, int count)
{
uint val = (uint)value;
return (int)((value >> count) | (value << (32 - count)));
}
В C # нет встроенной функции языка для ротации битов, но эти методы расширения должны выполнять свою работу:
public static uint RotateLeft(this uint value, int count)
{
return (value << count) | (value >> (32 - count))
}
public static uint RotateRight(this uint value, int count)
{
return (value >> count) | (value << (32 - count))
}
Примечание: Как указывает Мерадад, сдвиг вправо ( >>
) для целых чисел со знаком - особенность: он заполняет MSB знаковым битом, а не 0, как для чисел без знака. Вместо этого я изменил методы для взятия и возврата uint
(32-разрядное целое число без знака) - это также в большей степени соответствует C ++ rotl
и rotr
функции. Если вы хотите повернуть целые числа, просто введите их перед передачей и снова приведите возвращаемое значение, конечно.
Пример использования:
int foo1 = 8.RotateRight(3); // foo1 = 1
int foo2 = int.MinValue.RotateLeft(3); // foo2 = 4
(Обратите внимание, что int.MinValue
равно 111111111111111111111111 - 32 1s в двоичный файл.)