黑马程序员:工具类----获取指定包名下的所有类
黑马程序员:工具类----获取指定包名下的所有类[本站推荐]
黑马程序员:工具类----获取指定包名下的所有类[本站推荐]第一篇:黑马程序员:工具类----获取指定包名下的所有类[本站推荐] 分享一个获取指定包名下所有类的工具类,代码如下1. 2. 3. 4. 5. 6. 7. 8. 9. import java.io.File; import java.io.FileFilter;import ng.annotation.Annotation; import .JarURLConnection; import .URL;import java.util.ArrayList; import java.util.Enumeration; import java.util.List;import java.util.jar.JarEntry;10. import java.util.jar.JarFile; 11.12. public class ClassUtil { 13. // 获取指定包名下的所有类 14. public static List> getClassList(String packageName, boolean isRecursive) {15. List> classList = new ArrayList>(); 16. try { 17.Enumerationurls=Thread.currentThread().getContextClassLoader().getResources(p ackageName.replaceAll("\.", "/"));18. while (urls.hasMoreElements()) { 19. URL url = urls.nextElement(); 20. if (url != null) {21. String protocol = url.getProtocol(); 22. if (protocol.equals("file")) {23. String packagePath = url.getPath();24. addClass(classList, packagePath, packageName, isRecursive);25. } else if (protocol.equals("jar")) { 26.27.JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();JarFilejarFile= jarURLConnection.getJarFile();Enumeration jarEntries = jarFile.entries();29. while (jarEntries.hasMoreElements()) {30.JarEntry jarEntry = jarEntries.nextElement();31. String jarEntryName = jarEntry.getName(); 32. if (jarEntryName.endsWith(".class")) { 33.StringclassName= jarEntryName.substring(0, stIndexOf(".")).replaceAll("/", ".");34.{if (isRecursive || className.substring(0, stIndexOf(".")).equals(packageName)) 35. classList.add(Class.forName(className));36. } 37. } 38. } 39. } 40. } 41. }42. } catch (Exception e) { 43. e.printStackTrace(); 44. }45. return classList; 46. } 47.48. // 获取指定包名下的所有类(可根据注解进行过滤)49. public static List> getClassListByAnnotation(String packageName, Class<? extends Annotation> annotationClass) {50. List> classList = new ArrayList>(); 51. try { 52.EnumerationurlsThread.currentThread().getContextClassLoader().getResources(p ackageName.replaceAll("\.", "/"));53. while (urls.hasMoreElements()) { 54. URL url = urls.nextElement(); 55. if (url != null) {56. String protocol = url.getProtocol(); 57. if (protocol.equals("file")) {58. String packagePath = url.getPath();59.addClassByAnnotation(classList, packagePath, packageName, annotationClass);60. } else if (protocol.equals("jar")) { 61.62.63.JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();JarFilejarFile= jarURLConnection.getJarFile();Enumeration jarEntries = jarFile.entries();64. while (jarEntries.hasMoreElements()) { 65.JarEntryjarEntry= jarEntries.nextElement();66. String jarEntryName = jarEntry.getName(); 67. if (jarEntryName.endsWith(".class")) { 68.StringclassName= jarEntryName.substring(0, stIndexOf(".")).replaceAll("/", ".");70.Class<?> cls = Class.forName(className);if (cls.isAnnotationPresent(annotationClass)) {71. classList.add(cls); 72. } 73. } 74. } 75. } 76. } 77. }78. } catch (Exception e) { 79. e.printStackTrace(); 80. }81. return classList; 82. } 83.84. private static void addClass(List> classList, String packagePath, String packageName, boolean isRecursive) {85. try {86. File[] files = getClassFiles(packagePath);87. if (files != null) {88. for (File file : files) {89. String fileName = file.getName(); 90. if (file.isFile()) {91.String className = getClassName(packageName, fileName);92. classList.add(Class.forName(className)); 93. } else {94. if (isRecursive) { 95.96.97.String subPackagePath = getSubPackagePath(packagePath, fileName);String subPackageName = getSubPackageName(packageName, fileName);addClass(classList, subPackagePath, subPackageName, isRecursive);98. } 99. } 100. } 101. }102. } catch (Exception e) { 103. e.printStackTrace(); 104. } 105. } 106.107. private static File[] getClassFiles(String packagePath){ 108. return new File(packagePath).listFiles(new FileFilter() { 109. @Override110. public boolean accept(File file) { 111.return(file.isFile()&& file.getName().endsWith(".class")) || file.isDirectory();112. } 113. }); 114. } 115.116.private static String getClassName(String packageName, String fileName) {117. String className = fileName.substring(0, stIndexOf("."));118.if(ng.StringUtil.isNotEmpty(packageName )) {119. className = packageName + "." + className; 120. } 121. return className; 122. } 123.124. private static String getSubPackagePath(String packagePath, String filePath) {125. String subPackagePath = filePath; 126.if(ng.StringUtil.isNotEmpty(packagePath)) {127. subPackagePath = packagePath + "/" + subPackagePath; 128. }129. return subPackagePath; 130. } 131.132. private static String getSubPackageName(String packageName, String filePath) {133. String subPackageName = filePath; 134.if(ng.StringUtil.isNotEmpty(packageName )) {135. subPackageName = packageName + "." + subPackageName; 136. }137. return subPackageName; 138. } 139.140. private static void addClassByAnnotation(List> classList, String packagePath, String packageName, Class<? extends Annotation> annotationClass) {141. try {142. File[] files = getClassFiles(packagePath); 143. if (files != null) {144. for (File file : files) {145. String fileName = file.getName(); 146. if (file.isFile()) { 147. String className = getClassName(packageName, fileName);148. Class<?> cls = Class.forName(className); 149. if (cls.isAnnotationPresent(annotationClass)) {150. classList.add(cls); 151. } 152. } else { 153.154.155.StringsubPackagePath= getSubPackagePath(packagePath, fileName);StringsubPackageName= getSubPackageName(packageName, fileName);addClassByAnnotation(classList, subPackagePath, subPackageName, annotationClass);156. } 157. } 158. }159. } catch (Exception e) { 160. e.printStackTrace(); 161. } 162. } 163. }第二篇:黑马程序员_PHP_课程同步笔记day30:PHP类中关键字【黑马程序员济南】PHP课程同步笔记day30:PHP类中关键字今天我来为大家讲解一下PHP类中的一些关键字: parent和self 关键字 parent:用在一个类的一个方法中;代表这个类的“父类”——注意,是代表一个类,不是类的对象;但:实际应用中,常常会看起来“代表”这个类的父类对象——因为用的时候,是使用了父类的对象来调用某个方法而产生了所谓的对象传递; [PHP] 纯文本查看复制代码 ? 01 <?php 02 /*传智播客济南03 中心出品*/ 04 class A{ 05 //在A类中声06 明一些变量07 const PI = 08 3.14; //声明常09 量10 static $s1 =黑马程序员济南中心编著11 1; //声明静态属12 性 13 } 14 15 class B extends A{ static function f1(){ echo "父类的静态属性s1:".parent::$s1; echo "父类的常量PI:".parent::PI; } } B::f1(); 显示结果:父类的静态属性s1:1父类的常量PI:3.14黑马程序员济南中心编著self:用在一个类的一个方法中;代表这个类“本身”——还是代表一个类,而不是类的对象;[PHP] 纯文本查看复制代码 ? 01 <?php 02 /*传智播客济03 南中心出品*/ 04 05 class B { 06 static $s2 07 = 2; //声明一08 个静态变量09 const PI = 10 3.14; //声明常11 量 12 static function f1(){ echo "自己的静态属性s1:".self::$s1; echo "自黑马程序员济南中心编著己的常量PI:".self::PI; } } B::f1(); 典型使用1:在构造方法中,调用父类的构造方法,以完成对象的一些共同的数据初始化工作。
黑马程序员android开发笔记及源码
01、什么是3G02、android系统简介03、android背景介绍04、android的framewor简介05、两种虚拟机的比较06、sdk的下载以及简介07、创建android模拟器08、ddms简介09、platform-tools的简介及常见adb指令10、android项目的目录结构11、android下apk安装的过程12、常见的adb指令介绍13、创建模拟器遇到的常见错误14、电话拨号器15、点击事件的四种写法16、短信发送器17、相对布局&单位介绍18、现形布局&布局的组合19、表格布局&绝对布局20、帧布局21、测试相关概念22、android下junit测试框架配置23、logcat简介24、保存文件到手机内存25、android下文件访问的权限26、保存文件到SD卡中27、分析setting源代码获取SD卡大小28、_sharePreference入门29、xml文件的序列化30、采用pull解析xml文件31、采用断电调试的方法观察pull解析的的流程32、android下创建一个sqllite数据库33、sql语句实现数据库的增删改查34、系统api实现数据库的增删改查&Sqlite3工具的使用35、数据库的事物36、listView入门37、采用layoutInflater打气筒创建一个view对象38、采用数据适配器ArryAdapter39、常用数据适配器simpleAdapter40、数据适配器总结41、内容提供者简介42、内容提供者的实现43、短信的备份44、插入一条记录到系统短信应用45、内容观察者46、获取系统的联系人信息47、保存联系人到系统通讯录48、读取联系人的一个小细节49、网络图片查看器50、anr产生的原理&如何避免51、android消息机制入门52、网络html查看器53、字符乱码问题的处理54、采用get方式提交数据到服务器55、采用post方式提交数据到服务器56、提交数据到服务器中文乱码问题的处理57、采用httpclient提交数据到服务器58、异步http框架简介&实现原理59、异步http框架提交数据到服务器60、上传文件到服务器61、smartimageview&常见开源代码62、多线程下载的原理63、多线程断点下载的原理64、多线程java代码移植到android65、多线程下载文本页面的更新66、显示意图激活另一个activity67、隐式意图激活另一个activity68、隐式意图的配置69、隐式意图和显示意图的使用场景70、在不同activity之间数据传递71、activity的声明周期72、activity的启动模式73、activity横竖屏切换的声明周期74、开启新的activity获取他的返回值75、请求码和结果码的作用76、利用广播实现ip拨号77、短信窃听器78、自定义广播时间&发送自定义广播&广播接受者优先级79、采用服务执行长期后台操作80、采用服务窃听电话&服务的声明周期81、android进程优先级&为什么使用服务82、绑定方式开启服务&调用服务的方法83、服务的声明周期(混合开启84、采用aidl绑定远程服务85、代码注册广播接受者&利用广播调用服务的办法86、加载大图片到内存87、获取图片exif信息88、从gallery获取图片89、图片画画板90、扒开美女衣服91、图片的缩放92、图片的旋转93、图片的平移&镜面&倒影效果94、图片的合成95、图片的颜色处理96、多媒体播放api简介97、人脸识别98、mediaplayer的生命周期99、soundpoo简介100、sufaceview的生命周期101、播放在线视频102、视频播放器进度的处理103、调用系统照相机拍照和录像104、采用camera拍照105、常见对话框106、notification入门107、菜单108、android下的样式109、android下的主题110、代码编写ui111、html创建ui112、帧动画113、代码创建创建的tween动画114、xml文件定义动画115、传感器简介116、117、杀死进程118、apk的安装119、应用程序的反编译120、动态创建fragment121、用fragment创建一个选项卡122、fragment的向下兼容性123、fragment的生命周期124、fragment之间的通讯125、应用程序国际化04、android的framewor简介Wap:wait and playWireless Makeup Language(WML)精简的html语言Applications:android自带的基本上层应用Aplication framework:应用程序框架Librarics:Linux lernel:05、两种虚拟机的比较编译后文件格式:jvm:.java->.class->.jardalvik vm:.java->.dex->.odex基于的架构:jvm:基于栈的架构dalvik vm:基于寄存器的架构Cpu直接访问寄存器因此dalvik虚拟机的效率比jvm高06、sdk的下载以及简介->获取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,实际上是eclipse的插件)SDK具体内容Android->SDK Plateform:开发时使用到的jar包->Samples for sdk:->ARM EABI V7a System Image:模拟器运行时的镜像->Intel n86 Aton System:模拟器运行时的镜像->MIPS System Image:模拟器运行时的镜像->google APIs:google提供的jar包,可以直接使用google提供的一些API ->source for android SDK:SDK全部的源代码Extrals:->tools:开发的工具->support library:实现高版本的android向下的兼容->google Admed Ads SDK:gongle提供的广告插件->Analyties App Irackiong SDK:应用的用户分析->cloud message:云消息->gongle play service:收费服务->google USB Driver:真实的设备驱动开发时:基于4.0,兼容2.2、2.3.307、创建android模拟器avd:android virture developerVGA:480*640(电视的标准分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更宽)08、ddms简介ddms:模拟器不支持中文,因此发送中文会显示不出来09、platform-tools的简介及常见adb指令Android调试桥:内部实现就是socket让两个系统之间实现数据交互->reset adb:模拟器找不到时候可以重启->adb device:列出所有的连接的设备->adb kill-server:杀死adb调试桥->adb start-server 启动adb调试桥dx.bat:将.class文件打包10、android项目的目录结构一:SDK的目录结构->Samples->Api demo:根据API demo(模拟器上面可以看见)的效果可以在sample中看见相应的代码->Source:jar包所有的sdk源代码都在这个文件夹里->SystemImage:系统镜像->temp:下载更新临时存储的文件夹,一般是空的->tools:emulater.ext 不同版本的模拟器二:New Android Application->theme:留给以后作为扩展,现在并没有太大的作用->target SDK:一般选择高版本,因为高版本对下兼容->mark project as a library:一般不选择,意思是将这个项目提供一个jar包供别人使用三:文件夹目录.setting:设置目录assets:资产目录,存放一些文件,这些文件会被原封不动打包到应用程序的apk中bin:gen:自动生成的目录->builderConfig.java:生成的配置信息->R.java:Android 4.1.2->android.jar开发环境,jar包可以在properties中修改,jar包就是SDK011、Android下apk的安装过程一、Android安装过程分析:->setContentView:甚至view的对象,把里面的xml文件加载到->在project中选择build automaticly会自动把文件生成字节码文件,.class $代表的class文件生成的是内部类->dex.bat文件会把.class文件生成.dex文件->apk压缩文件解压内部内容->META-INF:应用程序的签名eclipse的调试签名文件->res:资源文件->classes.dex:class文件->resources.arsc:资源ID映射->android软件安装的过程:->拷贝xxx.apk带/data/app/xxx-1.apk->在/data/data目录下创建一个文件夹,文件夹名称当前应用程序的报名012、常见adb指令前提:->设备连接上电脑而且驱动安装正常,如果安装不正常的话,会有黄色的问号显示;->设备上打开USB调试;指令:->adb device(如果启动发现这个程序没有安装会自动安装)->adb kill-server->adb start-server->adb uninstall <包名>->adb -s emulator-5554 install c:\\users\\administrator\\hello.apk如果有多个设备的话,如果不指定安装的是哪个设备程序会报错->adb push haha.prop /sdcard/haha.txt 将文件移到(360管家,豌豆荚之类的软件他们也是用的adb指令,倘若电脑上装这些软件的话,会因为两个adb指令抢端口号而挂掉)(adb版本之间兼容不是很好,经常报错可以考虑下版本的问题)->adb shell:远程连接到了android的linux终端ls:显示文件夹ps:显示正在运行的程序ping:网络连通性013、创建模拟器遇到的常见错误->路径最好不要有中文:->应用安装不上,或者安装模拟器的时候开启一个新的模拟器:可能是模拟器的资源被占用,模拟器在运行的时候其实占用着硬盘上面的一个文件,这个文件位于工作空间.android/avd/iphone.avd 里面会有镜像文件,当一个模拟器开启起来了,就给你创建一个文件夹.knock的文件夹,代表着这个模拟器被锁定了,如果把模拟器关掉,就没有程序占据这几个镜像资源了,那么这几个程序就会被自动删除。
黑马程序员案例api接口
黑马程序员案例api接口以黑马程序员案例API接口为题,我将为大家列举以下10个API接口,详细描述其功能和使用方法。
1. 获取所有课程接口该接口用于获取黑马程序员所有的课程信息,包括课程名称、课程介绍、课程价格等。
用户可以通过调用此接口获取到最新的课程信息,并根据需要进行筛选和排序。
2. 获取某个课程的详细信息接口该接口用于获取指定课程的详细信息,包括课程的章节列表、课程的讲师信息、课程的学习方式等。
用户可以通过调用此接口获取到指定课程的详细信息,并根据需要进行学习和购买。
3. 用户登录接口该接口用于用户登录黑马程序员平台,用户需要提供用户名和密码来进行身份验证。
登录成功后,用户可以获取到自己的个人信息,并可以进行课程学习和购买等操作。
4. 用户注册接口该接口用于用户在黑马程序员平台进行注册,用户需要提供用户名、密码和邮箱等信息进行注册。
注册成功后,用户可以登录平台,并可以进行课程学习和购买等操作。
5. 获取用户个人信息接口该接口用于获取用户的个人信息,包括用户名、邮箱、手机号码等。
用户可以通过调用此接口查看和修改自己的个人信息。
6. 购买课程接口该接口用于用户购买指定的课程,用户需要提供课程ID和支付信息进行购买。
购买成功后,用户可以在个人课程列表中查看已购买的课程,并可以进行学习。
7. 添加课程到购物车接口该接口用于用户将指定的课程添加到购物车中,用户需要提供课程ID进行操作。
用户可以通过调用此接口将感兴趣的课程添加到购物车中,方便后续进行购买。
8. 获取购物车列表接口该接口用于获取用户购物车中的课程列表,用户可以查看购物车中已添加的课程,并可以进行购买或删除等操作。
9. 获取用户学习记录接口该接口用于获取用户的课程学习记录,包括已学习过的课程、学习进度、学习时间等。
用户可以通过调用此接口查看自己的学习记录,并可以继续学习未完成的课程。
10. 获取讲师信息接口该接口用于获取黑马程序员平台的讲师信息,包括讲师姓名、讲师介绍、讲师头像等。
黑马程序员java基础入门资料
黑马程序员java基础入门资料黑马程序员是一家专注于计算机培训的机构,拥有丰富的教学经验和优秀的师资力量。
在黑马程序员的Java基础入门课程中,学员将学习Java编程语言的基本语法、面向对象编程思想以及常用的Java 开发工具和技术。
以下是有关黑马程序员Java基础入门的资料,以帮助初学者快速入门。
一、Java基础知识概述1. Java的发展历程:介绍了Java的起源、发展和目前的应用领域。
2. Java的特点和优势:强调Java的跨平台性、面向对象和丰富的类库等优势。
3. Java的环境搭建:演示如何下载并安装Java开发工具包(JDK),以及配置环境变量。
二、Java语言基础1. Java的基本语法:介绍Java的关键字、标识符、数据类型、变量、运算符、语句和控制结构等基本语法知识。
2. Java的输入输出:学习如何使用Java提供的输入输出类库实现控制台输入和输出操作。
3. Java的数组:介绍如何声明、初始化和使用Java中的一维和二维数组。
三、面向对象编程1.面向对象思想:讲解面向对象编程的基本概念,如类、对象、封装、继承和多态等。
2. Java类和对象:学习如何定义Java类、创建对象实例、调用对象的属性和方法。
3. Java的封装和继承:介绍Java中的封装和继承的概念和实现方法,以及封装和继承在面向对象编程中的作用。
四、常用的Java类库和API1.字符串操作:学习Java字符串的基本操作,如字符串的拼接、截取、替换和比较等。
2.文件操作:了解Java文件的读写操作,包括文件的创建、删除、重命名和复制等。
3.集合框架:介绍Java的集合框架,如ArrayList、LinkedList、HashMap等常用的集合类,以及集合的增、删、改、查操作。
4.异常处理:学习如何使用Java的异常处理机制来处理程序运行过程中可能出现的错误和异常情况。
五、Java开发工具和技术1. Eclipse开发环境:了解如何使用Eclipse来编译、调试和运行Java程序。
黑马程序员Java教程:Collections工具类
Collections工具类Collections:是集合框架的工具类,里面的方法都是静态的。
示例1:1.import java.util.ArrayList;2.import java.util.Collections;3.import parator;4.import java.util.List;5.6.public class CollectionsDemo{7. public static void main(String[] args){8. demo1();9. }10.11. public static void demo1(){12. List<String> list = new ArrayList<String>();13.14. list.add( "abcde");15. list.add( "cba");16. list.add( "aa");17. list.add( "zzz");18. list.add( "cba");19. list.add( "nbaa");20.21. //对list集合进行指定顺序的排序22. Collections. sort(list);23. System. out.println(list);24.25. Collections. sort(list,new ComparatorByLength());26. System. out.println(list);27.28. mySort(list,new ComparatorByLength());29. System. out.println(list);30. }31.32. public static <T> void mySort(List<T> list,Comparator<? super T>comp){33. for(int i = 0; i < list.size() - 1; i++){34. for(int j = i + 1; j < list.size(); j++){35. if(pare(list.get(i),list.get(j))>0){36. Collections. swap(list ,i,j);37. }38. }39. }40. }41.}42.43.class ComparatorByLength implements Comparator<String>{44. public int compare(String o1,String o2){45. int temp = o1.length() - o2.length();46. return temp == 0?pareTo(o2):temp;47. }48.}49.运行结果:示例2:1.import java.util.ArrayList;2.import java.util.Collections;3.import parator;4.import java.util.List;5.6.public class CollectionsDemo{7. public static void main(String[] args){8. demo2();9. }10.11. public static void demo2(){12. List<String> list = new ArrayList<String>();13.14. list.add( "abcde");15. list.add( "cba");16. list.add( "aa");17. list.add( "zzz");18. list.add( "cba");19. list.add( "nbaa");20.21. Collections.sort(list);22. System.out.println(list);23.24. int index = Collections.binarySearch(list,"aaa");25. System.out.println( "index = " + index);//-2 -index-126.27. //获取最大值28. String max = Collections.max(list, newComparatorByLength());29. System.out.println( "max = " + max);30. }31.}32.33.class ComparatorByLength implements Comparator<String>{34. public int compare(String o1,String o2){35. int temp = o1.length() - o2.length();36. return temp == 0?pareTo(o2):temp;37. }38.}39.运行结果:原因分析:示例3:1.import java.util.Collections;2.import parator;3.import java.util.TreeSet;4.5.public class CollectionsDemo{6. public static void main(String[] args){7. demo3();8. }9.10. public static void demo3(){11. TreeSet<String> ts = newTreeSet<String>(Collections.reverseOrder());12.13. ts = new TreeSet<String>(Collections.reverseOrder(newComparatorByLength()));14.15. ts.add( "abc");16. ts.add( "hahaha");17. ts.add( "zzz");18. ts.add( "aa");19. ts.add( "cba");20.21. System.out.println(ts);22. }23.}24.25.class ComparatorByLength implements Comparator<String>{26. public int compare(String o1,String o2){27. int temp = o1.length() - o2.length();28. return temp == 0?pareTo(o2):temp;29. }30.}31.示例4:1.import java.util.ArrayList;2.import java.util.Collections;3.import java.util.List;4.5.public class CollectionsDemo{6. public static void main(String[] args){7. demo4();8. }9.10. public static void demo4(){11. List<String> list = new ArrayList<String>();12.13. list.add( "abcde");14. list.add( "cba");15. list.add( "aa");16.17. System. out.println(list);18. Collections. replaceAll(list,"cba", "nba");19. System. out.println(list);20. }21.}22.运行结果:示例5:1.import java.util.ArrayList;2.import java.util.Collections;3.import java.util.List;4.5.public class CollectionsDemo{6. public static void main(String[] args){7. demo5();8. }9.10. public static void demo5(){11. List<String> list = new ArrayList<String>();12.13. list.add( "abcde");14. list.add( "cba");15. list.add( "zhangsan");16. list.add( "zhaoliu");17. list.add( "xiaoqiang");18.19. System. out.println(list);20. Collections. shuffle(list);21. System. out.println(list);22. }23.}24.运行结果:原因分析:练习:给非同步的集合加锁。
【黑马程序员】Python编程学习中的文件操作
【黑马程序员】Python编程学习中的文件操作在学习Python 的过程中,不经常使用到文件相关的操作(也有可能是我学的不到家),说实话,这些不常用的API ,在真正需要的时候还是要百度的,自己还是写不出来。
说要整理,也不知道该如何整理,就干脆一点,直接上我做练习的时候写的一个工具类吧。
日后再有文件相关的操作,都可以写成方法加上去。
另外,普及一个知识点,这个文件可以直接拿来使用,在使用之前可以使用dir() 和help() 方法来查看类库和方法的介绍。
使用方法在同一目录下:from FileUtils(文件名)import FileUtils 这样就可以使用了FileUtils 这个工具类了。
在不同目录下:sys.path.append(r'D:\Python\test') - 将文件所在目录添加进import 模块中 from FileUtils(文件名)import FileUtils 这样就可以使用了FileUtils 这个工具类了。
以下既是FileUtils.py 文件的内容。
import osclass FileUtils(object):'''用于操作文件的工具类:version 1.0:Python version : 3.6:author : YJK923'''def read(self,file_name,mode):'''读取文件内容,返回文件内容,类型为字符串,若文件不存在,则返回空:prarm file_name : 文件名mode : 打开模式,常用方式r 或rbr : 以读方式打开,只能读文件rb : 以二进制读方式打开,只能读文件rt : 以文本读方式打开,只能读文件rb+ : 以二进制方式打开,可以读写文件'''try:with open(file_name,mode) as f:f.seek(0) # 移动文件指针content = f.read()return contentexcept Exception as e :print(e)def readline(self,file_name):'''一行一行的读取文件:param : file_name : 文件名'''try:with open(file_name,'r') as f:for line in f:print(line)except Exception as e:print(e)def write(self,file_name,content,mode):'''清空文件并写入content:param file_name : 文件名content : 写入内容mode : 打开模式,常用方式w 或wbw : 以写的方式打开,只能写文件,若文件不存在,先创建,再写wb : 以二进制写方式打开,只能写文件,若文件不存在,先创建再写,反之,清空之后再写wt : 以文本方式打开,只能写文件,若文件不存在,先创建再写,反之,清空之后再写'''with open(file_name,mode) as f:f.write(str(content))def append_write(self,file_name,content):'''追加文件写入content:param file_name : 文件名content : 追加内容'''with open(file_name,'a+') as f:f.write(str(content))def clear(self,file_name):'''清空文件内容:param: file_name : 文件名'''with open(file_name,'wb') as f:f.truncate() # 清空文件内容def remove(self,file_name):'''删除文件:param : file_name : 文件名'''try:os.remove(file_name)except Exception as e:print(e)def tell(self,file_name):'''获取文件中指针的值:param : file_name : 文件名'''try:with open(file_name,'a+') as f:L = f.tell()return Lexcept Exception as e:print(e)def copyfile(self,source_name,target_name): '''复制文件,复制之后的文件在同一级目录中 :param : source_name : 原文件名target_name : 复制之后的文件名'''try:with open(source_name,'rb') as f1, open(target_name,'wb') as f2:f2.write(f1.read())except Exception as e:print(e)def movefile(self,source_name,path):'''移动文件到path 路径下示例:movefile('users.txt','D:\\FTPTest'):param : source_name : 原文件名称path : 移动之后的目录信息'''try:with open(source_name,'rb') as f1, open(path+'\\'+source_name,'wb') as f2:f2.write(f1.read())os.remove(source_name)except Exception as e:print(e)。
黑马程序员python笔记
黑马程序员python笔记#1 pip 包管理工具pip 是一种python 包管理工具,可以在 PyPI(Python Package Index)上找到(以前称为Cheeseshop)大量可用的Python 包。
它有效地支持用户安装和管理不同版本的依赖包,可以自由地安装、升级、删除和卸载各种依赖包,使用非常方便。
使用 pip 可以轻松地安装 Python 依赖包,步骤如下:(1)输入命令:pip install 包名(2)等待安装,Pip 会自动下载最新的版本并安装(3)安装完成,可以使用包#2 库库指的是用python编写的一些类、函数和变量的集合,可以被一个程序重复利用无需自行编写,这就是“库”的概念。
使用库可以减少重复性的代码的编写,同时也可以更专注的在程序的关键代码编写上,也可以更快的实现程序功能。
Python 标准库,也就是Python自带的类库,这些库可以直接使用,不需要另行安装。
Python 第三方库,这是一些第三方程序包提供的类库,可以使用pip进行安装。
#3 类和对象简单来说,类就是一种模版,它指定了如何创建对象,同时它也是实际对象的原型。
而对象就是使用类来定义的一种现实存在的实体。
Python类的定义和创建就是创建一个新类,然后在定义中添加属性和方法,利用class 语句来定义类,使用构造函数来实保对象实例。
实例化对象的方式是类名()。
#4 异常处理异常处理是指在程序运行过程中如果发生异常情况,则可以按照我们指定的方式进行处理,从而使程序不受影响,继续向下运行。
Python提供了try/except语句,可以让程序根据预先设定的异常错误类型进行处理,使程序可以强力生存下去。
例如,在某个函数中,当程序发现输入数据异常时,可以使用 try 和 except 语句来处理,从而避免程序崩溃,保证程序可以正常运行。
这样,我们就可以保证遇到异常情况时,可以执行比较保守的处理,而不是让程序直接崩溃,从而永久性损坏程序。
【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具
【⿊马18期Java毕业⽣】⿊马程序员Java全套资料+视频+⼯具Java学习路线图引⾔:⿊马程序员:深知⼴⼤爱好Java的⼈学习是多么困难,没视频没资源,上⽹花钱还⽼被骗。
为此我们历时⼀个⽉整理这套Java学习路线图,不管你是不懂电脑的⼩⽩,还是已经步⼊开发的⼤⽜,这套路线路你都值得拥有,⼩⽩看上⾯的视频可以成功学会Java并且顺利⼯作,⼤神看了上⾯的资源肯定会谆谆乐道,路线图的宗旨就是分享,专业,便利,让喜爱Java的⼈,都能平等的学习。
从今天起不要在找借⼝,不要再说想学Java却没有资源,赶快⾏动起来,Java等你来探索,⾼薪可能只差下载观看了。
获取更多资源+学习交流+问题解答,就加QQ:2212232413⼀、Java学习路线图—流程篇:⼆、Java学习路线图—视频篇:1、第⼀阶段-Java基础⼊门Java视频篇第⼀阶段-Java基础⼊门本阶段PHP课程共计11个知识点,2个免费学习视频推荐1、周期与⽬标:学习周期:35天学完后⽬标:可进⾏⼩型应⽤程序开发,对数据库进⾏基本的增删改查管理2、知识点:1)计算机基础知识(理解)计算机基础、DOS常⽤命令、Java概述、JDK配置、环境变量配置、Java程序⼊门2)编程基础(掌握)常量与变量、数据类型、运算符、流程控制语句、⽅法、数组3)⾯相对象(重点)类与对象、封装、继承、多态、抽象类、接⼝4)常⽤类(理解)常⽤类介绍、正则表达式5)集合(重点)Collection集合、List集合、Set集合、Map集合6)异常(理解)异常处理⽅式、⾃定义异常7)IO(掌握)File类、递归、字节流、字符流、转换流、缓冲流8)多线程(理解)多线程、线程池9)⽹络编程(理解)⽹络编程10)反射(理解)反射11)MySQL及JDBC开发(重点)MySQL数据库、JDBC、DBUtils、DBCP连接池3、该阶段免费配套视频1)(此免费视频对应上述1,2,3,4,5,6,7,8,9,10知识点)2)》(此免费视频对应上述1,2,3,4,5,6,7,8,9,10知识点)4、精品推荐视频张孝祥09年Struts开发视频教程张孝祥_Java⾼新技术2、第⼆阶段-JavaWeb阶段Java视频篇第⼆阶段-JavaWeb阶段本阶段PHP课程共计4个⼤知识点,4个免费学习视频推荐1、周期与⽬标:学习周期:33天学完后⽬标:可以仿制任何⽹站前端页⾯,解决⽹页浏览器兼容性问题,解决PC端和移动端兼容性问题;使⽤前端脚本进⾏相关⽹页功能特效编写,使⽤JavaWeb核⼼技术轻松写出任何⽹站功能模块,使⽤JavaWeb⾼级部分知识解决⽹站的相关⾼并发问题,⽆压⼒胜任javaEE开发⼯程师职位。
黑马程序员资料参考
目录北京黑马培训简介: (2)报名流程: (2)自学课程: (2)上课时间安排:(实行指纹打卡,迟到10天以上劝退!) (3)课程设置:(四个月集训) (3)培训费用: (3)师资力量:(部分) (3)往届课程参考: (6)黑马晨读资料: (14)(ref. full specialization) (22)CCP(communication[kə,mju:ni'keiʃən]control [kən'trəul]processor ['prəusesə]) 通信控制处理机 (27)MIPS(millions of instructions per second 每秒百万条指令 (30)学习路线图: (40)北京黑马培训 JAVA Android IOS北京黑马培训简介:报名流程:1.网上填写报名信息,并进入报名系统提交一封自荐信(3000字左右)2.下载基础测试,测试基础知识掌握情况。
(3天左右做完)3.根据基础测试结果,自学相应的技术视频4.需要写10篇技术blog、在黑马论坛与志同道合的朋友交流。
(积累技术分)5.技术储备好了,就可以参加入学考试了。
(一份试卷,一天内完成)6.预约老师,进行远程面试。
(面试时间30分钟以上,主要是技术性问题)自学课程:黑马程序员JavaEE+Android——开学前自学的Java课程(提供这些课程的视频下载)◇基础好:视频学习周期建议为5—10天,具体根据学生自学能力,自行合理安排时间。
第一阶段:Java基础(1-2天)●Java高级视频_IO输入与输出●Java高级视频_网络编程第二阶段:Java基础加强(3-4天)●2016年Java高新技术第三阶段:7k月薪面试题破解(2天)●交通灯管理系统视频●银行业务调度系统◇没有基础:视频学习周期建议为20-40天,具体根据学生自学能力,自行合理安排时间。
第一阶段:Java初级(8-15天)●Java开发前奏●Java编程基础●面向对象●多线程●JavaAPI第二阶段:Java基础(6-8天)●Java高级视频_IO输入与输出●图形用户界面GU●Java高级视频_网络编程第三阶段:Java基础加强(5-7天)●2016年Java高新技术第四阶段:7k月薪面试题破解(2-3天)●交通灯管理系统视频●银行业务调度系统上课时间安排:(实行指纹打卡,迟到10天以上劝退!)作息时间:早8:30——晚8:30早8:30——9:00 英语晨读时间,掌握软件开发常用词汇早9:00——12:00 上午上课时间12:00——14:00 午餐和午休时间14:00——17:00 下午上课时间17:00——18:00 晚餐时间18:00——20:30 晚自习时间课程设置:(四个月集训)第一阶段:Html+CSS+JavaScript基础第二阶段:JavaWEB+JavaMail开发技术+网上银行交易系统+网上在线支付第三阶段:Android核心基础第四阶段:Android高级+Git版本管理+linux+Webservice技术第五阶段:Android项目实战:手机卫士+321播放器+红孩子电子商城+植物大战僵尸+智能短信分类管理+豆瓣客户端+手机彩票等等第六阶段:就业面试与指导、现场招聘一个班级有7、8个讲师,其中3个主讲班型:大班70人左右上课形式:讲师一天讲5个小时左右,讲课过程中每敲一行代码,讲解一行代码;课下学员自己找时间练习。
黑马程序员安卓教程:ADB 简介
ADB 简介
一、ADB介绍
adb 是Android Debug Bridge 的简称,通过adb 可以在Eclipse 中通过DDMS 来调试Android 程序,adb
启动时会占用5554端口,因此要避免其他应用跟该端口冲突。
默认情况下所以当我们运
行Eclipse时adb进程就会自动运行。
adb 还可以通过命令行使用,前提是将adb.exe 所在路径已经配置到了系统环境变量。
adb.exe 位于
sdk/platform-tools 目录下。
环境变量的配置跟JDK 相似,不再赘述。
二、ADB常用命令
1、adb devices 列出当前连接上所有设备
2、adb install xxx.apk 将xxx.apk 安装到模拟器上
3、adb uninstall 包名卸载应用
4、adb push <本地路径><远程路径>将本地文件上
传到模拟器上5、adb pull <远程路径><本地路径>
将模拟器上文件下载到本地
6、adb kill-server 杀死adb 进程
7、adb start-server 启动adb 进程
8、adb shell 进入Linux shell 命令行。
黑马程序员安卓教程:数据库查询所有数据之显示
黑马程序员安卓教程:数据库查询所有数据之显示查询数据库表中所有记录的方法已经编写完成,那么接下来就是将查询返回的数据记录显示在手机界面上,具体操作如下。
1.编写xml布局文件根据需求设计UI布局,当点击增加按钮时,先向数据库中添加数据记录;当点击查看按钮时则从数据库中查询所有的记录并显示在手机界面。
页面效果如图1-1所示:图1-1所示上图页面所对应的xml代码如图1-2所示:<LinearLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity" ><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="addFakeData"android:text="添加模拟数据" /><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="show"android:text="显示全部" /><TextViewandroid:id="@+id/tv_info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView" /></LinearLayout>2.添加监听事件●点击“添加模拟数据”按钮时响应主Activity的addFakeData方法,向数据库添加数据记录,代码如例1-1:例1-1/*** 添加一些模拟的数据* @param view*/public void addFakeData(View view){l ong basenumber = 135********l;f or(int i = 0;i<100;i++){dao.add("张三"+i, String.valueOf(basenumber+i));}T oast.makeText(this, "数据添加完毕", 0).show();}例1-1使用for循环向数据库添加100条记录,添加完成之后弹出toast。
黑马程序员安卓教程:数据库之查询全部记录
数据库之查询全部记录在项目03数据库的第二种增删改查中,我们查寻的只是一条数据记录,那么如何执行sql语句查询数据库表中全部的记录呢?下面是查询全部数据记录的方法。
1.新建项目复制粘贴03数据库的第二种增删改查的项目代码,修改项目名称为:04数据库数据的显示,修改包名为:com.itheima.dbshow01,在项目中导入更新之后的R文件,至此,项目部署完成。
2.编写业务方法在业务类中编写查询数据库全部数据记录的方法,返回值是数据库表中所有记录的集合,操作如下:编写业务bean(实体类),并重写了该类的toString方法,代码如例1-1:例1-1package com.itheima.dbcrud.domain;/*** 业务bean 存放person数据* @author Administrator**/public class Person {private int id;private String name;private String phone;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "name=" + name + ", phone=" + phone;}} 在业务类中编写查询方法,代码如例1-2: 例1-2/*** 查询全部的person 信息* @return person 信息的集合*/public List<Person> findAll(){List<Person> persons = new ArrayList<Person>();SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.query("info", null, null, null, null, null, null);while(cursor.moveToNext()){int id = cursor.getInt(0);String name = cursor.getString(1);String phone = cursor.getString(2);Person person = new Person();person.setId(id);person.setName(name);person.setPhone(phone);persons.add(person);person = null;}return persons; } 例1-2在查询数据库表中全部的数据记录时,调用了google 提供的API ,返回值是一个游标,该游标指向结果集的标题栏,向下移动游标读取结果集的数据记录,然后将每一条记录实例化一个bean 实体,最后将该实体放入一个list 集合中。
Java获取指定包名下的所有类的全类名的解决方案
Java 获取指定包名下的所有类的全类名的解决⽅案最近有个需求需要获取⼀个指定包下的所有类的全类名,因此特意写了个获取指定包下所有类的全类名的⼯具类。
在此记录⼀下,⽅便后续查阅⼀、思路通过ClassLoader 来查找指定包,如果是在classes ⽂件夹下的class ⽂件,则⽤遍历⽂件的⽅式来获取该包下的所有类名。
如果这个包名是jar 包⾥⾯的,那么需要通过遍历jar 包内⽂件的⽅式来获取该包下的所有类的类名⼆、代码代码如下 package com mon.utils;import java.io.File;import java.io.IOException;import .JarURLConnection;import .URL;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.jar.JarEntry;import java.util.jar.JarFile;/** * ClazzUtils * @author ZENG.XIAO.YAN * @version 1.0 */public class ClazzUtils { private static final String CLASS_SUFFIX = ".class"; private static final String CLASS_FILE_PREFIX = File.separator + "classes" + File.separator; private static final String PACKAGE_SEPARATOR = "."; /** * 查找包下的所有类的名字 * @param packageName * @param showChildPackageFlag 是否需要显⽰⼦包内容 * @return List 集合,内容为类的全名 */ public static List<String> getClazzName(String packageName, boolean showChildPackageFlag ) { List<String> result = new ArrayList<>(); String suffixPath = packageName.replaceAll("\\.", "/"); ClassLoader loader = Thread.currentThread().getContextClassLoader(); try { Enumeration<URL> urls = loader.getResources(suffixPath); while (urls.hasMoreElements()) { URL url = urls.nextElement(); if (url != null ) { String protocol = url.getProtocol(); if ("file".equals(protocol)) { String path = url.getPath();System.out.println(path);result.addAll(getAllClassNameByFile(new File(path), showChildPackageFlag));} else if ("jar".equals(protocol)) { JarFile jarFile = null ; try { jarFile = ((JarURLConnection) url.openConnection()).getJarFile(); } catch (Exception e){ e.printStackTrace(); } if (jarFile != null ) { result.addAll(getAllClassNameByJar(jarFile, packageName, showChildPackageFlag));1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253}}}}} catch (IOException e) {e.printStackTrace();}return result;}/*** 递归获取所有class ⽂件的名字* @param file* @param flag 是否需要迭代遍历* @return List*/private static List<String> getAllClassNameByFile(File file, boolean flag) {List<String> result = new ArrayList<>();if (!file.exists()) {return result;}if (file.isFile()) {String path = file.getPath();// 注意:这⾥替换⽂件分割符要⽤replace 。
如何获取包下所有类中的注解的值(java工具类)
如何获取包下所有类中的注解的值(java⼯具类)获取包下所有类中注解的值作⽤:这个⼯具类主要的作⽤就是获取类中的注解的值。
应⽤场景:做权限的时候获取@RequestMapping();的值,⾃动添加到数据库中。
/*** getRequestMappingValue⽅法描述:* 作者:thh* ⽇期:2016年7⽉18⽇下午5:41:00* 异常对象:@param packageName* 异常对象:@return*/public static List<String> getRequestMappingValue(String packageName) {GetAnnotationValueUtil getAnnotationValueUtil = new GetAnnotationValueUtil();//第⼀个class类的集合List<Class<?>> classes = new ArrayList<Class<?>>();//是否循环迭代boolean recursive = true;//获取包的名字并进⾏替换String packageDirName = packageName.replace('.', '/');//定义⼀个枚举的集合并进⾏循环来处理这个⽬录下的⽂件Enumeration<URL> dirs;try {//读取指定package下的所有classdirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);while (dirs.hasMoreElements()){URL url = dirs.nextElement();//得到协议的名称String protocol = url.getProtocol();//判断是否以⽂件的形式保存在服务器上if ("file".equals(protocol)) {//获取包的物理路径String filePath = URLDecoder.decode(url.getFile(), "UTF-8");//以⽂件的⽅式扫描整个包下的⽂件并添加到集合中findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);}}} catch (IOException e) {e.printStackTrace();}List<String> stringList = new ArrayList<String>();for (Class<?> clazz : classes) {//循环获取所有的类Class<?> c = clazz;//获取类的所有⽅法Method[] methods = c.getMethods();for (Method method : methods) {//获取RequestMapping注解RequestMapping annotation = method.getAnnotation(RequestMapping.class);if (annotation != null) {//获取注解的value值String[] value = annotation.value();for (String string : value) {//放⼊List集合stringList.add(string);}}}}return stringList;}/*** findAndAddClassesInPackageByFile⽅法描述:* 作者:thh* ⽇期:2016年7⽉18⽇下午5:41:12* 异常对象:@param packageName* 异常对象:@param packagePath* 异常对象:@param recursive* 异常对象:@param classes*/public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, List<Class<?>> classes){ //获取此包的⽬录建⽴⼀个FileFile dir = new File(packagePath);//如果不存在或者也不是⽬录就直接返回if (!dir.exists() || !dir.isDirectory()) {return;}//如果存在就获取包下的所有⽂件包括⽬录File[] dirfiles = dir.listFiles(new FileFilter() {//⾃定义过滤规则如果可以循环(包含⼦⽬录) 或则是以.class结尾的⽂件(编译好的java类⽂件)public boolean accept(File file) {return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));}});//循环所有⽂件for (File file : dirfiles) {//如果是⽬录则继续扫描if (file.isDirectory()) {findAndAddClassesInPackageByFile(packageName + "." + file.getName(),file.getAbsolutePath(),recursive,classes);}else {//如果是java类⽂件去掉后⾯的.class 只留下类名String className = file.getName().substring(0, file.getName().length() - 6);try {//添加到集合中去classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + className));} catch (ClassNotFoundException e) {e.printStackTrace();}}}}java 类,变量,⽅法上注解值的获取⾸先定义三个注解类, 分别适⽤于类,成员变量, ⽅法@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface LeiMode {public int value() default 1;}@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface FiledMode {public int value() default 1;}@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface TreahMode {public int value() default 1;}然后,定义⼀个类,使⽤了注解@LeiMode(5)public class AnnotationDemo {@FiledMode(10)private int itest;@TreahMode()private void test(){}}1.获取类上的注解值LeiMode annotation = AnnotationDemo.class.getAnnotation(LeiMode.class);System.out.println(annotation.value());2.获取所有变量,并获取指定⽅法上的注解信息Field[] fields = AnnotationDemo.class.getDeclaredFields();Field field = null;for(Field f : fields){if(f.getName().equals("itest")){field = f;break;}}FiledMode annotation = field.getAnnotation(FiledMode.class);System.out.println(annotation.value());3.获取指定变量上的注解信息Field field = AnnotationDemo.class.getDeclaredField("itest");FiledMode annotation = field.getAnnotation(FiledMode.class);System.out.println(annotation.value());4.获取所有⽅法,并获取指定⽅法上的注解信息Method[] methods = AnnotationDemo.class.getDeclaredMethods(); //可以获取私有⽅法和公有⽅法, getMethods() 获取公有⽅法 Method meth = null;for(Method method : methods){if(method.getName().equals("test")){meth = method;break;}}Annotation annotation = meth.getAnnotations()[0];TreahMode mode = (TreahMode) annotation;System.out.println(mode.value());5.获取指定⽅法上的注解信息Method method = AnnotationDemo.class.getDeclaredMethod("test", null);//可以获取私有⽅法和公有⽅法System.out.println(method);Annotation[] annotations = method.getAnnotations();Annotation annotation = annotations[0];System.out.println(annotation);TreahMode mode = (TreahMode) annotation;System.out.println(mode.value());以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
如何获取指定模块下所有的类
如何获取指定模块下所有的类前⾔在使⽤scrapy时,运⾏爬⾍仅需要通过scrapy crawl 爬⾍名就可启动我们写好的爬⾍,那么scrapy是如何通过名称找到爬⾍类的呢?通过分析源码可窥见⼀⼆,同时也可从中找出获取指定模块下的所有类的⽅法。
scrapy源码分析在scrapy.spiderloader.SpiderLoader中,可以发现⼀个名为_load_all_spiders的⽅法,通过名称不难看出,该⽅法⽤于读取所有的爬⾍。
再看源码(为便于理解,省掉其中部分内容):def _load_all_spiders(self):for name in self.spider_modules:try:for module in walk_modules(name):self._load_spiders(module)except ImportError:...self._check_name_duplicates()这⾥,self.spider_modules即为scrapy项⽬中配置⽂件中的SPIDER_MODULES配置项。
默认情况下该配置项指向项⽬爬⾍中的spiders⽂件夹。
这⾥通过对配置项的遍历,找到每⼀个爬⾍模块,再调⽤walk_modules函数获取模块下的所有⼦模块(包含其本⾝),然后找到每⼀个模块中的spider类(也就是self._load_spiders⽅法做的事情)。
接下来追溯到walk_modules查看其代码:def walk_modules(path):"""读取模块及其下⾯的所有⼦模块并返回For example: walk_modules('scrapy.utils')"""mods = []mod = import_module(path)mods.append(mod)if hasattr(mod, '__path__'):for _, subpath, ispkg in iter_modules(mod.__path__):fullpath = path + '.' + subpathif ispkg:mods += walk_modules(fullpath)else:submod = import_module(fullpath)mods.append(submod)return mods这⾥对于注释做了简单的翻译并省掉⼀部分⽆关紧要的内容。
黑马程序员python基础班笔记之文件和目录常用命令
黑马程序员:p y t h o n基础班笔记之文件和目录常用命令目标•查看目录内容o ls•切换目录o cd•创建和删除操作o toucho rmo mkdir•拷贝和移动文件o cpo mv•查看文件内容o cato moreo grep•其他o echoo重定向> 和>>o管道|01. 查看目录内容终端实用技巧1> 自动补全•在敲出文件/目录/命令的前几个字母之后,按下tab 键o如果输入的没有歧义,系统会自动补全o如果还存在其他文件/目录/命令,再按一下tab 键,系统会提示可能存在的命令2> 曾经使用过的命令•按上/下光标键可以在曾经使用过的命令之间来回切换•如果想要退出选择,并且不想执行当前选中的命令,可以按ctrl + cls 命令说明•ls 是英文单词list的简写,其功能为列出目录的内容,是用户最常用的命令之一,类似于DOS下的dir 命令Linux 下文件和目录的特点•Linux 文件或者目录名称最长可以有256 个字符•以 . 开头的文件为隐藏文件,需要用-a 参数才能显示•.代表当前目录•..代表上一级目录ls 常用选项参数含义-a 显示指定目录下所有子目录与文件,包括隐藏文件-l 以列表方式显示文件的详细信息-h 配合-l 以人性化的方式显示文件大小计算机中文件大小的表示方式(科普)单位英文含义字节 B(Byte)在计算机中作为一个数字单元,一般为8 位二进制数千K(Kibibyte) 1 KB = 1024 B,千字节(1024 = 2 ** 10)兆M(Mebibyte) 1 MB = 1024 KB,百万字节千兆 G(Gigabyte) 1 GB = 1024 MB,十亿字节,千兆字节太T(Terabyte)1 TB = 1024 GB,万亿字节,太字节拍P(Petabyte)1 PB = 1024 TB,千万亿字节,拍字节艾E(Exabyte) 1 EB = 1024 PB,百亿亿字节,艾字节泽Z(Zettabyte) 1 ZB = 1024 EB,十万亿亿字节,泽字节尧Y(Yottabyte) 1 YB = 1024 ZB,一亿亿亿字节,尧字节ls 通配符的使用通配符含义* 代表任意个数个字符代表任意一个字符,至少1 个[] 表示可以匹配字符组中的任一一个[abc] 匹配a、b、c 中的任意一个[a-f] 匹配从a 到f 范围内的的任意一个字符02. 切换目录cd•cd 是英文单词change directory的简写,其功能为更改当前的工作目录,也是用户最常用的命令之一注意:Linux 所有的目录和文件名都是大小写敏感的命令含义cd 切换到当前用户的主目录(/home/用户目录)cd ~ 切换到当前用户的主目录(/home/用户目录)cd . 保持在当前目录不变命令含义cd .. 切换到上级目录cd - 可以在最近两次工作目录之间来回切换相对路径和绝对路径•相对路径在输入路径时,最前面不是/或者~,表示相对当前目录所在的目录位置•绝对路径在输入路径时,最前面是/或者~,表示从根目录/家目录开始的具体目录位置03. 创建和删除操作touch•创建文件或修改文件时间o如果文件不存在,可以创建一个空白文件o如果文件已经存在,可以修改文件的末次修改日期mkdir•创建一个新的目录选项含义-p 可以递归创建目录新建目录的名称不能与当前目录中已有的目录或文件同名rm•删除文件或目录使用rm 命令要小心,因为文件删除后不能恢复选项含义-f 强制删除,忽略不存在的文件,无需提示-r 递归地删除目录下的内容,删除文件夹时必须加此参数04. 拷贝和移动文件序号命令对应英文作用01 tree [目录名] tree 以树状图列出文件目录结构02 cp 源文件目标文件copy 复制文件或者目录03 mv 源文件目标文件move 移动文件或者目录/文件或者目录重命名tree•tree 命令可以以树状图列出文件目录结构选项含义选项含义-d 只显示目录cp•cp 命令的功能是将给出的文件或目录复制到另一个文件或目录中,相当于DOS下的copy 命令选项含义-i 覆盖文件前提示-r 若给出的源文件是目录文件,则cp 将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名mv•mv 命令可以用来移动文件或目录,也可以给文件或目录重命名选项含义-i 覆盖文件前提示05. 查看文件内容序号命令对应英文作用序号命令对应英文作用01 cat 文件名concatenate查看文件内容、创建文件、文件合并、追加文件内容等功能02 more 文件名more 分屏显示文件内容03 grep 搜索文本文件名grep 搜索文本文件内容cat•cat 命令可以用来查看文件内容、创建文件、文件合并、追加文件内容等功能•cat 会一次显示所有的内容,适合查看内容较少的文本文件选项含义-b 对非空输出行编号-n 对输出的所有行编号Linux 中还有一个nl 的命令和cat -b 的效果等价more•more 命令可以用于分屏显示文件内容,每次只显示一页内容•适合于查看内容较多的文本文件使用more 的操作键:操作键功能空格键显示手册页的下一屏Enter 键一次滚动手册页的一行b 回滚一屏f 前滚一屏q 退出/word 搜索word字符串grep•Linux 系统中grep 命令是一种强大的文本搜索工具•grep允许对文本文件进行模式查找,所谓模式查找,又被称为正则表达式,在就业班会详细讲解选项含义-n 显示匹配行及行号-v 显示不包含匹配文本的所有行(相当于求反)-i 忽略大小写•常用的两种模式查找参数含义参数含义^a 行首,搜寻以a开头的行ke$ 行尾,搜寻以ke结束的行06. 其他echo 文字内容•echo 会在终端中显示参数指定的文字,通常会和重定向联合使用重定向> 和>>•Linux 允许将命令执行结果重定向到一个文件•将本应显示在终端上的内容输出/追加到指定文件中其中•> 表示输出,会覆盖文件原有的内容•>> 表示追加,会将内容追加到已有文件的末尾管道|•Linux 允许将一个命令的输出可以通过管道做为另一个命令的输入•可以理解现实生活中的管子,管子的一头塞东西进去,另一头取出来,这里| 的左右分为两端,左端塞东西(写),右端取东西(读)常用的管道命令有:•more:分屏显示内容•grep:在命令执行结果的基础上查询指定的文本。
黑马程序员面试自我介绍
黑马程序员面试自我介绍篇一:黑马程序员面试题1、(黑马点招面试题):有类似这样的字符串:”,,,,,”请按照要求,依次完成以下试题。
以逗号作为分隔符,把已知的字符串分成一个String类型的数组,数组中的每一个元素类似于”“,”“这样的字符串把数组中的每一个元素以”.”作为分隔符,把”.”左边的元素作为key,右边的元素作为value,封装到Map中,Map 中的key和value都是Object类型。
把map中的key封装的Set中,并把Set中的元素输出。
把map中的value封装到Collection 中,把Collection中的元素输出。
2、(黑马点招面试题):现有如下两个已知条件:在F盘有一个文件:,该文件内容如下:,id:5,id:6读取中为每一行,把每一行放入一个变量中用”,”分隔符把变量变成一个String 类型的数组。
读取数据中的第一个元素,利用java 反射机制创建对象。
3、编写程序,循环接收用户从键盘输入多个字符串,直到输入“end”时循环结束,并将所有已输入的字符串按字典顺序倒序打印。
4、编写一个程序,把指定目录下的所有的带.java文件都拷贝到另一个目录中,拷贝成功后,把后缀名是.java的改成.txt。
5、编写一个类A,增加一个实力方法showString,用于打印一条字符串,在编写一个类TestA ,作为客户端,用键盘输入一个字符串,改字符串就是类A的全名,使用反射机制创建该类的对象,并调用该对象中的方法showString。
6、键盘录入5个数据,存储到一个数组中,取最大值和最小值。
7、取出一个字符串中字母出现的次数。
如:字符串:”abcdekka27qoq” ,输出格式为:abk...8、向泛型为Integer的ArrayList中添加一个String类型的元素9、定义一个文件输入流,调用read 方法将文件中的所有内容打印出来。
11、编写程序,循环接收用户从键盘输入多个字符串,直到输入“end”时循环结束,并将所有已输入的字符串按字典顺序倒序打印。
黑马程序员C#学习笔记
黑马程序员C#学习笔记错误的理解希望能够得到大家的指正,谢谢!/*实现了IDisposable接口的所有的对象在使用完以后要进行Dispose()资源的释放,可以使用using(){}进行资源管理*///创建连接是非常耗时的,因此不要每次操作都创建连接。
SQL语句中的关键字应该大写。
//1个数据库能够承载的连接是有限的,所以SqlConnection在程序中不能一直保持Open。
//对于数据库来说,连接是最宝贵的资源,用完了以后一定要Close、Dispose。
// 类是对象的抽象,而对象是类的具体实例。
类是抽象的,不占用内存,而对象是具体的,占用存储空间。
//元数据:用于描述要素、数据集或数据集系列的内容、覆盖范围、质量、管理方式、数据的所有者、数据的提供方式等有关的信息。
元数据最本质、最抽象的定义为:data about data(关于数据的数据)。
它是一种广泛存在的现象,在许多领域有其具体的定义和应用。
//元数据在软件构造领域定义:在程序中不是被加工的对象,而是通过其值的改变来改变程序的行为的数据。
它在运行过程中起着以解释方式控制程序行为的作用。
在程序的不同位置配置不同值的元数据,就可以得到与原来等价的程序行为。
.NET Framework基础类型:.NET所有类型都继承自System.Object。
C#类型体系包含两种类型:值类型,引用类型。
值类型继承自System.ValueType。
而System.ValueType继承自System.Object。
指针:在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)。
指针一般出现在比较近机器语言的语言,如汇编语言或C语言。
在使用一个指针时,一个程序既可以直接使用这个指针所存储的内存地址,又可以使用这个地址里存储的变量或函数的值。
寄存器:寄存器是中央处理器内的组成部分。
寄存器是有限存储容量的高速存储部件,它们可用来暂存指令、数据和位址。
黑马程序员:DBUtils讲义(汇总).doc
黑马程序员:DBUtils讲义今日内容介绍◆Properties配置文件◆DBUtils第1章properties配置文件1.1使用properties配置文件开发中获得连接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可。
通常情况下,我们习惯使用properties文件,此文件我们将做如下要求:1.文件位置:任意,建议src下2.文件名称:任意,扩展名为properties3.文件内容:一行一组数据,格式是“key=value”.a)key命名自定义,如果是多个单词,习惯使用点分隔。
例如:jdbc.driverb)value值不支持中文,如果需要使用非英文字符,将进行unicode转换。
1.2创建配置文件在项目跟目录下,创建文件,输入“db.properties”文件名。
●文件中的内容driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mydbuser=rootpassword=root1.3加载配置文件:Properties对象对应properties文件处理,开发中也使用Properties对象进行。
我们将采用加载properties文件获得流,然后使用Properties对象进行处理。
JDBCUtils.java中编写代码public class JDBCUtils {private static String driver;private static String url;private static String user;private static String password;// 静态代码块static {try {// 1 使用Properties处理流// 使用load()方法加载指定的流Properties props = new Properties();Reader is = new FileReader("db.properties");props.load(is);// 2 使用getProperty(key),通过key获得需要的值,driver = props.getProperty("driver");url = props.getProperty("url");user = props.getProperty("user");password = props.getProperty("password");} catch (Exception e) {throw new RuntimeException(e);}}/*** 获得连接*/public static Connection getConnection() {try {// 1 注册驱动Class.forName(driver);// 2 获得连接Connection conn = DriverManager.getConnection(url, user, password);return conn;} catch (Exception e) {throw new RuntimeException(e);}}}1.4使用JDBCUtils工具类测试类public class Demo {@Testpublic void insert(){try{//1,获取连接对象Connection conn = JDBCUtils.getConnection();//2,指定要执行的SQL语句String sql = "INSERT INTO zhangwu(name,money,parent) VALUES(?,?,?)";//4,获取SQL语句的执行对象PreparedStatementPreparedStatement ppstat = conn.prepareStatement(sql);//5,执行SQL语句ppstat.setString(1, "股票收入");ppstat.setDouble(2, 5000);ppstat.setString(3, "收入");int line = ppstat.executeUpdate();//6,处理结果集System.out.println("line=" + line);//7,关闭连接ppstat.close();conn.close();} catch(SQLException e){throw new RuntimeException(e);}}}第2章DBUtils如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分享一个获取指定包名下所有类的工具类,代码如下1.import java.io.File;2.import java.io.FileFilter;3.import ng.annotation.Annotation;4.import .JarURLConnection;5.import .URL;6.import java.util.ArrayList;7.import java.util.Enumeration;8.import java.util.List;9.import java.util.jar.JarEntry;10.import java.util.jar.JarFile;11.12.public class ClassUtil {13. // 获取指定包名下的所有类14.public static List<Class<?>> getClassList(String packageName,boolean isRecursive) {15. List<Class<?>> classList = new ArrayList<Class<?>>();16. try {17. Enumeration<URL> urls =Thread.currentThread().getContextClassLoader().getResources(packageName .replaceAll("\\.", "/"));18. while (urls.hasMoreElements()) {19. URL url = urls.nextElement();20. if (url != null) {21. String protocol = url.getProtocol();22. if (protocol.equals("file")) {23. String packagePath = url.getPath();24. addClass(classList, packagePath, packageName,isRecursive);25. } else if (protocol.equals("jar")) {26. JarURLConnection jarURLConnection =(JarURLConnection) url.openConnection();27. JarFile jarFile =jarURLConnection.getJarFile();28. Enumeration<JarEntry> jarEntries =jarFile.entries();29. while (jarEntries.hasMoreElements()) {30.JarEntry jarEntry =jarEntries.nextElement();31. String jarEntryName = jarEntry.getName();32. if (jarEntryName.endsWith(".class")) {33. String className =jarEntryName.substring(0, stIndexOf(".")).replaceAll("/", ".");34. if (isRecursive ||className.substring(0, stIndexOf(".")).equals(packageName)) {35. classList.add(Class.forName(className));36. }37. }38. }39. }40. }41. }42. } catch (Exception e) {43. e.printStackTrace();44. }45. return classList;46. }47.48. // 获取指定包名下的所有类(可根据注解进行过滤)49.public static List<Class<?>> getClassListByAnnotation(StringpackageName, Class<? extends Annotation> annotationClass) {50. List<Class<?>> classList = new ArrayList<Class<?>>();51. try {52. Enumeration<URL> urls =Thread.currentThread().getContextClassLoader().getResources(packageName .replaceAll("\\.", "/"));53. while (urls.hasMoreElements()) {54. URL url = urls.nextElement();55. if (url != null) {56. String protocol = url.getProtocol();57. if (protocol.equals("file")) {58. String packagePath = url.getPath();59. addClassByAnnotation(classList, packagePath,packageName, annotationClass);60. } else if (protocol.equals("jar")) {61. JarURLConnection jarURLConnection =(JarURLConnection) url.openConnection();62. JarFile jarFile =jarURLConnection.getJarFile();63. Enumeration<JarEntry> jarEntries =jarFile.entries();64. while (jarEntries.hasMoreElements()) {65.JarEntry jarEntry =jarEntries.nextElement();66. String jarEntryName = jarEntry.getName();67. if (jarEntryName.endsWith(".class")) {68. String className =jarEntryName.substring(0, stIndexOf(".")).replaceAll("/", ".");69. Class<?> cls =Class.forName(className);70. if(cls.isAnnotationPresent(annotationClass)) {71. classList.add(cls);72. }73. }74. }75. }76. }77. }78. } catch (Exception e) {79. e.printStackTrace();80. }81. return classList;82. }83.84.private static void addClass(List<Class<?>> classList, StringpackagePath, String packageName, boolean isRecursive) {85. try {86. File[] files = getClassFiles(packagePath);87. if (files != null) {88. for (File file : files) {89. String fileName = file.getName();90. if (file.isFile()) {91. String className = getClassName(packageName,fileName);92. classList.add(Class.forName(className));93. } else {94. if (isRecursive) {95.String subPackagePath =getSubPackagePath(packagePath, fileName);96.String subPackageName =getSubPackageName(packageName, fileName);97.addClass(classList, subPackagePath,subPackageName, isRecursive);98. }99. }100. }101. }102. } catch (Exception e) {103. e.printStackTrace();104. }105. }106.107. private static File[] getClassFiles(String packagePath) {108. return new File(packagePath).listFiles(new FileFilter() { 109. @Override110. public boolean accept(File file) {111.return (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory();112. }113. });114. }115.116.private static String getClassName(String packageName, String fileName) {117. String className = fileName.substring(0, stIndexOf("."));118. if (ng.StringUtil.isNotEmpty(packageName)) {119. className = packageName + "." + className;120. }121. return className;122. }123.124. private static String getSubPackagePath(String packagePath, String filePath) {125. String subPackagePath = filePath;126. if (ng.StringUtil.isNotEmpty(packagePath)) {127. subPackagePath = packagePath + "/" + subPackagePath; 128. }129. return subPackagePath;130. }131.132. private static String getSubPackageName(String packageName, String filePath) {133. String subPackageName = filePath;134. if (ng.StringUtil.isNotEmpty(packageName)) {135. subPackageName = packageName + "." + subPackageName; 136. }137. return subPackageName;138. }139.140. private static void addClassByAnnotation(List<Class<?>> classList, String packagePath, String packageName, Class<? extends Annotation> annotationClass) {141. try {142. File[] files = getClassFiles(packagePath);143. if (files != null) {144. for (File file : files) {145. String fileName = file.getName();146. if (file.isFile()) {147. String className = getClassName(packageName, fileName);148. Class<?> cls = Class.forName(className); 149. if (cls.isAnnotationPresent(annotationClass)) {150. classList.add(cls);151. }152. } else {153. String subPackagePath = getSubPackagePath(packagePath, fileName);154. String subPackageName = getSubPackageName(packageName, fileName);155. addClassByAnnotation(classList, subPackagePath, subPackageName, annotationClass);156. }157. }158. }159. } catch (Exception e) {160. e.printStackTrace();161. }162. }163.}。