求Tue最近几年各种门事件种子合集集

求2013年3月里番合集种子
求2013年3月里番合集种子
已发 请注意查收 满意请采纳 悬赏一给出就不能再回收 你自己也不能再使用鄙视拿了种子就走人如果真的有用 请采纳成满意答案 给分所有所发资源来源于互联网 并非本人发布
相关知识等待您来回答
动漫领域专家
& &SOGOU - 京ICP证050897号TUE种子集合_百度知道
TUE种子集合
楼主给多点分,我将的都给你
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁6687人阅读
Android网络编程 --断点续传下载文件
日 2月最后一天
前言:关于断点续传下载文件,这个我好几个月之前面试的时候就遇到过,那时我确实迷惑了一下,Android开发分两种,一种是界面开发,一种是研发应用型,面试官问过我属于哪一种,我记得那次面试对我打击很大,因为它证明了我对Android还不够熟悉,水平还不到家,反正感觉被面试官鄙视了。不过到现在我已经不那么想了,不管是界面开发还是研发应用,靠的都是动手能力,能做出东西人才是有用之人,面试主要看你对技术有没有概念,实际开发中谁管你会不会那个技术,反正你给我把效果做出来就行了,做不出东西就给我滚蛋,所以经验对应届生来说是一大诟病,所以建议在大学的雏鸟们多动手做点东西出来,而不是死磕大学那些无用的课程。
废话多了一点,下面我就来介绍本篇博客的技术要点:
HTTP协议,我想上过计算机网络课程的童鞋肯定不陌生,但是谁又能说自己能把它实际运用上了,只有在实际项目开发的时候才会用到。Http算是Android网络中最常用到的网络协议了,客户端通过http通信与服务器进行数据交互,GET方法和POST方法想必是再熟悉不过了,本篇博客介绍一个比较实用的技术,断点续传下载,光看这个名字就感觉挺高大上,确实是,想实现它需要对http协议有一定的了解,并且对多线程机制比较熟悉,还有就是Android中异步更新UI的原理不能让程序出现卡顿的现象。
在说http断点续传之前需要重点了解http协议头部的Range字段
   用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:
   Range:(unit=first byte pos)-[last byte pos]&
比如你要请求下载一个MP3文件,url为:/music/光辉岁月.mp3
你需要通过http发送get请求,请求头字段可能如下
GET /music/%E5%85%89%E8%BE%89%E5%B2%81%E6%9C%88.mp3 HTTP/1.1
Connection: keep-alive
Accept-Encoding:q=1, *;q=0
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.16 50.63 Safari/537.36
Accept: */*
Referer: /music/%E5%85%89%E8%BE%89%E5%B2%81%E6%9C%88.mp3
Accept-Language: zh-CN,q=0.8,q=0.6
Range: bytes=0-// 请求内容字节范围
如果直接请求的话,自然字节从0开始了。
响应头部字段:
HTTP/1.1 206 Partial Content
Date: Tue, 25 Feb :26 GMT
Server: Apache/2.4.3 (Unix) OpenSSL/1.0.1c PHP/5.4.7
Last-Modified: Sun, 23 Feb :00 GMT
ETag: &49aa24-4f&
Accept-Ranges: bytes
Content-Length: 4827684// 这个表示文件大小
Content-Range: bytes 0-7684// 文件字节范围
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: audio/mpeg
关于其他字段的含义,我在这里就不解释了,自己动手查去,哪个不懂就查哪个。上面很直观的展示了请求很响应的内容。
那么断点续传的原理就是通过http请求你想下载内容的字节范围,假如之前已经下载了一部分,但你有事需要暂停下载,那么下次下载的时候你接着后面继续下载就可以了。
但再实际开发中,可能需要下载比较大的文件,并且不能下载太久,这时候我们需要利用多线程来分段下载我们需要的内容。下面是在Android平台下实现的多线程断点续传下载:
,源码已经给你们准备好了。
代码中注释已经很清楚,小巫在这里就多说了。
/MultiThreadDownload/src/com/wwj/download/db/DBOpenHelper.java
数据库帮助类,用于创建保存下载进度的表
package com.wwj.download.
import android.content.C
import android.database.sqlite.SQLiteD
import android.database.sqlite.SQLiteOpenH
public class DBOpenHelper extends SQLiteOpenHelper {
private static final String DBNAME = &eric.db&;
private static final int VERSION = 1;
public DBOpenHelper(Context context) {
super(context, DBNAME, null, VERSION);
public void onCreate(SQLiteDatabase db) {
// 创建filedownlog表
db.execSQL(&CREATE TABLE IF NOT EXISTS filedownlog (id integer primary key autoincrement, downpath varchar(100), threadid INTEGER, downlength INTEGER)&);
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(&DROP TABLE IF EXISTS filedownlog&);
onCreate(db);
/MultiThreadDownload/src/com/wwj/net/download/FileDownloader.java
文件下载器
package com.wwj.net.
import java.io.F
import java.io.RandomAccessF
import java.net.HttpURLC
import java.net.URL;
import java.util.LinkedHashM
import java.util.M
import java.util.UUID;
import java.util.concurrent.ConcurrentHashM
import java.util.regex.M
import java.util.regex.P
import android.content.C
import android.util.L
* 文件下载器
public class FileDownloader {
private static final String TAG = &FileDownloader&;
private FileService fileS
/* 停止下载 */
/* 已下载文件长度 */
private int downloadSize = 0;
/* 原始文件长度 */
private int fileSize = 0;
/* 线程数 */
private DownloadThread[]
/* 本地保存文件 */
private File saveF
/* 缓存各线程下载的长度 */
private Map&Integer, Integer& data = new ConcurrentHashMap&Integer, Integer&();
/* 每条线程下载的长度 */
/* 下载路径 */
private String downloadU
* 获取线程数
public int getThreadSize() {
return threads.
* 退出下载
public void exit() {
this.exit =
public boolean getExit() {
return this.
* 获取文件大小
public int getFileSize() {
return fileS
* 累计已下载大小
* @param size
protected synchronized void append(int size) {
downloadSize +=
* 更新指定线程最后下载的位置
* @param threadId
* @param pos
最后下载的位置
protected synchronized void update(int threadId, int pos) {
this.data.put(threadId, pos);
this.fileService.update(this.downloadUrl, threadId, pos);
* 构建文件下载器
* @param downloadUrl
* @param fileSaveDir
文件保存目录
* @param threadNum
下载线程数
public FileDownloader(Context context, String downloadUrl,
File fileSaveDir, int threadNum) {
this.context =
this.downloadUrl = downloadU
fileService = new FileService(this.context);
URL url = new URL(this.downloadUrl);
if (!fileSaveDir.exists()) // 判断目录是否存在,如果不存在,创建目录
fileSaveDir.mkdirs();
this.threads = new DownloadThread[threadNum];// 实例化线程数组
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod(&GET&);
conn.setRequestProperty(
&image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*&);
conn.setRequestProperty(&Accept-Language&, &zh-CN&);
conn.setRequestProperty(&Referer&, downloadUrl);
conn.setRequestProperty(&Charset&, &UTF-8&);
conn.setRequestProperty(
&User-Agent&,
&Mozilla/4.0 ( MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.; .NET CLR 3.5.30729)&);
conn.setRequestProperty(&Connection&, &Keep-Alive&);
conn.connect(); // 连接
printResponseHeader(conn);
if (conn.getResponseCode() == 200) { // 响应成功
this.fileSize = conn.getContentLength();// 根据响应获取文件大小
if (this.fileSize &= 0)
throw new RuntimeException(&Unkown file size &);
String filename = getFileName(conn);// 获取文件名称
this.saveFile = new File(fileSaveDir, filename);// 构建保存文件
Map&Integer, Integer& logdata = fileService
.getData(downloadUrl);// 获取下载记录
if (logdata.size() & 0) {// 如果存在下载记录
for (Map.Entry&Integer, Integer& entry : logdata.entrySet())
data.put(entry.getKey(), entry.getValue());// 把各条线程已经下载的数据长度放入data中
if (this.data.size() == this.threads.length) {// 下面计算所有线程已经下载的数据总长度
for (int i = 0; i & this.threads. i++) {
this.downloadSize += this.data.get(i + 1);
print(&已经下载的长度& + this.downloadSize);
// 计算每条线程下载的数据长度
this.block = (this.fileSize % this.threads.length) == 0 ? this.fileSize
/ this.threads.length
: this.fileSize / this.threads.length + 1;
throw new RuntimeException(&server no response &);
} catch (Exception e) {
print(e.toString());
throw new RuntimeException(&don't connection this url&);
* 获取文件名
private String getFileName(HttpURLConnection conn) {
String filename = this.downloadUrl.substring(this.downloadUrl
.lastIndexOf('/') + 1);
if (filename == null || &&.equals(filename.trim())) {// 如果获取不到文件名称
for (int i = 0;; i++) {
String mine = conn.getHeaderField(i);
if (mine == null)
if (&content-disposition&.equals(conn.getHeaderFieldKey(i)
.toLowerCase())) {
Matcher m = pile(&.*filename=(.*)&).matcher(
mine.toLowerCase());
if (m.find())
return m.group(1);
filename = UUID.randomUUID() + &.tmp&;// 默认取一个文件名
* 开始下载文件
* @param listener
监听下载数量的变化,如果不需要了解实时下载的数量,可以设置为null
* @return 已下载文件大小
* @throws Exception
public int download(DownloadProgressListener listener) throws Exception {
RandomAccessFile randOut = new RandomAccessFile(this.saveFile, &rw&);
if (this.fileSize & 0)
randOut.setLength(this.fileSize); // 预分配fileSize大小
randOut.close();
URL url = new URL(this.downloadUrl);
if (this.data.size() != this.threads.length) {// 如果原先未曾下载或者原先的下载线程数与现在的线程数不一致
this.data.clear();
for (int i = 0; i & this.threads. i++) {
this.data.put(i + 1, 0);// 初始化每条线程已经下载的数据长度为0
this.downloadSize = 0;
for (int i = 0; i & this.threads. i++) {// 开启线程进行下载
int downLength = this.data.get(i + 1);
if (downLength & this.block
&& this.downloadSize & this.fileSize) {// 判断线程是否已经完成下载,否则继续下载
this.threads[i] = new DownloadThread(this, url,
this.saveFile, this.block, this.data.get(i + 1),
this.threads[i].setPriority(7); // 设置线程优先级
this.threads[i].start();
this.threads[i] =
fileService.delete(this.downloadUrl);// 如果存在下载记录,删除它们,然后重新添加
fileService.save(this.downloadUrl, this.data);
boolean notFinish =// 下载未完成
while (notFinish) {// 循环判断所有线程是否完成下载
Thread.sleep(900);
notFinish =// 假定全部线程下载完成
for (int i = 0; i & this.threads. i++) {
if (this.threads[i] != null && !this.threads[i].isFinish()) {// 如果发现线程未完成下载
notFinish =// 设置标志为下载没有完成
if (this.threads[i].getDownLength() == -1) {// 如果下载失败,再重新下载
this.threads[i] = new DownloadThread(this, url,
this.saveFile, this.block,
this.data.get(i + 1), i + 1);
this.threads[i].setPriority(7);
this.threads[i].start();
if (listener != null)
listener.onDownloadSize(this.downloadSize);// 通知目前已经下载完成的数据长度
if (downloadSize == this.fileSize)
fileService.delete(this.downloadUrl);// 下载完成删除记录
} catch (Exception e) {
print(e.toString());
throw new Exception(&file download error&);
return this.downloadS
* 获取Http响应头字段
* @param http
public static Map&String, String& getHttpResponseHeader(
HttpURLConnection http) {
Map&String, String& header = new LinkedHashMap&String, String&();
for (int i = 0;; i++) {
String mine = http.getHeaderField(i);
if (mine == null)
header.put(http.getHeaderFieldKey(i), mine);
* 打印Http头字段
* @param http
public static void printResponseHeader(HttpURLConnection http) {
Map&String, String& header = getHttpResponseHeader(http);
for (Map.Entry&String, String& entry : header.entrySet()) {
String key = entry.getKey() != null ? entry.getKey() + &:& : &&;
print(key + entry.getValue());
private static void print(String msg) {
Log.i(TAG, msg);
/MultiThreadDownload/src/com/wwj/net/download/FileService.java
package com.wwj.net.
import java.util.HashM
import java.util.M
import android.content.C
import android.database.C
import android.database.sqlite.SQLiteD
import com.wwj.download.db.DBOpenH
* 业务bean
public class FileService {
private DBOpenHelper openH
public FileService(Context context) {
openHelper = new DBOpenHelper(context);
* 获取每条线程已经下载的文件长度
* @param path
public Map&Integer, Integer& getData(String path) {
SQLiteDatabase db = openHelper.getReadableDatabase();
Cursor cursor = db
.rawQuery(
&select threadid, downlength from filedownlog where downpath=?&,
new String[] { path });
Map&Integer, Integer& data = new HashMap&Integer, Integer&();
while (cursor.moveToNext()) {
data.put(cursor.getInt(0), cursor.getInt(1));
cursor.close();
db.close();
* 保存每条线程已经下载的文件长度
* @param path
* @param map
public void save(String path, Map&Integer, Integer& map) {// int threadid,
// int position
SQLiteDatabase db = openHelper.getWritableDatabase();
db.beginTransaction();
for (Map.Entry&Integer, Integer& entry : map.entrySet()) {
db.execSQL(
&insert into filedownlog(downpath, threadid, downlength) values(?,?,?)&,
new Object[] { path, entry.getKey(), entry.getValue() });
db.setTransactionSuccessful();
} finally {
db.endTransaction();
db.close();
* 实时更新每条线程已经下载的文件长度
* @param path
* @param map
public void update(String path, int threadId, int pos) {
SQLiteDatabase db = openHelper.getWritableDatabase();
db.execSQL(
&update filedownlog set downlength=? where downpath=? and threadid=?&,
new Object[] { pos, path, threadId });
db.close();
* 当文件下载完成后,删除对应的下载记录
* @param path
public void delete(String path) {
SQLiteDatabase db = openHelper.getWritableDatabase();
db.execSQL(&delete from filedownlog where downpath=?&,
new Object[] { path });
db.close();
/MultiThreadDownload/src/com/wwj/net/download/DownloadThread.java
下载线程类
package com.wwj.net.
import java.io.F
import java.io.InputS
import java.io.RandomAccessF
import java.net.HttpURLC
import java.net.URL;
import android.util.L
public class DownloadThread extends Thread {
private static final String TAG = &DownloadThread&;
private File saveF
private URL downU
/* 下载开始位置 */
private int threadId = -1;
private int downL
private boolean finish =
private FileD
public DownloadThread(FileDownloader downloader, URL downUrl,
File saveFile, int block, int downLength, int threadId) {
this.downUrl = downU
this.saveFile = saveF
this.block =
this.downloader =
this.threadId = threadId;
this.downLength = downL
public void run() {
if (downLength & block) {// 未下载完成
HttpURLConnection http = (HttpURLConnection) downUrl
.openConnection();
http.setConnectTimeout(5 * 1000); // 设置连接超时
http.setRequestMethod(&GET&); // 设置请求方法,这里是“GET”
// 浏览器可接受的MIME类型
http.setRequestProperty(
&image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*&);
http.setRequestProperty(&Accept-Language&, &zh-CN&); // 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到
http.setRequestProperty(&Referer&, downUrl.toString());// 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
http.setRequestProperty(&Charset&, &UTF-8&); // 字符集
int startPos = block * (threadId - 1) + downL// 开始位置
int endPos = block * threadId - 1;// 结束位置
http.setRequestProperty(&Range&, &bytes=& + startPos + &-&
+ endPos);// 设置获取实体数据的范围
// 浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
http.setRequestProperty(
&User-Agent&,
&Mozilla/4.0 ( MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.; .NET CLR 3.5.30729)&);
http.setRequestProperty(&Connection&, &Keep-Alive&); // 设置为持久连接
// 得到输入流
InputStream inStream = http.getInputStream();
byte[] buffer = new byte[1024];
int offset = 0;
print(&Thread & + this.threadId
+ & start download from position & + startPos);
// 随机访问文件
RandomAccessFile threadfile = new RandomAccessFile(
this.saveFile, &rwd&);
// 定位到pos位置
threadfile.seek(startPos);
while (!downloader.getExit()
&& (offset = inStream.read(buffer, 0, 1024)) != -1) {
// 写入文件
threadfile.write(buffer, 0, offset);
downLength += // 累加下载的大小
downloader.update(this.threadId, downLength); // 更新指定线程下载最后的位置
downloader.append(offset); // 累加已下载大小
threadfile.close();
inStream.close();
print(&Thread & + this.threadId + & download finish&);
this.finish =
} catch (Exception e) {
this.downLength = -1;
print(&Thread & + this.threadId + &:& + e);
private static void print(String msg) {
Log.i(TAG, msg);
* 下载是否完成
public boolean isFinish() {
* 已经下载的内容大小
* @return 如果返回值为-1,代表下载失败
public long getDownLength() {
return downL
/MultiThreadDownload/src/com/wwj/net/download/DownloadProgressListener.java
下载进度接口
package com.wwj.net.
public interface DownloadProgressListener {
public void onDownloadSize(int size);
/MultiThreadDownload/src/com/wwj/download/MainActivity.java
package com.wwj.
import java.io.F
import java.io.UnsupportedEncodingE
import java.net.URLE
import android.app.A
import android.os.B
import android.os.E
import android.os.H
import android.os.M
import android.view.V
import android.widget.B
import android.widget.EditT
import android.widget.ProgressB
import android.widget.TextV
import android.widget.T
import com.wwj.net.download.DownloadProgressL
import com.wwj.net.download.FileD
public class MainActivity extends Activity {
private static final int PROCESSING = 1;
private static final int FAILURE = -1;
private EditText pathT // url地址
private TextView resultV
private Button downloadB
private Button stopB
private ProgressBar progressB
private Handler handler = new UIHandler();
private final class UIHandler extends Handler {
public void handleMessage(Message msg) {
switch (msg.what) {
case PROCESSING: // 更新进度
progressBar.setProgress(msg.getData().getInt(&size&));
float num = (float) progressBar.getProgress()
/ (float) progressBar.getMax();
int result = (int) (num * 100); // 计算进度
resultView.setText(result + &%&);
if (progressBar.getProgress() == progressBar.getMax()) { // 下载完成
Toast.makeText(getApplicationContext(), R.string.success,
Toast.LENGTH_LONG).show();
case FAILURE: // 下载失败
Toast.makeText(getApplicationContext(), R.string.error,
Toast.LENGTH_LONG).show();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pathText = (EditText) findViewById(R.id.path);
resultView = (TextView) findViewById(R.id.resultView);
downloadButton = (Button) findViewById(R.id.downloadbutton);
stopButton = (Button) findViewById(R.id.stopbutton);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
ButtonClickListener listener = new ButtonClickListener();
downloadButton.setOnClickListener(listener);
stopButton.setOnClickListener(listener);
private final class ButtonClickListener implements View.OnClickListener {
public void onClick(View v) {
switch (v.getId()) {
case R.id.downloadbutton: // 开始下载
// /music/光辉岁月.mp3,可以换成其他文件下载的链接
String path = pathText.getText().toString();
String filename = path.substring(path.lastIndexOf('/') + 1);
// URL编码(这里是为了将中文进行URL编码)
filename = URLEncoder.encode(filename, &UTF-8&);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
path = path.substring(0, path.lastIndexOf(&/&) + 1) +
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// File savDir =
// Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
// 保存路径
File savDir = Environment.getExternalStorageDirectory();
download(path, savDir);
Toast.makeText(getApplicationContext(),
R.string.sdcarderror, Toast.LENGTH_LONG).show();
downloadButton.setEnabled(false);
stopButton.setEnabled(true);
case R.id.stopbutton: // 暂停下载
Toast.makeText(getApplicationContext(),
&Now thread is Stopping!!&, Toast.LENGTH_LONG).show();
downloadButton.setEnabled(true);
stopButton.setEnabled(false);
* 由于用户的输入事件(点击button, 触摸屏幕....)是由主线程负责处理的,如果主线程处于工作状态,
* 此时用户产生的输入事件如果没能在5秒内得到处理,系统就会报“应用无响应”错误。
* 所以在主线程里不能执行一件比较耗时的工作,否则会因主线程阻塞而无法处理用户的输入事件,
* 导致“应用无响应”错误的出现。耗时的工作应该在子线程里执行。
private DownloadT
private void exit() {
if (task != null)
task.exit();
private void download(String path, File savDir) {
task = new DownloadTask(path, savDir);
new Thread(task).start();
* UI控件画面的重绘(更新)是由主线程负责处理的,如果在子线程中更新UI控件的值,更新后的值不会重绘到屏幕上
* 一定要在主线程里更新UI控件的值,这样才能在屏幕上显示出来,不能在子线程中更新UI控件的值
private final class DownloadTask implements Runnable {
private File saveD
private FileD
public DownloadTask(String path, File saveDir) {
this.path =
this.saveDir = saveD
* 退出下载
public void exit() {
if (loader != null)
loader.exit();
DownloadProgressListener downloadProgressListener = new DownloadProgressListener() {
public void onDownloadSize(int size) {
Message msg = new Message();
msg.what = PROCESSING;
msg.getData().putInt(&size&, size);
handler.sendMessage(msg);
public void run() {
// 实例化一个文件下载器
loader = new FileDownloader(getApplicationContext(), path,
saveDir, 3);
// 设置进度条最大值
progressBar.setMax(loader.getFileSize());
loader.download(downloadProgressListener);
} catch (Exception e) {
e.printStackTrace();
handler.sendMessage(handler.obtainMessage(FAILURE)); // 发送一条空消息对象
以上就是所有核心代码了,权限和布局文件我就不贴了,自己可以下我提供的demo来看。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1686165次
积分:23013
积分:23013
排名:第130名
原创:574篇
转载:81篇
评论:1667条
难度:初级
类型:实战教学
阅读:46456
阅读:25874
文章:14篇
阅读:73979
文章:11篇
阅读:72479
文章:10篇
阅读:44237
文章:13篇
阅读:20453
文章:13篇
阅读:178295
移动开发者狂热群:注明入群理由,里面有一群热爱分享的开发者
(1)(2)(3)(4)(12)(1)(5)(5)(6)(7)(2)(13)(11)(11)(8)(14)(10)(16)(8)(15)(23)(13)(12)(12)(11)(17)(28)(18)(20)(8)(11)(20)(13)(14)(10)(23)(18)(15)(36)(27)(47)(16)(3)(28)(33)(14)(13)
从入门到成长到成熟再到优秀,大多数程序员走了前面一段相似的道路,而有些人却走得更远一些!!!!

我要回帖

更多关于 种子合集 百度网盘 的文章

 

随机推荐