黑马程序员——IO(Input Output)流总结(一)

时间:2019-05-13 16:14:07下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《黑马程序员——IO(Input Output)流总结(一)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《黑马程序员——IO(Input Output)流总结(一)》。

第一篇:黑马程序员——IO(Input Output)流总结(一)

IO(Input Output)流总结

(一)IO流是处理数据之间数据传输的。

Java对数据的操作是通过流的方式。

Java中用于操作IO流的对象都放在java.io包中。

流的分类:按照操作数据分为:字符流和字节流。

按照流向分为:输入流和输出流。

输入流:输出流:

字符流:

ReaderWriter

|--BufferedReader|--BufferedWriter

|--inputStreamReader|--OutputStreamWriter

|--FileReader|--FileWriter

字节流:

InputStreamOutputStream

|--FileInputStream|--FileOutputStream

InputStreamOutputStream

|--FilterInputStream|--FilterOutputStream

|--BufferedInputStream|--BufferedOutputStream

在计算机中存储的都是1和0的序列。也就是二进制的有序序列,不论是文本、音乐或者是视频。

那么为什么要在流中定义字节流和字符流呢?

这个与我们的字符编码方式有关。我们都知道世界上有很多种的语言,比如:ASCII、GB2312、GBK、UTF-8和Unicode等。

如果一个文本文件使用GB2312编码的方式存储的,如果我们用Unicode的编码方式来读取,那么就会出现乱码。所以字符流是一种特殊的流,在java中就定义了专门处理字符的流对象。

当我们拿到一个API文档我们应该如何使用呢?

1,确定要使用的功能。

2,查阅API看有没有相关的功能类。

3,如果没有,就分析需要如何自定义一个出来,并且要使用到那些相关功能的类,这些类在API中有没有定义。

4,不论有或者没有需要自定义一个,我们都要先查阅相关功能类的根类,那么查阅一个API的时候我们要注意一些什么呢?

5,找到相关功能根类,先看一下它是一个类,还是接口,还是抽象类,如果是接口或

者是抽象类我们就不能直接使用这个类,而要使用这个类的子类。

6,但是,我们不用急于先看它有哪些子类,我们先看一下它到底暴露了什么字段、构造函数和方法。

7,在查看暴露的信息时,我们要注意几点:

a.如果是static修饰的,说明是静态的,我们不用new对象也可以直接使用。

b.我们要确定自己要使用的方法将会返回的数据的类型,是void呢、String呢、int呢、还是其他的。查找的时候就重点找返回这些类型的方法。(注意:如果我们使用的类是一个使用单例设计模式设计的,那么他就没有构造函数,我们就一般可以通过静态的getIstance()方法获取相应的对象,这时我们就要找返回值是对象类型的方法。)

8,如果在根类中找到了需要的方法,但是根类又不能创建对象,那么我们就看看,继承这个根类的子类有哪些,一般子类都继承了父类的方法,所以子类可以直接调用父类的方法,并且子类又定义了一些自身特别的方法。

9,找到需要的类创建对象,或者找到相关功能的对象自定义一个需要的类。

下面我们按照以上的方法来阐述IO流的学习:

字节流:

字节流的根类有:读取流(Reader)、写入流(Writer)

根类都是abstract(抽象)的,我们不能直接创建对象,但是我们可以看一看父类都定义了什么方法。

Reader:

int read()

读取单个字符。

int read(char[] cbuf)

将字符读入数组。

abstractint read(char[] cbuf, int off, int len)

将字符读入数组的某一部分。

intread(CharBuffer target)

试图将字符读入指定的字符缓冲区。

abstractvoid close()

关闭该流并释放与之关联的所有资源。

FileReader:Reader的子类,可以创建对象,专门用来操作字符数据流的。

Writer:

void write(char[] cbuf)

写入字符数组。

abstractvoid write(char[] cbuf, int off, int len)

写入字符数组的某一部分。

void write(int c)

写入单个字符。

void write(String str)

写入字符串。

void write(String str, int off, int len)

写入字符串的某一部分。

abstractvoid close()

关闭此流,但要先刷新它。

abstractvoid flush()

刷新该流的缓冲。

写入流(Writer)在每次调用write()方法的时候都要flush()(刷新)一次,当然Writer也不能创建对象,我们可以使用他的子类FileWriter,FileWriter是专门处理字符写入流的类。

FileReader 和 FileWriter 为我们提供了操作字符数据流的一般方法,其中比较高效的就是自定义一个数组,用这个数组作为临时存储区,每次读取一块(装满数组)数据,然后再将这一块数据写入相应的目的地。这样就提高了效率,如果每次读取一个字符然后写入一个字符,就很低效,是不可取的。

自定一个数组为我们提高了效率,但是每次使用都要写很多代码,所以开发者就将这个数组封装为了一个特殊的对象。那就是缓冲区!BufferedReader(字符读取缓冲区)和BufferedWriter(字符写入缓冲区)。他是用的是装饰设计模式,是再不改变原来已定义类的基础上增强类的功能。

补充:BufferedReader的子类LineNumberReader,增加了int getLineNumber():获得当前行号的功能,我们可以在使用缓冲区的同时读取行号。

装饰设计模式:

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。

字符流学习完了,那么如果要学习字节流就会简单很多,我们通过查阅API知道:很多方法都似曾相识。所以,总结一下就是下面几点:

A.字节流分为:InputStream(读取流)和OutputStream(写入流)

B.字节流和字符流的功能基本相同,只不过传入的参数由字符流中的字节char,变成了字节中的byte。

C.字节流也具有缓冲区:

BufferedInputStream(字节读取缓冲区)和BufferedOutputStream(字节写入缓冲区)。方法与字符缓冲区相似。

第二篇:黑马程序员视频总结

面向对象:面向对象是相对于面向过程而言的。面向过程强调的是功能,面向对象将功能封装进对象,强调的是具有功能的对象。

类是对现实生活的描述。对象是一类事物实实在在存在的个体。

堆内存和栈内存:基本类型的变量和对象的引用存储在栈内存;用new创建的对象和数组存储在堆内存。

封装:隐藏对象的属性和实现细节,仅对外提供公共访问方法。原则:将不需要对外提供的内容都隐藏起来,将属性都隐藏,提供公共方法对其访问。好处:提高安全性,便于使用,提高重用性。

什么时候使用静态?成员变量:当对象中有共享数据时。成员函数:函数内部没有访问到非静态数据(对象的特有数据)。

帮助文档制作:/***/@author作者;@version 版本;@param 参数;@return 返回结果 命令:javadoc-d 文件夹-author-version xxx.java。将生成一系列网页。

静态代码块:static{}。用于给类进行初始化,只执行一次,优先于主函数。

Person p=new Person():

1、找到Person.class加载到内存。

2、执行static代码块。

3、在栈内存中开辟main()方法空间,并分配一个 变量p。

4、在堆内存中开辟实体空间。

5、进行属性的空间分配,并进行默认初始化。

6、对空间属性进行显示初始化。

7、实体的构造代码初始化。

8、调用对应的构造函数,进行构造函数初始化。

9、将实体空间首地址赋给p。单例:

class Single{

private Single(){} //私有化构造函数。

private static Single s = new Single();//静态方法要访问它,所以也要静态化。静态方法不能访问非静态的方法和属性。创建私有并静态的本类对象。

public static Single getInstance(){ //无法通过对象调用,只能是静态。定义公有并静态的方法,返回该对象。

return s;

}

}

//懒汉式:延迟加载方式。

class Single2{

private Single2(){}

private static Single2 s = null;

public static synchronized Single2 getInstance(){

if(s==null)

s = new Single2();

return s;

}

}

继承:提高代码复用性,并为多态打下基础。Java只支持单继承。多继承隐患:多个父类定义相同功能时,子类对象不确定要运行哪一个。重载:方法名相同,但参数不同的多个同名函数;

覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同

隐藏:父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。

多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

内部类:内部类可以直接访问外部类的成员,包括私有。外部类必须建立内部类对象才能访问内部类成员。

异常体系:error和exception

==和equals()的区别:“==”和“!=”比较的是“栈”中的内容(对象的地址),而equals()比较的是“堆”中的内容(对象的内容)。

多线程:建立线程两种方法:

1、继承Thread类;

2、实现Runnable接口。继承接口避免了单继承的局限性。

线程对象.setDaemon(true)设置守护线程。线程启动前调用,当正在运行的线程只有守护线程时,java虚拟机退出。

当a线程执行b线程的.join()方法时,a会等待b线程执行完才会执行。

线程对象.setPriority()设置线程优先级。

StringBuilder不是线程安全的,速度快;StringBuffer线程安全,慢。

泛型是一个类型安全机制,用于解决安全问题。

集合:

为方便存储和操作对象,出现集合类。数组可以存储对象,但长度固定,集合长度可变;数组可以存储基本数据类型,集合只能存储对象。

Collection:List和Set

List:有序,元素可以重复,有索引。

ArrayList,底层数据结构是数组。查找速度快。删除元素用equals()判断

LinkList,链表,增删速度快。

Vector。线程同步,数组,查找速度快。

Set:无序。元素唯一。

HashSet:底层数据结构式哈希表。通过hashCode()和equals()方法保持唯一性。如果元素hashCode值相同才会判断equals是否为true;

TreeSet:底层是二叉树。可以对元素进行排序。按自然顺序就是compareTo()。

实现排序的两种方法:

1、实现Comparable接口,覆盖comapreTo(Object obj)方法。

2、实现Comparator接口,覆盖compare(Object,Object)方法。

Map:

Hashtable,底层哈希表,不可以存储null值或键。线程同步。效率低。

HashMap,哈希表,允许使用null值或键。不同步,效率高。

TreeMap。底层是二叉树,线程不同步。可以给键进行排序。

获取Map元素的两种方法:

1、Set keyset,将Map集合中的键存入Set集合;

2、Set> mapEntry,将Map集合中的映射关系存入Set集合。

Collections:java集合的工具类,用于操作集合类。

Arrays集合:用于操作数组的工具类。

1.5新特性:可变参数,int...arr

静态导入:import static java.lang.System.*;用于导入静态方法;import java.lang.*;用于导入类文件。

System类:getProperties()方法获得返回系统属性Properties(Map集合子类)对象。Runtime类:运行时操作类。单例设计模式。

Calendar类:抽象类,用getInstance()获得对象。

Math类。

IO流:

常用基类:派生子类用父类名做后缀

字节流:InputStream,OutputStream

字符流:Reader,Writer

字符流:FileWriter,FileReader,需要flush();

字符流缓冲区:BufferedReader,BufferedWriter;要结合流才能使用。需要flush(),关闭缓冲区就是关闭缓冲区的流对象。

LineNumberReader(FileReader)类,getLineNumber()方法可以获得行号

字节流:FileOutputStream,FileInputStream。操作多媒体文件。

转换流:InputStreamReader,OutputStreamWriter。属于字符流的子类。In(System.in),out返回字节流。

System.setIn(InputStream),System.setOut(PrintStream);改变标准输入输出。

File类:

合并流:SequenceInnputStream。用vector的elements()得到Enumeration。

切割文件:循环里边创建流、关闭流。讲一个文件分部分存储在几个文件中。

java.Awt:需要调用本地系统方法实现功能。

javax.Swing:完全由java实现,增强移植性。

Component:

1、Container:Window,Panel

布局管理器:

1、FlowLayout,Panel默认布局;

2、BorderLayout,Fram默认。

TCP和UDP:TCP要经过三次握手建立连接,传输大量数据,可靠协议,效率低。UDP不需要建立连接,不可靠协议,速度快。

Socket:网络服务的一种机制,网络通信就是Socket间的通信,数据在两个Socket间通信。TCP:Socket,ServerSocket

UDP:DatagramSocket,DatagramPacket

加强:

overload:重载,存在于父类和子类、同类中。只能通过不同参数样式重载。

override:重写,存在于父类和子类之间。方法名、参数、返回值相同。子类方法不能缩小父类方法访问权限。不能抛出更多异常。

可变参数:int...arr

For循环增强:for(int i:int[])

枚举:让某个变量的取值只能为若干个固定值中的一个。

反射:在运行状态能够知道类的所有属性和方法,并调用对象的任意一个方法。获取类信息以及调用对象的方法。

类加载器:负责加载java类的字节码到虚拟机中。每个类加载器加载类时先委托给其上级加载器,当所有祖宗类加载器都没有加载到类,回到发起者类加载器时,还没加载到类,抛出ClassNotFoundException异常。

JavaBean:有set和get方法获得类属性的特殊java类。用于传递数据信息。

内省:IntroSpector,java语言对Javabean属性、事件的一些缺省处理方法。

Beanutils工具包

注解:@Override表示当前方法是覆盖父类的方法。

@Deprecated表示当前元素是不赞成使用的。

@SuppressWarnings 表示关闭一些不当的编译器警告信息。

Java系统默认三个类加载器:BootStrap,ExtClassLoader,AppClassLoader

创建动态类的实例对象:

1、通过实现的接口告诉要实现的动态类要实现哪些方法。

2、产生的类的字节码要有一个关联的类加载器对象。

3、执行代码的对象InvocationHandler。

代理:用Proxy类的getProxyClass(classLoader,interface)获得动态类的字节码文件。用反射获得构造器。用构造器的newInstance()InvocationHandler接口的对象做参数获得一个类对象。InvocationHandler对象重写pubic Object invoke(Object proxy,Method method,Object

[] args)方法返回method.invoke(target,args)。

创建动态代理对象步骤:

1、实现InvocationHandler 接口创建自己的调用处理器。重写invoke方法。

2、用Proxy.newProxyInstance(classLoader,new Class[]{Interface.class},handler}方法获得代理类实例。

Bank:

NumberManager类:产生客户

Private int lastNumber;

Private List queueNumber;

int synchronized generateNewManager():产生新客户号码。客户线程调用。

int synchronized fetchServiceNumber():取走客户号码。窗口线程调用。List是共享数据。需要互斥。

NumberMachine类:号码管理器,采用单例设计模式

private NumberManager commonManager;用get()返回对象。

private NumberManager expressManager;用get()访问。

private NumberManager vipManager;用get()访问。

Enum CustomerType COMMON,EXPRESS,VIP;

ServiceWindow类:窗口

private int windowId;窗口号码

enum CustomerType type;

public void start(){Executors.newSingleThreadExcutor().execute(new Runnable(){publicvoid run(){}})};根据type启动相应的窗口服务。

MainClass:main()函数类

开启5个普通窗口。

一个快速

一个vip

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(NewRunnable(){重写run},0,1,TimeUnit.SECONDS)。

第三篇:黑马程序员——IO(Input Output)流总结(二)

IO(Input Output)流总结

(二)刚开始观看毕老师的视屏的时候,感觉一会儿输出流,一会儿输入流的,一会儿System.out,一会儿又转换流的。很晕。

最后毕老师给了一个总结,归纳出了IO操作的规律。感觉总结的非常好,虽然刚看第一遍的时候还是很晕,不过现在终于融汇贯通。

下面我就用自己的理解,总结一下IO流操作的一般规律:

在使用IO操作流之前,我们要问自己一下四个问题:

A.源和目的都有吗?(初步确定体系)

B.源和目的操作的是字符吗?(确定体系)

C.源和目的的设备都是些什么?(辅助确定具体对象)

D.需要提高输入和输出的效率吗?

补充:源的设备:内存,硬盘,键盘

目的的设备:内存,硬盘,控制台

当明确了以上几点之后我们就可以确定到底应该使用那一个流对象。

Demo1:拷贝一个文本文件的副本。

分析:

A.源和目的都有。

所以,源可以选择:Reader或者InputStream

目的可以选择:Writer 或者 OutputStream

B.操作的都是字符数据。

所以,源应该选择:Reader

目的应该选择:Writer

C.源的设备是:硬盘。目的的设备是:硬盘。

所以:源应该使用:FileReader

目的应该使用:FileWriter

D.需要提高输入和输出效率。

所以可以使用相应的装饰类。

源使用:BufferedReader

目的使用:BufferedWriter

具体代码如下:

BufferedReader bufr = new BufferedReader(new FileReader(“1.txt”));BufferedWriter bufw = new BufferedWriter(new FileWriter(“copy_1.txt”));

Demo2:将从键盘输入的数据存储到文件中。

分析:

A.源和目的都有。

所以,源可以选择:Reader或者InputStream

目的可以选择:Writer 或者 OutputStream

B.操作的都是字符数据。

所以,源应该选择:Reader

目的应该选择:Writer

C.源的设备是:键盘。目的的设备是:硬盘。

因为源是键盘所以应该使用System.in,但是键盘是字节流,但是我们使用的体系应该是Reader(字符)体系的。所以要使用InputSreamReader(转换流)将字节流转换为字符流在进行操作。目的应该使用:FileWriter

D.需要提高输入和输出效率。

所以可以使用相应的装饰类。

源使用:BufferedReader

目的使用:BufferedWriter

具体代码如下:

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

BufferedWriter bufw = new BufferedWriter(new FileWriter(“copy_1.txt”));

转换流详解:

查阅api我们知道转换流是定义在字符体系中的,那么我们什么时候应该使用转换流呢?

InputStreamReader:是字节数据通向字符数据的桥梁。

当我们要将字节数据转换成字符数据时使用,在转换成字符数据时,我们必须指定字符编码方式,如GB2312、UTF-8等

如果我们转化的时候使用的编码是系统默认编码,那么我们可以使用FileReader。其实,FileReader就是对编码方式为系统默认的转换流(public InputStreamReader(InputStream in):创建一个使用默认字符集的 InputStreamReader。)的一个封装,这样使用起来比较简单。

OutputStreamWriter:是字符数据通向字节数据的桥梁。

当创建使用指定字符集的 OutputStreamWriter 时使用。

简单说就是,我们如果要输出一些文本到控制台上,那么我们知道控制台的标准输出流是System.out,是字节流,我们在操作时,就要将字符数据转化成字节数据,这样控制台才能正确显示,所以就用到了OutputStreamWriter。但是这个地方要注意,如果我们拿到一个文本他的编码方式是UTF-8,但是你的电脑是简体中文的。如果你在使用OutputStreamWriter的时候没有指明转换时使用的码表,那么系统就会按照系统默认的码表转换(一般是GBK)。这样肯定会出问题了,所以,记住了!当我们要指定编码方式的时候就使用转换流InputStreamReader和OutputStreamWriter。

Demo3:将从键盘输入字符的数据显示在屏幕上。

快速分析:

A.使用键盘,输入流就是System.in,但是输入的是字符,所以用到转换流:InputStreamReader(System.in)

B.输出到屏幕上,顾名思义就是控制台。所以输出流是System.out,因为是文本输出,所以使用OutputStreamWriter(System.out)

C.如果要提高输入输出效率,就得使用装饰类。

所以最终代码如下:

BufferedReaderbufr=

newBufferedReader(new InputStreamReader(System.in));

BufferedWriterbufw=

newBufferedWriter(new OutputStreamWriter(System.out));

如果要求改为将键盘输入的数据存入一个文件中,并按照UTF-8的编码形式。

BufferedReaderbufr=

newBufferedReader(new InputStreamReader(System.in));

BufferedWriterbufw=

newBufferedWriter(new OutputStreamWriter

(new PrintStream(“TransDemo.txt”), “UTF-8”));

第四篇:黑马程序员android开发笔记(一)

01、什么是3G 02、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、采用数据适配器ArryAdapter

39、常用数据适配器simpleAdapter 40、数据适配器总结

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代码移植到android 65、多线程下载文本页面的更新 66、显示意图激活另一个activity 67、隐式意图激活另一个activity 68、隐式意图的配置

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、代码编写ui 111、html创建ui 112、帧动画

113、代码创建创建的tween动画 114、xml文件定义动画 115、传感器简介 116、117、杀死进程 118、apk的安装 119、应用程序的反编译 120、动态创建fragment 121、用fragment创建一个选项卡 122、fragment的向下兼容性 123、fragment的生命周期 124、fragment之间的通讯 125、应用程序国际化

04、android的framewor简介

Wap:wait and play Wireless Makeup Language(WML)精简的html语言 Applications:android自带的基本上层应用 Aplication framework:应用程序框架 Librarics: Linux lernel:

05、两种虚拟机的比较

编译后文件格式:

jvm:.java->.class->.jar dalvik vm:.java->.dex->.odex 基于的架构:

jvm:基于栈的架构

dalvik vm:基于寄存器的架构

Cpu直接访问寄存器因此dalvik虚拟机的效率比jvm高

06、sdk的下载以及简介

->获取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,实际上是eclipse的插件)SDK具体内容

Android 4.2.2(API16)

->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.3

07、创建android模拟器

avd:android virture developer VGA: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包就是SDK

011、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:usersadministratorhello.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的文件夹,代表着这个模拟器被锁定了,如果把模拟器关掉,就没有程序占据这几个镜像资源了,那么这几个程序就会被自动删除。通常情况下不会出问题,开启时候创建文件,关闭时关闭文件,但是当电脑出现不正常状态时:比如蓝屏,停电关机时候这些资源还没来得及删除,模拟器就关闭了,因此开启时这些资源仍在,程序默认模拟器被占用,因此会重新开启一个模拟器。

->模拟器没有信号:

模拟器用socket桥接在电脑上

终结解决方案是给电脑连上网,分配一个IP->常见命令操作:

14、电话拨号器

->新建文件

->界面设置:文本框、点击按钮

->:一旦获得焦点,会立刻弹出,输入文本的软键盘->ctrl+x删除->ctrl+1提示

->设置点击事件:找到空间,然后设置点击事件,再点击事件里面获得了另外一

个空间的数据,激活一个intent->获得权限:清单文件中添加uses permision

15、点击事件的四种写法

->电话拨号器的优化:

每次拨打电话都会执行的操作是:查找控件,然后找到控件的文本,拨打电

话。其实每次拨打电话文本控件已经创建好了没有必要每次查找按钮之后再 查询控件。

package cn.wqrt.mobile;

import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;

public class MainActivity extends Activity {

private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(new MyListener());}

private class MyListener implementsandroid.view.View.OnClickListener{

@Override

public void onClick(View arg0){

String number = et_number.getText().toString().trim();//去除回车和空格

if(TextUtils.isEmpty(number)){

Toast.makeText(MainActivity.this, “号码不能为空”, Toast.LENGTH_SHORT).show();

return;

}

Intent intent = new Intent();

intent.setAction(intent.ACTION_CALL);

intent.setData(Uri.parse(“tel:”+number));

startActivity(intent);

}

}

@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;} }

->

1、点击事件的四种写法:

->给按钮注册点击事件:创建一个内部类定义点击事件。具体代码见上

button.setOnClickListener(new MyListener());

->

2、采用匿名内部类创建点击事件:

button.setOnClickListener(new OnClickListener()){

package cn.wqrt.mobile;

import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;

public class MainActivity extends Activity {

private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View arg0){

// TODO 自动生成的方法存根

callPhone();

}

});}

@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}

private void callPhone(){

String number = et_number.getText().toString().trim();//去除回车和空格

if(TextUtils.isEmpty(number)){

Toast.makeText(MainActivity.this, “号码不能为空”, Toast.LENGTH_SHORT).show();

return;

}

Intent intent = new Intent();

intent.setAction(intent.ACTION_CALL);

intent.setData(Uri.parse(“tel:”+number));

startActivity(intent);} } }

->

3、如果有很多的按钮点击事件,建议用这种方式:让Activity实现点击 事件的接口,每个按钮点击事件都设置成this,让该类实现 OnClickListener然后进行判断。package cn.wqrt.mobile;

import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(this);}

@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}

private void callPhone(){

String number = et_number.getText().toString().trim();//去除回车和空格

if(TextUtils.isEmpty(number)){

Toast.makeText(MainActivity.this, “号码不能为空”, Toast.LENGTH_SHORT).show();

return;

}

Intent intent = new Intent();

intent.setAction(intent.ACTION_CALL);

intent.setData(Uri.parse(“tel:”+number));

startActivity(intent);}

@Override public void onClick(View v){

// TODO 自动生成的方法存根

switch(v.getId()){

case R.id.bt_dial:

callPhone();

break;

} } }->

4、在布局文件中绑定一个点击的方法,如果点击按钮就会调用这个方法,通

过反射技术试图调用这个方法

布局文件中设置: package cn.wqrt.mobile;

import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;

public class MainActivity extends Activity {

private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);

}

@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}

public void dialButtonClick(View v){ callPhone();}

private void callPhone(){

String number = et_number.getText().toString().trim();//去除回车和空格

if(TextUtils.isEmpty(number)){

Toast.makeText(MainActivity.this, “号码不能为空”, Toast.LENGTH_SHORT).show();

return;

}

Intent intent = new Intent();

intent.setAction(Intent.ACTION_CALL);

intent.setData(Uri.parse(“tel:”+number));

startActivity(intent);} }

16、短信发送器

->界面的设计:两个large Text,一个Button

android:textColor 设置字体颜色

android:singleLine=“true” 设置是否是单行

android:lines=“5” 设置行数

windows下面的颜色是GBR,而android下需要输入的格式确实

RGB,所以需要转换

adb默认设置time out为5秒->内容设计:按钮-文本->判断->发送

导包的时候千万别导到gsm包,否则会显示过时;

发送没有历史记录 package com.example.sms;

import java.util.ArrayList;

import android.app.Activity;import android.os.Bundle;import android.telephony.SmsManager;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

private EditText et_number;private EditText et_content;

@Override protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button button =(Button)findViewById(R.id.bt_send);

et_number =(EditText)findViewById(R.id.et_number);

et_content =(EditText)findViewById(R.id.et_content);

button.setOnClickListener(this);}

@Override public boolean onCreateOptionsMenu(Menu menu){

// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);

return true;}

@Override public void onClick(View v){

// TODO 自动生成的方法存根

switch(v.getId()){

case R.id.bt_send:

String number = et_number.getText().toString().trim();

String content = et_content.getText().toString().trim();

if(TextUtils.isEmpty(number)||TextUtils.isEmpty(content)){

Toast.makeText(this, “号码或者内容不能为空”,Toast.LENGTH_SHORT).show();

return;

}else{

SmsManager smsManager = SmsManager.getDefault();

ArrayList contents = smsManager.divideMessage(content);

for(String str:contents){

smsManager.sendTextMessage(number, null, str, null, null);

}

}

} } }

17、相对布局&单位介绍

->布局说明:

->同级控件:

android:layout_toRightOf=“" android:layout_toLeftOf=”“ android:layout_below=”' android:layout_above=“" android:layout_maginBottom=”“

->相对父控件:

android:ayout_centerInParent=”“ android: layout_centerHorizontal=”“ android:layout_centerVertical=”“ android:layout_alignParentBottom=”“ android:layout_alignParentRight=”“->对齐方式:

->文本颜色:#00000000~#ff000000(argb)文字的透明度->单位介绍:

dp也就是dip:device independent pixels(设备独立像素),是一种与密度无关的像素单位,在每英寸160点的屏幕上,1dp = 1px。不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素

1.

下载黑马程序员——IO(Input Output)流总结(一)word格式文档
下载黑马程序员——IO(Input Output)流总结(一).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    【黑马程序员】Java基础总结

    【黑马程序员】Java基础总结 黑马程序员的javaEE课程主要分为2个部分:java基础+java就业。今天就简单的给大家总结一下咱们java基础的知识。 注:Java采用Unicode符号集,每个......

    黑马程序员:Java集合简单总结

    黑马程序员:Java集合简单总结 在Java语言中,学好集合是非常重要的,下面简单的对集合进行总结,以便大家学习,有问题再相互交流。 集合框架图 在集合框架图中可以看出,Collection接......

    【黑马程序员】软件项目管理(一)(5篇)

    【黑马程序员】软件项目管理(一) 咱们现在是在学习阶段,慢慢的接触项目这个概念。那么项目是什么? 一个项目的组成,还有期生命周期,项目经理如何管理项目,项目如何分解,每个阶段的......

    黑马程序员自荐信[五篇模版]

    黑马程序员自荐信在当今社会中,需要使用自荐信的场合越来越多,自荐信可以帮助我们更好地提出请求。你还在为写自荐信而苦恼吗?以下是小编为大家整理的黑马程序员自荐信,仅供参考......

    黑马程序员基础测试题

    黑马程序员基础测试题 1、 已知一个int数组, 编程从数组中获取最大数. 2、 编写一个方法(名字自定,但要符合Java编码规范),方法内打印一字符串,并在main方法内调用它。 3、 环......

    【黑马程序员】Java之debug总结三

    【黑马程序员】Java之debug总结三 之前写了"Java之debug总结一","Java之debug总结二"共总结了5种debug方式,现在简绍第6种,不足之处,敬请指正:(源码在文章末尾处) 本文以chr......

    【黑马程序员】Java之debug总结二

    【黑马程序员济南】Java之debug总结二 之前详细描述了4种debug方式,现在简绍第5种,不足之处,敬请指正:(源码在文章末尾处) 五.maven项目debug 第一步:首先创建一个maven项目......

    黑马程序员:AJAX入门系列(★)

    黑马程序员:AJAX入门系列 什么是AJAX? AJAX是”Asynchronous JavaScript and XML”的缩写(异步的JavaScript和XML),即一种实现无页面刷新获取服务器数据的混合技术。 XML是什么......