来源:互联网
我最近要处理一套存储历史实时数据的大文件fx market data,我很快便意识到,使用传统的InputStream不能够将它们读取到内存,因为每一个文件都超过了4G。甚至编辑器都不能够打开这些文件。
在这种特殊情况下,我可以写一个简单的bash脚本将这些文件分成更小的文件块,然后再读取它。但是我不想这样做,因为二进制格式会使这个方法失效。
处理这个问题的方式通常就是使用内存映射文件递增地处理区域的数据。关于内存映射文件的一个好处就是它们不会使用虚拟内存和换页空间,因为它们是从磁盘上的文件返回来的数据。
很好,让我们来看一看这些文件和额外的一些数据。似乎它们使用逗号分隔的字段包含ASCII文本行。
格式:[currency-pair],[timestamp],[bid-price],[ask-price]
例子:EUR/USD,20120102 00:01:30.420,1.29451,1.2949
我可以为这种格式去写一个程序,但是,读取文件和解析文件是无关的概念。让我们退一步来想一个通用的设计,当在将来面临相似的问题时这个设计可以被重复利用。
这个问题可以归结为递增地解码一个已经在无限长的数组中被编码的记录,并且没有耗尽内存。实际上,以逗号分割的示例格式编码与通常的解决方案是不相关的。所以,很明显需要一个解码器来处理不同的格式。
再来看,知道整个文件处理完成,每一条记录都不能被解析并保存在内存中,所以我们需要一种方式来转移记录,在它们成为垃圾被回收之前可以被写到其他地方,例如磁盘或者网络。
迭代器是处理这个需求的很好的抽象,因为它们就像游标一样,可以正确的指向某个位置。每一次迭代都可以转发文件指针,并且可以让我们使用数据做其他的事情。
首先来写一个Decoder 接口,递增地把对象从MappedByteBuffer中解码,如果buffer中没有对象,则返回null。
publicinterfaceDecoder<T> {
publicT decode(ByteBuffer buffer);
}
然后让FileReader 实现Iterable接口。每一个迭代器将会处理下一个4096字节的数据,并使用Decoder把它们解码成一个对象的List集合。注 意,FileReader 接收文件(files)的list对象,这样是很好的,因为它可以遍历数据,并且不需要考虑聚合的问题。顺便说一下,4096个字节块对于大文件来说是非 常小的。
publicclassFileReaderimplementsIterable<List<T>> {
privatestaticfinallongCHUNK_SIZE =4096;
privatefinalDecoder<T> decoder;
privateIterator<File> files;
privateFileReader(Decoder<T> … 阅读全文
前面用as开发android项目中, 遇到编码问题, 查找了各种办法, 但是没有好的解决
在前面的给出了一个比较不好的解决办法将编码转换成gbk然后进行编译
今天重新查找了些文章, 仔细阅读, 再三尝试, 终于可以把代码编译成utf8方式了,相关过程如下:
1. 编译项目后, 发现如下错误

android studio编译时出现的问题
2. 启动cmd窗口, 到dos下 ,用下面命令进行编译,获取编译的详细信息
gradlew compileDebug –stacktrace 1> a.log 2>&1
上面命令将编译的详细信息, 输出到a.log中, 然后查看日志文件

进入cmd(控制台)进行编译, 获取详细编译信息
3. 查看日志文件,根据日志文件定位, 代码中那个代码有问题
查看android studio详细日志文件

查看具体的android studio编译错误
4. … 阅读全文
来源:http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html
源码下载地址 【源码下载】
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。抽空把对ListView的使用做了整理,并写了个小例子,如下图。

列表的显示需要三个元素:
1.ListVeiw 用来展示列表的View。
2.适配器 用来把数据映射到ListView上的中介。
3.数据 具体的将被映射的字符串,图片,或者基本组件。
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
我们从最简单的ListView开始:
/**
* @author allin
*
*/
public class MyListView extends Activity {
private ListView listView;
//private List<String> data = new ArrayList<String>();
@Override
public void … 阅读全文
最近实在是受够了Eclipse的速度,于是准备切换到Android Studio,这个开发环境对gradle有良好的支持,对于UI开发也更好,不过新的开发环境毕竟要适应一段时间,初次导入类库就遇到了麻烦。
对于jar的类库,非常简单,只要在项目根目录下新建一个libs目录,然后把jar复制进去,在jar上点击右键,选择Add as library,即可完成依赖的添加。
为了方便,录制了一段添加视频, 供参考:
链接: http://pan.baidu.com/s/1c0cYxpQ 密码: xns5
新建好了Android项目,添加一个第三方已经打包好的jar文件进你项目,下面就已添加一个ActiveAndroid-master的一个包
一。 粘贴第三方jar包, 如下图

粘贴要在android studio中导入的jar文件到libs中
直接通过COPY/PAST 把你下载的jar文件添加到libs文件夹下
二。 设置被粘贴的文件为库文件, 经过测试这个设置可以通知ide,系统中多了个jar, 然后在你需要导入类时, ide可以帮助你进行, 也可以进行编译检查。

在android studio中将粘贴进的文件设置为库
然后在libs文件夹和添加的*.jar文件下鼠标单击菜单 add as library
三。 设置gradle的编译文件, 通过测试, 不设置这个文件, 程序没办法最后编译成功

在android studio中导入jar文件的关键一步设置build.gradle文件
打开App目录下有个build.gradle文件应该项目结构文件,上述的动作只是为了在在文件下添加
…
阅读全文
Android对HTTP(超文本传输协议)也提供了很好的支持,这里包括两种接口:
1、标准Java接口(java.net) —-HttpURLConnection,可以实现简单的基于URL请求、响应功能;
2、Apache接口(org.appache.http)—-HttpClient,使用起来更方面更强大。一般来说,用这种接口。
本文主要是探索几种http使用方式的不正确的情况,这些情况都会引起不正确的异常程序关闭
第一种情况: 在android的事件处理函数中,直接调用网络函数进行网络访问,这种情况,会直接导致android程序停止运行
第二种情况:在android的事件出来函数中,启动一个线程, 在线程中访问网络, 网络访问完成后, 将数据传递给android的界面中的临时变量, 但是这个情况下, 事件出来函数中不知道什么时候网络完成,因此例子里面用的是线程的join方法, 这个方法可以等待另外线程(网络访问)完成, 然后在事件处理函数进行数据的处理,这个的问题是, join时事件处理线程(UI)不能在响应其他请求,特别是网络线程中有网络异常例如连接超时,网络速度缓慢, 也有些情况下,在网络访问线程中有死锁或者sleep等类似操作等,都会造成事件处理函数的 等待,严重影响用户体验甚至不能工作
第三种情况: 在网络处理函数中直接将 获取到的数据设置到 android界面中, 这个情况下, 事件处理函数不用在等待了, 他直接启动线程就完成了。但是这个情况下,android程序会直接退出。android禁止在非 ui(非主线程)线程中 访问ui元素,界面控件等
本程序中网络方面采用HttpURLConnection进行http的访问, 相关HttpURLConnection情况如下, 具体代码见下面的链接。
HttpURLConnection继承自 URLConnection类,用它可以发送和接口任何类型和长度的数据,且预先不用知道数据流的长度,可以设置请求方式get或post、超时时间。
下面直接贴代码,代码目的有两个,一是访问百度首页,获取其返回的html字符串,二是给定URL下载个图片并显示出来。后续将展开系列博文介绍HTTP相关知识。
两个核心文件都略了, 稍后提供完整的源代码, 如下:
链接: http://pan.baidu.com/s/1nt5guxj 密码: dmp3… 阅读全文
今天用android studio来写代码,然后在代码中加了中文注释导致无法编译:提示错误:“ Gradle: 警告:编码 GBK 的不可映射字符”。
网络上 查找各种解决方法, 也没有最终解决, 可以通过到cmd中进行编译, 找到错误的代码行, 可以进行删除相关注释,一般都能解决,但是不是最好的办法。
下面是从网络上搜索的解决方法,如下(其实我的程序这么操作后,也没有解决, 我是用下面的另外方法进行的解决)
网上也有挺多解决的方法,但是看得不是很明显,这里截图给大家分享一下:
这里是中文代码注释

android studio代码中的 中文注释,容易引起编译问题,程序没办法启动
编译出错,在项目下的build.gradle下添加以下代码即可解决。
复制代码

在图中代码中添加相关设置可以解决android studio中文编码问题
- tasks.withType(Compile) {
- options.encoding = “UTF-8″
- }
截图看起来更加清晰哈.

设置android studio的编码方式为utf-8
参照上面的过程进行了设置, 但是在我的项目中, 问题还是存在,后来采用源代码转换成gbk的方式,问题解决,过程如下:
1. 选择源代码文件, 选择其中文件编码… 阅读全文
android studio是个 很好的 android开发工具, 但是使用中,总是有些问题如下:

android studio编译错误 调试
有各种各样原因,具体就请自己进cmd编译看什么地方出错
1. 需要打开 cmd窗口
2. 进入工程目录
3. 输入命令 gradlew compileDebug –stacktrace

输入命令 gradlew compileDebug –stacktrace
进入项目的gradle文件所在目录打
gradlew compileDebug –stacktrace
来追踪就可以啦~
编译出的 问题如下:

编译时的字符问题,造成android studio问题
昨天编译的时候出现了问题,具体问题具体解决!
详情参考程序中代码情况如下:
…
阅读全文
大多数的Android应用程序都会使用HTTP协议来发送和接收网络数据,而Android中主要提供了两种方式来进行HTTP操 作,HttpURLConnection和HttpClient。这两种方式都支持HTTPS协议、以流的形式进行上传和下载、配置超时时间、IPv6、 以及连接池等功能。
1. HttpURLConnection接口
通过实际编写源代码, 发现这个接口问题还是比较麻烦的, 使用起来非常不方便, 建议直接采用 httpclient
首先需要明确的是,Http通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而 POST方法的参数是放在Http请求中。因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式。
HttpURLConnection是继承于URLConnection类,二者都是抽象类。其对象主要通过URL的openConnection方法获得。创建方法如下代码所示:
URL url = new URL(“http://www.51cto.com/index.jsp?par=123456″);
HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
通过以下方法可以对请求的属性进行一些设置,如下所示:
//设置输入和输出流
urlConn.setDoOutput(true);
urlConn.setDoInput(true);
//设置请求方式为POST
urlConn.setRequestMethod(“POST”);
//POST请求不能使用缓存
urlConn.setUseCaches(false);
//关闭连接
urlConn.disConnection();
HttpURLConnection默认使用GET方式,例如下面代码所示:
//使用HttpURLConnection打开连接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
//得到读取的内容(流)
InputStreamReader in … 阅读全文