热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FileSplit简单使用

hadoop的FileSplit简单使用FileSplit类继承关系:FileSplit类中的属性和方法:作业输入:[java]viewp
hadoop的FileSplit简单使用


FileSplit类继承关系:



FileSplit类中的属性和方法:






作业输入:


[java] view plaincopy
  1. hadoop@hadoop:/home/hadoop/blb$ hdfs dfs -text /user/hadoop/libin/input/inputpath1.txt  
  2. hadoop  a  
  3. spark   a  
  4. hive    a  
  5. hbase   a  
  6. tachyon a  
  7. storm   a  
  8. redis   a  
  9. hadoop@hadoop:/home/hadoop/blb$ hdfs dfs -text /user/hadoop/libin/input/inputpath2.txt  
  10. hadoop  b  
  11. spark   b  
  12. kafka   b  
  13. tachyon b  
  14. oozie   b  
  15. flume   b  
  16. sqoop   b  
  17. solr    b  
  18. hadoop@hadoop:/home/hadoop/blb$   


[java] view plaincopy
  1. hadoop@hadoop:/home/hadoop/blb$ hdfs dfs -text /user/hadoop/libin/input/inputpath1.txt  
  2. hadoop  a  
  3. spark   a  
  4. hive    a  
  5. hbase   a  
  6. tachyon a  
  7. storm   a  
  8. redis   a  
  9. hadoop@hadoop:/home/hadoop/blb$ hdfs dfs -text /user/hadoop/libin/input/inputpath2.txt  
  10. hadoop  b  
  11. spark   b  
  12. kafka   b  
  13. tachyon b  
  14. oozie   b  
  15. flume   b  
  16. sqoop   b  
  17. solr    b  
  18. hadoop@hadoop:/home/hadoop/blb$   






代码:


[java] view plaincopy
  1. import java.io.IOException;  
  2.   
  3.   
  4. import org.apache.hadoop.conf.Configuration;  
  5. import org.apache.hadoop.fs.Path;  
  6. import org.apache.hadoop.io.LongWritable;  
  7. import org.apache.hadoop.io.NullWritable;  
  8. import org.apache.hadoop.io.Text;  
  9. import org.apache.hadoop.mapred.SplitLocationInfo;  
  10. import org.apache.hadoop.mapreduce.Job;  
  11. import org.apache.hadoop.mapreduce.Mapper;  
  12. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  13. import org.apache.hadoop.mapreduce.lib.input.FileSplit;  
  14. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;  
  15. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  16. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;  
  17. import org.apache.hadoop.util.GenericOptionsParser;  
  18.   
  19.   
  20. public class GetSplitMapReduce {  
  21.     public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {  
  22.         Configuration conf = new Configuration();  
  23.         String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();  
  24.         if(otherArgs.length!=2){  
  25.             System.err.println("Usage databaseV1  ");  
  26.         }  
  27.   
  28.   
  29.         Job job = Job.getInstance(conf, GetSplitMapReduce.class.getSimpleName() + "1");  
  30.         job.setJarByClass(GetSplitMapReduce.class);  
  31.         job.setMapOutputKeyClass(Text.class);  
  32.         job.setMapOutputValueClass(Text.class);  
  33.         job.setOutputKeyClass(Text.class);  
  34.         job.setOutputValueClass(NullWritable.class);  
  35.         job.setMapperClass(MyMapper1.class);  
  36.         job.setNumReduceTasks(0);  
  37.         job.setInputFormatClass(TextInputFormat.class);  
  38.         job.setOutputFormatClass(TextOutputFormat.class);  
  39.         FileInputFormat.addInputPath(job, new Path(otherArgs[0]));  
  40.         FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));  
  41.         job.waitForCompletion(true);  
  42.     }  
  43.     public static class MyMapper1 extends Mapper{  
  44.         @Override  
  45.         protected void map(LongWritable key, Text value, Mapper.Context context)  
  46.                 throws IOException, InterruptedException {  
  47.           
  48.             FileSplit fileSplit=(FileSplit) context.getInputSplit();  
  49.             String pathname=fileSplit.getPath().getName();  //获取目录名字  
  50.             int depth = fileSplit.getPath().depth();    //获取目录深度  
  51.             Classextends FileSplit> class1 = fileSplit.getClass(); //获取当前类  
  52.             long length = fileSplit.getLength();    //获取文件长度  
  53.             SplitLocationInfo[] locationInfo = fileSplit.getLocationInfo(); //获取位置信息  
  54.             String[] locations = fileSplit.getLocations();  //获取位置  
  55.             long start = fileSplit.getStart(); //The position of the first byte in the file to process.  
  56.             String string = fileSplit.toString();  
  57.             //fileSplit.  
  58.               
  59.             context.write(new Text("===================================================================================="), NullWritable.get());  
  60.             context.write(new Text("pathname--"+pathname), NullWritable.get());  
  61.             context.write(new Text("depth--"+depth), NullWritable.get());  
  62.             context.write(new Text("class1--"+class1), NullWritable.get());  
  63.             context.write(new Text("length--"+length), NullWritable.get());  
  64.             context.write(new Text("locationInfo--"+locationInfo), NullWritable.get());  
  65.             context.write(new Text("locations--"+locations), NullWritable.get());  
  66.             context.write(new Text("start--"+start), NullWritable.get());  
  67.             context.write(new Text("string--"+string), NullWritable.get());  
  68.         }  
  69.     }  
  70. }  


[java] view plaincopy
  1. import java.io.IOException;  
  2.   
  3.   
  4. import org.apache.hadoop.conf.Configuration;  
  5. import org.apache.hadoop.fs.Path;  
  6. import org.apache.hadoop.io.LongWritable;  
  7. import org.apache.hadoop.io.NullWritable;  
  8. import org.apache.hadoop.io.Text;  
  9. import org.apache.hadoop.mapred.SplitLocationInfo;  
  10. import org.apache.hadoop.mapreduce.Job;  
  11. import org.apache.hadoop.mapreduce.Mapper;  
  12. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  13. import org.apache.hadoop.mapreduce.lib.input.FileSplit;  
  14. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;  
  15. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  16. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;  
  17. import org.apache.hadoop.util.GenericOptionsParser;  
  18.   
  19.   
  20. public class GetSplitMapReduce {  
  21.     public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {  
  22.         Configuration conf = new Configuration();  
  23.         String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();  
  24.         if(otherArgs.length!=2){  
  25.             System.err.println("Usage databaseV1  ");  
  26.         }  
  27.   
  28.   
  29.         Job job = Job.getInstance(conf, GetSplitMapReduce.class.getSimpleName() + "1");  
  30.         job.setJarByClass(GetSplitMapReduce.class);  
  31.         job.setMapOutputKeyClass(Text.class);  
  32.         job.setMapOutputValueClass(Text.class);  
  33.         job.setOutputKeyClass(Text.class);  
  34.         job.setOutputValueClass(NullWritable.class);  
  35.         job.setMapperClass(MyMapper1.class);  
  36.         job.setNumReduceTasks(0);  
  37.         job.setInputFormatClass(TextInputFormat.class);  
  38.         job.setOutputFormatClass(TextOutputFormat.class);  
  39.         FileInputFormat.addInputPath(job, new Path(otherArgs[0]));  
  40.         FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));  
  41.         job.waitForCompletion(true);  
  42.     }  
  43.     public static class MyMapper1 extends Mapper{  
  44.         @Override  
  45.         protected void map(LongWritable key, Text value, Mapper.Context context)  
  46.                 throws IOException, InterruptedException {  
  47.           
  48.             FileSplit fileSplit=(FileSplit) context.getInputSplit();  
  49.             String pathname=fileSplit.getPath().getName();  //获取目录名字  
  50.             int depth = fileSplit.getPath().depth();    //获取目录深度  
  51.             Classextends FileSplit> class1 = fileSplit.getClass(); //获取当前类  
  52.             long length = fileSplit.getLength();    //获取文件长度  
  53.             SplitLocationInfo[] locationInfo = fileSplit.getLocationInfo(); //获取位置信息  
  54.             String[] locations = fileSplit.getLocations();  //获取位置  
  55.             long start = fileSplit.getStart(); //The position of the first byte in the file to process.  
  56.             String string = fileSplit.toString();  
  57.             //fileSplit.  
  58.               
  59.             context.write(new Text("===================================================================================="), NullWritable.get());  
  60.             context.write(new Text("pathname--"+pathname), NullWritable.get());  
  61.             context.write(new Text("depth--"+depth), NullWritable.get());  
  62.             context.write(new Text("class1--"+class1), NullWritable.get());  
  63.             context.write(new Text("length--"+length), NullWritable.get());  
  64.             context.write(new Text("locationInfo--"+locationInfo), NullWritable.get());  
  65.             context.write(new Text("locations--"+locations), NullWritable.get());  
  66.             context.write(new Text("start--"+start), NullWritable.get());  
  67.             context.write(new Text("string--"+string), NullWritable.get());  
  68.         }  
  69.     }  
  70. }  








对应inputpath2.txt文件的输出:


[java] view plaincopy
  1. hadoop@hadoop:/home/hadoop/blb$ hdfs dfs -text /user/hadoop/libin/out2/part-m-00000  
  2. ====================================================================================  
  3. pathname--inputpath2.txt  
  4. depth--5  
  5. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  6. length--66  
  7. locationInfo--null  
  8. locations--[Ljava.lang.String;@4ff41ba0  
  9. start--0  
  10. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  11. ====================================================================================  
  12. pathname--inputpath2.txt  
  13. depth--5  
  14. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  15. length--66  
  16. locationInfo--null  
  17. locations--[Ljava.lang.String;@2341ce62  
  18. start--0  
  19. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  20. ====================================================================================  
  21. pathname--inputpath2.txt  
  22. depth--5  
  23. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  24. length--66  
  25. locationInfo--null  
  26. locations--[Ljava.lang.String;@35549603  
  27. start--0  
  28. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  29. ====================================================================================  
  30. pathname--inputpath2.txt  
  31. depth--5  
  32. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  33. length--66  
  34. locationInfo--null  
  35. locations--[Ljava.lang.String;@4444ba4f  
  36. start--0  
  37. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  38. ====================================================================================  
  39. pathname--inputpath2.txt  
  40. depth--5  
  41. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  42. length--66  
  43. locationInfo--null  
  44. locations--[Ljava.lang.String;@7c23bb8c  
  45. start--0  
  46. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  47. ====================================================================================  
  48. pathname--inputpath2.txt  
  49. depth--5  
  50. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  51. length--66  
  52. locationInfo--null  
  53. locations--[Ljava.lang.String;@dee2400  
  54. start--0  
  55. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  56. ====================================================================================  
  57. pathname--inputpath2.txt  
  58. depth--5  
  59. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  60. length--66  
  61. locationInfo--null  
  62. locations--[Ljava.lang.String;@d7d8325  
  63. start--0  
  64. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  65. ====================================================================================  
  66. pathname--inputpath2.txt  
  67. depth--5  
  68. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  69. length--66  
  70. locationInfo--null  
  71. locations--[Ljava.lang.String;@2b2cf90e  
  72. start--0  
  73. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  


[java] view plaincopy
  1. hadoop@hadoop:/home/hadoop/blb$ hdfs dfs -text /user/hadoop/libin/out2/part-m-00000  
  2. ====================================================================================  
  3. pathname--inputpath2.txt  
  4. depth--5  
  5. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  6. length--66  
  7. locationInfo--null  
  8. locations--[Ljava.lang.String;@4ff41ba0  
  9. start--0  
  10. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  11. ====================================================================================  
  12. pathname--inputpath2.txt  
  13. depth--5  
  14. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  15. length--66  
  16. locationInfo--null  
  17. locations--[Ljava.lang.String;@2341ce62  
  18. start--0  
  19. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  20. ====================================================================================  
  21. pathname--inputpath2.txt  
  22. depth--5  
  23. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  24. length--66  
  25. locationInfo--null  
  26. locations--[Ljava.lang.String;@35549603  
  27. start--0  
  28. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  29. ====================================================================================  
  30. pathname--inputpath2.txt  
  31. depth--5  
  32. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  33. length--66  
  34. locationInfo--null  
  35. locations--[Ljava.lang.String;@4444ba4f  
  36. start--0  
  37. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  38. ====================================================================================  
  39. pathname--inputpath2.txt  
  40. depth--5  
  41. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  42. length--66  
  43. locationInfo--null  
  44. locations--[Ljava.lang.String;@7c23bb8c  
  45. start--0  
  46. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  47. ====================================================================================  
  48. pathname--inputpath2.txt  
  49. depth--5  
  50. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  51. length--66  
  52. locationInfo--null  
  53. locations--[Ljava.lang.String;@dee2400  
  54. start--0  
  55. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  56. ====================================================================================  
  57. pathname--inputpath2.txt  
  58. depth--5  
  59. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  60. length--66  
  61. locationInfo--null  
  62. locations--[Ljava.lang.String;@d7d8325  
  63. start--0  
  64. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  
  65. ====================================================================================  
  66. pathname--inputpath2.txt  
  67. depth--5  
  68. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  69. length--66  
  70. locationInfo--null  
  71. locations--[Ljava.lang.String;@2b2cf90e  
  72. start--0  
  73. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath2.txt:0+66  








对应inputpath1.txt文件的输出:


[java] view plaincopy
  1. hadoop@hadoop:/home/hadoop/blb$ hdfs dfs -text /user/hadoop/libin/out2/part-m-00001  
  2. ====================================================================================  
  3. pathname--inputpath1.txt  
  4. depth--5  
  5. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  6. length--58  
  7. locationInfo--null  
  8. locations--[Ljava.lang.String;@4ff41ba0  
  9. start--0  
  10. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath1.txt:0+58  
  11. ====================================================================================  
  12. pathname--inputpath1.txt  
  13. depth--5  
  14. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  15. length--58  
  16. locationInfo--null  
  17. locations--[Ljava.lang.String;@2341ce62  
  18. start--0  
  19. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath1.txt:0+58  
  20. ====================================================================================  
  21. pathname--inputpath1.txt  
  22. depth--5  
  23. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  24. length--58  
  25. locationInfo--null  
  26. locations--[Ljava.lang.String;@35549603  
  27. start--0  
  28. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath1.txt:0+58  
  29. ====================================================================================  
  30. pathname--inputpath1.txt  
  31. depth--5  
  32. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  33. length--58  
  34. locationInfo--null  
  35. locations--[Ljava.lang.String;@4444ba4f  
  36. start--0  
  37. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath1.txt:0+58  
  38. ====================================================================================  
  39. pathname--inputpath1.txt  
  40. depth--5  
  41. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  42. length--58  
  43. locationInfo--null  
  44. locations--[Ljava.lang.String;@7c23bb8c  
  45. start--0  
  46. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath1.txt:0+58  
  47. ====================================================================================  
  48. pathname--inputpath1.txt  
  49. depth--5  
  50. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  51. length--58  
  52. locationInfo--null  
  53. locations--[Ljava.lang.String;@dee2400  
  54. start--0  
  55. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath1.txt:0+58  
  56. ====================================================================================  
  57. pathname--inputpath1.txt  
  58. depth--5  
  59. class1--class org.apache.hadoop.mapreduce.lib.input.FileSplit  
  60. length--58  
  61. locationInfo--null  
  62. locations--[Ljava.lang.String;@d7d8325  
  63. start--0  
  64. string--hdfs://hadoop:9000/user/hadoop/libin/input/inputpath1.txt:0+58  
  65. hadoop@hadoop:/home/hadoop/blb$   


推荐阅读
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 美团优选推荐系统架构师 L7/L8:算法与工程深度融合 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 本文详细介绍了 HTML 中 a 标签的 href 属性的多种用法,包括实现超链接、锚点以及调用 JavaScript 方法。通过具体的示例和解释,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 本文介绍了如何使用 Spark SQL 生成基于起始与终止时间的时序数据表。通过 `SELECT DISTINCT goods_id, get_dt_date(start_time, i) as new_dt` 语句,根据不同的时间间隔 `i` 动态填充日期,从而构建出完整的时序数据记录。该方法能够高效地处理大规模数据集,并确保生成的数据表准确反映商品在不同时间段的状态变化。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Jeecg开源社区正式启动第12届架构技术培训班,现已开放报名。本次培训采用师徒制模式,深入探讨Java架构技术。类似于大学导师指导研究生的方式,特别适合在职人员。导师将为学员布置课题,提供丰富的视频资料,并进行一对一指导,帮助学员高效学习和完成任务。我们的教学方法注重实践与理论结合,旨在培养学员的综合技术能力。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
author-avatar
mobiledu2502853623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有