Привет, я написал код для загрузки файла и поместил его на рабочий стол.
но всякий раз, когда он начинает загружаться, он просто остается в 0 байтах, почему?
здесь мой код:
private void addToDesktop() throws IOException {
URL url = new URL("theurl");
URLConnection connection = url.openConnection();
InputStream inputstream = connection.getInputStream();
FileSystemView filesys = FileSystemView.getFileSystemView();
filesys.getHomeDirectory();
BufferedOutputStream bufferedoutputstream = new BufferedOutputStream(new FileOutputStream(new File(filesys.getHomeDirectory() + "/client2.jar")));
byte[] buffer = new byte[1024];
int bytesRead = 0;
while(bytesRead == inputstream.read(buffer))
{
bufferedoutputstream.write(buffer, 0 ,1000);
}
bufferedoutputstream.flush();
bufferedoutputstream.close();
inputstream.close();
}
Согласно JavaDoc, read(byte[] buffer)
возвращает количество прочитанных байтов. Если больше нет байтов для чтения, возвращается -1.
Кажется, что проблема здесь: while(bytesRead == inputstream.read(buffer))
. Так как bytesRead
будет иметь значение 0, то метод .read
даст 1024. Изменение его на что-то вроде этого должно работать: while(inputstream.read(buffer) != -1)
У тебя есть:
int bytesRead = 0;
while(bytesRead == inputstream.read(buffer))
{
...
}
Это эквивалентно:
while(0 == inputstream.read(buffer))
{
...
}
Это условие будет вообще ложным, и цикл никогда не будет выполняться. Вы, вероятно, имели в виду нечто большее:
int bytesRead;
while((bytesRead = inputstream.read(buffer)) > 0)
{
...
}
Мораль здесь: Mind your =
vs. ==
в этих типах утверждений.
Кстати: вы пишете 1000 байтов в выходной файл каждый раз через цикл, независимо от того, сколько байтов было прочитано. Вы просто хотите писать то, что было прочитано (иногда read()
может не читать полный буфер, особенно в конце файла, если буфер больше остальных данных). Вы хотите сделать это вместо этого:
while((bytesRead = inputstream.read(buffer)) > 0)
{
bufferedoutputstream.write(buffer, 0, bytesRead);
}