Poniższy fragment kodu pobiera plik z jakiegoś adresu URL i zapisuje go w pliku lokalnym. Bułka z masłem. Cóż może być tutaj nie tak?Kto manipuluje moim strumieniem danych?
protected long download(ProgressMonitor montitor) throws Exception{
long size = 0;
DataInputStream dis = new DataInputStream(is);
int read = 0;
byte[] chunk = new byte[chunkSize];
while((read = dis.read(chunk)) != -1){
os.write(chunk, 0, read);
size += read;
if(montitor != null)
montitor.worked(read);
}
chunk = null;
dis.close();
os.flush();
os.close();
return size;
}
Powodem jestem delegowania pytanie o to, ponieważ działa w 99,999% czasu i nie działa zgodnie z oczekiwaniami, gdy istnieje antywirusowego lub innego oprogramowania do ochrony zainstalowany na komputerze z systemem tego kodu. Ślepo wskazuję palcem w ten sposób, ponieważ za każdym razem, gdy go zatrzymuję (lub wyłączam), kod znów działa idealnie. Końcowym rezultatem takich zakłóceń jest to, że MD5 pobranego pliku nie pasuje do oczekiwanego i rozpoczyna się zupełnie nowa saga.
Pytanie brzmi - czy naprawdę możliwe jest, że jakiś inteligentny program "ochronny" zmieniłby rzeczywisty strumień pochodzący z adresu URL bez mojej wiedzy o tym? A jeśli tak - jak sobie z tym poradzić? (zweryfikowany przy użyciu produktów Kasperksy i Norton).
EDIT-1: Widocznie mam trzymać na ten problem i nie ma to nic wspólnego z programów antywirusowych. Pobieranie odbywa się z serwera FTP (w szczególności FileZilla) i używamy ftp Apache po stronie klienta. To, co zrobiłem, trafiło na serwer FTP i zakończyło połączenie (wyrzucono) w połowie pobierania. Spodziewałem się, że is.read (..) rzuciłoby wyjątek IOException po stronie klienta, ale tak się nie stało. Zamiast tego is.read (..) zwraca -1, co oznacza, że nie ma więcej danych pochodzących ze strumienia. Jest to zdecydowanie nieoczekiwane i wyjaśnia, dlaczego czasami otrzymuję częściowe pliki. Nie wyjaśnia to jednak, dlaczego czasami dane również ulegają zmianie.
Określ "barfy". – EJP
Jak radzisz sobie z wyjątkami? Jeśli 'dis.close()' zgłasza wyjątek, strumień wyjściowy nie zostanie poprawnie zamknięty na przykład. – dacwe
@dacwe - cokolwiek wyrzucono z tej metody jest niepowodzeniem, wszystko zostaje przerwane. Tajemnicą jest to, że nic nie zostaje rzucone, wszystko jest ładowane. Problem polega na tym, że nie są to dane, których się spodziewam, przez większość czasu są przecinane na pół, czasem zmienione. – Dima