Android的下载二进制文件的问题
-
05-09-2019 - |
题
我在下载中从互联网上我的应用程序二进制文件(视频)的问题。在QuickTime,如果我直接下载它,它工作正常,但通过我的应用程序以某种方式得到它的搞砸了(尽管它们看起来在文本编辑器相同)。这里是一个例子:
URL u = new URL("http://www.path.to/a.mp4?video");
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
FileOutputStream f = new FileOutputStream(new File(root,"Video.mp4"));
InputStream in = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
while ( (len1 = in.read(buffer)) > 0 ) {
f.write(buffer);
}
f.close();
解决方案
我不知道这是否是唯一的问题,但你已经有了一个经典的Java毛刺在那里:你不是对阅读(事实上算起)是的总是的允许返回更少的字节比你问。因此,你读能拿小于1024个字节,但你写始终写出正是1024个字节可能包括从以前的循环迭代字节。
纠正:
while ( (len1 = in.read(buffer)) > 0 ) {
f.write(buffer,0, len1);
}
也许更高的延迟网络或3G的Android上较小的分组大小正在加剧的效果?
其他提示
new DefaultHttpClient().execute(new HttpGet("http://www.path.to/a.mp4?video"))
.getEntity().writeTo(
new FileOutputStream(new File(root,"Video.mp4")));
的一个问题是你的缓冲器的读取。如果输入流中的每个读取不是1024的整数倍,你会复制错误的数据。使用:
byte[] buffer = new byte[1024];
int len1 = 0;
while ( (len1 = in.read(buffer)) != -1 ) {
f.write(buffer,0, len1);
}
public class download extends Activity {
private static String fileName = "file.3gp";
private static final String MY_URL = "Your download url goes here";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
URL url = new URL(MY_URL);
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
String PATH = Environment.getExternalStorageDirectory()
+ "/download/";
Log.d("Abhan", "PATH: " + PATH);
File file = new File(PATH);
if(!file.exists()) {
file.mkdirs();
}
File outputFile = new File(file, fileName);
FileOutputStream fos = new FileOutputStream(outputFile);
InputStream is = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
while ((len1 = is.read(buffer)) != -1) {
fos.write(buffer, 0, len1);
}
fos.flush();
fos.close();
is.close();
} catch (IOException e) {
Log.e("Abhan", "Error: " + e);
}
Log.i("Abhan", "Check Your File.");
}
}
我固定基于在此线程前面的反馈的代码。我测试使用Eclipse和多个大型文件。这是工作的罚款。只需要复制并粘贴到你的环境,改变HTTP路径和您希望该文件的位置被下载到。
try {
//this is the file you want to download from the remote server
String path ="http://localhost:8080/somefile.zip";
//this is the name of the local file you will create
String targetFileName
boolean eof = false;
URL u = new URL(path);
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
FileOutputStream f = new FileOutputStream(new File("c:\\junk\\"+targetFileName));
InputStream in = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
while ( (len1 = in.read(buffer)) > 0 ) {
f.write(buffer,0, len1);
}
f.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
好运 阿里Aghamohammadi
只需使用Apache的复制方法(阿帕奇百科全书IO ) - 用Java的优点!
IOUtils.copy(is, os);
不要忘记关闭流在最后块:
try{
...
} finally {
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}
不隶属于 StackOverflow