09-16 01:29:54.347: DEBUG/dalvikvm(282): GC_FOR_MALLOC freed 5009 objects / 325248 bytes in 87ms 09-16 01:30:56.467: DEBUG/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol
你这个是mars老师视频里面的代码吧
你把这个write2SDFromInput方法修改一下 public byte[] readStream(InputStream input) throws Exception { ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = input.read(buffer)) != -1) { output.write(buffer, 0, len); } input.close(); output.close(); return output.toByteArray(); } public void getMp3()throws Exception{ String urlPath = "http://www.im.ntu.edu.tw/~b97006/01.mp3"; URL url = new URL(urlPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();//返回一个连接对象 conn.setRequestMethod("GET");//设置请求方式 conn.setConnectTimeout(6*1000);//设置连接超时,这里可以不用设置,但是在android应用中应该设置超时时间 if (conn.getResponseCode()==200) { InputStream input = conn.getInputStream(); byte[] data = readStream(input); File file = new File("/home/lgh/1233.mp3"); file.createNewFile(); FileOutputStream output = new FileOutputStream(file); output.write(data); output.close(); } }试试看,可以的!
File file = new File("/home/lgh/1233.mp3"); file.createNewFile(); 这里的文件目录你自己修改下
果然给力 谢谢啦 可我还是不知道这是为什么? 为何这样子读取: ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = input.read(buffer)) != -1) { output.write(buffer, 0, len); } input.close(); output.close(); return output.toByteArray(); 就可以了 而: byte buffer[]=new byte[4*1024]; while((input.read(buffer))!=-1){ output.write(buffer); }却不行
public File write2SDFromInput(String path,String fileName,InputStream input)
{
File file=null;
OutputStream output=null;
try{
this.creatSDDir(path);
file=this.creatSDFile(path+fileName);
output=new FileOutputStream(file);
byte buffer[]=new byte[4*1024];
while((input.read(buffer))!=-1){
output.write(buffer);
}
output.flush();
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
output.close();
}
catch(Exception e){
e.printStackTrace();
}
}
return file;
}
09-16 01:30:56.467: DEBUG/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = input.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
input.close();
output.close();
return output.toByteArray();
}
public void getMp3()throws Exception{ String urlPath = "http://www.im.ntu.edu.tw/~b97006/01.mp3";
URL url = new URL(urlPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();//返回一个连接对象
conn.setRequestMethod("GET");//设置请求方式
conn.setConnectTimeout(6*1000);//设置连接超时,这里可以不用设置,但是在android应用中应该设置超时时间
if (conn.getResponseCode()==200) {
InputStream input = conn.getInputStream();
byte[] data = readStream(input);
File file = new File("/home/lgh/1233.mp3");
file.createNewFile();
FileOutputStream output = new FileOutputStream(file);
output.write(data);
output.close();
}
}试试看,可以的!
file.createNewFile();
这里的文件目录你自己修改下
为何这样子读取:
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = input.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
input.close();
output.close();
return output.toByteArray();
就可以了
而:
byte buffer[]=new byte[4*1024];
while((input.read(buffer))!=-1){
output.write(buffer);
}却不行
当你同时下载多个文件的时候 就会出现09-16 14:11:24.469: ERROR/AndroidRuntime(315): java.lang.OutOfMemoryError
的异常 即内存不够用了
我懂了 其实 就是:output.write(buffer);和output.write(buffer,0,temp);的区别
的差别,这两种方式定义了单位读的字节取么,前者是1K,后者是4K 么?谢谢