To jest kod, którego próbowałem.

Files.deleteIfExists(Paths.get("NewFile.txt"));
URL smallURL = new URL(url);

Files.copy(smallURL.openStream(), Paths.get("NewFile.txt"));
System.out.println(Files.size(Paths.get("NewFile.txt")));

Działa dobrze, jeśli mam adres URL zawierający mniej niż określoną liczbę znaków, ale kiedy próbuję go użyć z linkiem do adresu URL zawierającego 150 000 znaków, kopiuje on tylko około 65 000 znaków do pliku „NewFile.txt”.

Czy istnieje limit liczby znaków, które możesz nakarmić .openStream? Jak mogę to obejść?

Edycja: przyjrzałem się dokładnie znakom, w których przestaje dodawać do pliku i nie mogłem zauważyć w nich nic wyjątkowego. Wzór w tym miejscu prawie na pewno już wystąpił i nie wystąpił żaden błąd.

-1
Void 19 grudzień 2019, 20:52
Czy zamknąłeś InputStream na końcu?
 – 
William
19 grudzień 2019, 21:09
Ja nie. Nie jestem też pewien, jak, gdy nie mam obiektu strumienia wejściowego.
 – 
Void
19 grudzień 2019, 21:14
Spójrz na moją odpowiedź: stackoverflow.com/a/59414975/9710708
 – 
William
19 grudzień 2019, 21:18
Właśnie pomyślałem, że może to być wynikiem ograniczenia szybkości strony internetowej lub czegoś w tym rodzaju?
 – 
Void
19 grudzień 2019, 21:28
Nie sądzę, czy mogę uzyskać adres URL?
 – 
William
19 grudzień 2019, 21:34

2 odpowiedzi

Nie, nie ma takiego ograniczenia w InputStream. (jak sama nazwa wskazuje, jest to interfejs API przesyłania strumieniowego, odczytuje dane w sposób strumieniowy)

URL url = new URL("https://en.wikipedia.org/wiki/Microsoft");
Files.copy(url.openStream(), Paths.get("NewFile.txt"));
System.out.println(Files.size(Paths.get("NewFile.txt")));

To drukuje - 547055

Podejrzewam, że coś może być dziwne z treścią, którą masz w adresie URL, którego używasz, sprawdź to.

0
Janardhan 19 grudzień 2019, 21:05
Jeśli nie zignoruję żadnych zgłoszonych wyjątków, otrzymuję wyjątek Premature EOF z mojego problemowego adresu URL. Być może jakaś część tego adresu URL daje fałszywy alarm, że plik jest gotowy. Nie jestem pewien, jak zidentyfikować konkretną przyczynę tego.
 – 
Void
19 grudzień 2019, 21:10

Musisz zamknąć InputStream URLConnection:

Files.deleteIfExists(Paths.get("NewFile.txt"));
URL smallURL = new URL(url);
InputStream is = smallURL.openStream();
Files.copy(is, Paths.get("NewFile.txt"));
System.out.println(Files.size(Paths.get("NewFile.txt")));
is.close();
0
William 19 grudzień 2019, 21:16
Dobra, próbowałem tego i wciąż mam tylko połowę postaci.
 – 
Void
19 grudzień 2019, 21:26