发表于: 2017-12-03 22:00:42

1 780



今日完成的事情:


;先了解新任务的几个重要的概念


1;什么是tuscany………


Tuscany是一个相当成熟的SCA框架,而SAC又是实现SOA的基础;SOA这是一种组件模式,它的组件概念就是复用的高度体现,包

含接口和引用.

 


2;什么是微服务…………


微服务是基于Restful风格的,基于资源及资源操作一组API的集合,可以实现模块儿或者说是特定的业务范围内的一个完全立、

细粒度、自包含的一个服务。每个微服务提供一组API,供其他微服务或者应用客户端所用。


再具体点;微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微

服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。

 


3;什么是Soa…………


SOAService-Oriented Architecture)面向服务的体系结构;是一个组件模型,它将应用程序的不同功能单元(称为服务)通

过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系

统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。



4;什么是Sca…………


昨天说了概念;再简单说一点目的; SCA的目的是使用户在构建企业应用时有一个不再直接面对具体的技术细节的层次,而是通过服

务组件的方式来构建应用。这种方式也使得客户的企业应用具有良好的分层架构,能够很好的分离应用的业务逻辑和IT逻辑,不但

易于应用的构建,也易于应用的更改和部署。(SCA为构建基于SOA的应用和解决方案提供了编程模型)

 


;完成java流相关的基础知识的简单学习


1;File,上次说了,这里简单贴一下

 

 

2;File类的一些常用方法

 

 

测试有效,不仅仅试操纵了java对象,对电脑的物理对象也有影响…………………

 

 

3;再试几个有个印象…………………

 

 

可以,创建删除等………

 

 



5;………什么是流,先说一下IO的概念…….


IO 是什么? I: Input 输入;O: Output 输出


JavaIO是以流为基础进行输入输出的,所有数据被串行化(保存)写入输出流,或者从输入流读入。


数据串行化:把对象的状态以特定的形式(比如byte[])保存到流,通过流的方式写入.


什么是流?

流,本身是一个非常抽象的概念,我们以现实生活中水为例,我们通过管道把A池子的水放到B池子中这个过程就会产生水流,只是主体是水而已。


什么是IO流?

其实和上面原理一样,把上面的水变成计算机中的数据即可,IO流也可以看成是不同存储设备(例如磁盘文件,内存等)之间的数

据(输入输出操作)流

输入流: InputStream; 输出流:OutputStream


当不同的介质之间有数据交互的时候,JAVA就使用流来实现。数据源可以是文件,还可以是数据库,网络甚至是其他的程序;比如

读取文件的数据到程序中,站在程序的角度来看,就叫做输入流


简单来说, 流就是一系列的数据;输入输出的也是数据

 

 



6;简单了解ASCII………………


所有的数据存放在计算机中都是以数字的形式存放的。 所以字母就需要转换为数字才能够存放。比如A就对应的数字65a对应的

数字97. 不同的字母和符号对应不同的数字,就是一张码表。ASCII是这样的一种码表。字包含简单的英文字母,符号,数字等

等。 不包含中文,德文,俄语等复杂的。

 

创建一个输入流; 通过这个输入流,把数据从硬盘,读取到Java的虚拟中来,也就是读取到内存中

 

 

7;写入数据…………创建一个输出流; 通过这个输出流,把数据从内存,输出到硬盘之中;

 

 

 



8;流的关闭,为什么要关闭流?


具体来说就是; 无论是输入流还是输出流,使用完毕之后,都应该关闭。 如果不关闭,会产生对资源占用的浪费 当量比较大的

时候,会影响到业务的正常开展


A:可以利用try…块里的close来关闭;


 

弊端; 如果文件不存在,或者读取的时候出现问题而抛出异常,那么就不会执行这一行关闭流的代码,存在巨大的资源占用隐患。不推荐使用

 


B;标准的流关闭方式是finally,比较繁琐麻烦…..不过是标准的………但是测试或者不重要的可以采用上述的直接在try….块里面………

 

 


C:到这里实际上可以联系之前学jdbc的内容了,jdbc操作数据库的时候,会创建链接以及sql语句对象;那个时候要先关闭

Statement,后关闭Connection也是可以在finally里这样判断,关闭;也比较麻烦………..然后没解决办法是…………try-with-

resources…………

 

 

…………try-with-resources…………有必要学习一下,很方便………………


是把流定义在try(),try,catch或者finally结束的时候,会自动关闭;这种编写代码的方式叫做 try-with-resources,这是

JDK7开始支持的技术;因为所有的流,都实现了一个接口叫做 AutoCloseable,而任何类实现了这个接口,都可以在try()中进

行实例化;最关键的是try, catch, finally结束的时候会自动关闭,回收相关资源……………io这里也可以这样操作………

 

 


9;字符流……. Reader字符输入流;Writer字符输出流;专门用于字符的形式读取和写入数据读取;


 

写入;

 

 



10;学习编码的相关的概念知识;


常见编码;

ISO-8859-1 ASCII 数字和西欧字母; ISO包含 ASCII


GBK GB2312 BIG5 中文;

GB2312 是简体中文,BIG5是繁体中文,GBK同时包含简体和繁体以及日文。


UNICODE (统一码,万国码);

UNICODE 包括了所有的文字,无论中文,英文,藏文,法文,世界所有的文字都包含其中

 

再简单提一下utf-8; UNICODE因为要存放所有的数据,所以不管是数字还是字母汉字,都预留了最大的空间;就像每个数字都是很长

(4个字节) ;如果完全按照UNICODE的方式来存储数据,就会有很大的浪费。这个时候就衍生出来了类似utf-8的编码方式;还有

什么utf-16……-32,目的就是减少资源的浪费;可以说是子编码,保证功能健全的同时,规定了字母数字占一个字节,汉字是三个字节;


还有一个常见的就是,解决乱码用过几次; ANSI是采用本地编码的意思。如果是中文的操作系统,就会使GBK,如果是英文的就会是ISO-8859-1

 



11;缓存流的知识…….


为什需要缓存流;假设存取的对象都是以电脑硬盘为介质; 在每一次读写的时候,都会访问硬盘。 如果读写的频率比较高的时候,其性能表现不佳。


而为了解决以上弊端,采用缓存流:

缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到缓存中的数据读取完毕,再到硬盘中区读取。


缓存流在写入数据的时候,会先把数据写入到缓存区,直到缓存区达到一定的量,才把这些数据,一起写入到硬盘中去。按照这种操作模式,就不会像字节流,字符流那样每写一个字节都访问硬盘,从而减少了IO操作


利用缓存流读取数据可以单行读取

// 缓存流必须建立在一个存在的流的基础上
try (FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr))

 

利用缓存流写入数据可以单行写入

// 缓存流必须建立在一个存在的流的基础上
try (FileWriter fw = new FileWriter(file); PrintWriter pw = new PrintWriter(fw))

 

同时也可以利用flush清空缓存,强制写入到硬盘

pw.println("i hate music");
//强制把缓存中的数据写入硬盘,无论缓存是否已满
pw.flush();
pw.println("i also hate movie");

 


12;数据流………简单了解一下……


DataInputStream 数据输入流以及DataOutputStream 数据输出流……


主要应该就一个功能;格式化读写;自定义一个顺序……….

 

 

同时; 要用DataI 读取一个文件,这个文件必须是由DataO写出的,否则会出现EOFException,因为DataO在写出的时候会做一

些特殊标记,只有DataI才能成功的读取;除此之外写入和读入的顺序也必须一致……否则erro……

 

 


13;最后一个关于流的知识,之前也有用到过,就是序列化……对象流………..


对象流指的是可以直接把一个对象以流的形式传输给其他的介质,比如电脑的硬盘;一个对象以流的形式进行传输,叫做序列化。

前提是该对象所对应的类,必须是实现Serializable接口;至于uid最好是加上吧……不在多说了,简单跑一下…………

 

 



14;到这里关于流的知识点,基本上是简单过了一遍;然后再补充一个最常用的,在控制台的输入输出………


System.out 是常用的在控制台输出数据;这个也不多说了……..


System.in 可以从控制台输入数据……

InputStream is = System.in


然后是常用的是scanner………可以逐行读取……

Scanner scanner = new Scanner(System.in);

 



;简单实现一点Tuscanydemo;网上的计算机原生demo很完整


假设建立一个calculator的实例;


1; 定义所需要的功能块:分解每个块都是一个可以在总的应用里使用的逻辑操作单元, Calculator应用可以被分为五个功能块:AddService(加)、SubstractService(减)、MultiplyService(乘)、DivideService(除)和一个主功能块CalculatorService,起接收请求并引导到正确操作的控制器的作用。


单元

//一个个较小的功能/服务,每个块都是一个可以在总的应用里使用的逻辑操作单元
public interface AddService


控制器

//主功能块,起接收请求并引导到正确操作的控制器的作用
@Remotable
public interface CalculatorService



2; 实现每个功能块:创建;SCA里,功能性的块称为组件,以AddService组件为例;AddService组件将提供两数相加的服务。每当执行相加操作的时候,CalcualtorService组件就会使用AddService组件;使用java接口来编写AddService组件

 

//实现逻辑单元块
public class AddServiceImpl implements AddService


//@Reference注释,它告诉SCA哪些字段/域需要被自动设置。
@Reference
public void setAddService(AddService addService)



3; 组装应用:使两个组件组合运行,写一个main函数,然后就可以将两个组件联系到一起然后运行,同时加上配置文件,

Tuscany在之前启动……………..

 

Node node = NodeFactory.newInstance().createNode("Calculator.composite");

 


4;说一下composite配置文件;

 

 

定义了四个组件以及主控制器;并且指定了Tuscany SCA需要加载去实现业务计算的Java实现类。CalculatorServiceComponent

拥有XXXservice的四个引用,在XML配置文件里,这个引用目标是XXXServiceComponent。当实现CalculatorServiceImpl

,引用名字"XXXService",与我们建立的XXXService 领域的名字相匹配;Tuscany SCA运行时从Xml配置文件解析这些信息,并

且用来创建描述我们calculator应用程序的对象和关系。

 

具体流程;首先创建了XXXServiceImpl CalcualtorSreviceImpl的实例,然后将XXXServiceImpl引用注入到

CalculatorServiceImpl对象的XXXService字段域。而CalculatorService@Reference注释,制订了SCA哪些字段/域需要被

自动设置。

 

 



5;测试结果…..

 

 






 

明日计划的事情:


1;完成代码Tuscany的实践内容


2;找师兄讨论,完善任务


3;看一点java基础

 





遇到的问题及解决方法:


学习的基础知识,一些简单的理论;暂无…………





收获:


1;把流的知识概念,简单过了一遍,了解了很多;


2;学习了Tuscany的相关基础概念


3;实现一个计算器的小demo



 

 

 



返回列表 返回列表
评论

    分享到