После Java 7 отличный способ настроить средства ведения журнала, которым требуются (или предпочитать) статические ссылки на включающий класс, - это использовать недавно представленный API-интерфейс MethodHandles, чтобы получить класс времени выполнения в статическом контексте.
Пример фрагмента для SLF4J:
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
Помимо того, что он является простым фрагментом в любой среде IDE, он также менее хрупок, если вы переделываете определенные функции в другой класс, потому что вы не будете случайно переносить имя класса с ним.
Если вы используете WebClient.DownloadFile , вы можете сохранить его прямо в файл.
Класс WebClient предназначен для упрощенных сценариев. Как только вы пройдете простые сценарии (а у вас есть), вам придется немного отступить и использовать WebRequest.
С помощью WebRequest у вас будет доступ к потоку ответов, и вы сможете зацикливаться его, немного читая и немного записывая, пока не закончите.
Пример:
public void MyDownloadFile(Uri url, string outputFilePath)
{
const int BUFFER_SIZE = 16 * 1024;
using (var outputFileStream = File.Create(outputFilePath, BUFFER_SIZE))
{
var req = WebRequest.Create(url);
using (var response = req.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
var buffer = new byte[BUFFER_SIZE];
int bytesRead;
do
{
bytesRead = responseStream.Read(buffer, 0, BUFFER_SIZE);
outputFileStream.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);
}
}
}
}
Обратите внимание, что если WebClient.DownloadFile работает, я бы назвал его лучшим решением. Я написал это до того, как был опубликован ответ «DownloadFile». Я также написал это слишком рано утром, так что может потребоваться скепсис (и тестирование).
Вам нужно получить поток ответа, а затем читать его блоками, записывая каждый блок в файл, чтобы можно было повторно использовать память.
Как вы написали, весь ответ, все 2 ГБ, должно быть в памяти. Даже в 64-битной системе, которая достигает предела в 2 ГБ для одного объекта .NET.
Обновление: более простой вариант. Получите WebClient
, который сделает всю работу за вас: с его методом DownloadFile
, который помещает данные прямо в файл.