使用Java处理大文件

  categories:资料  author:

来源:互联网

我最近要处理一套存储历史实时数据的大文件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> … 阅读全文

解决android studio Gradle警告GBK编码的不可映射字符的问题2

  categories:android  tags:  author:

前面用as开发android项目中, 遇到编码问题, 查找了各种办法, 但是没有好的解决
在前面的给出了一个比较不好的解决办法将编码转换成gbk然后进行编译
今天重新查找了些文章, 仔细阅读, 再三尝试, 终于可以把代码编译成utf8方式了,相关过程如下:

1. 编译项目后, 发现如下错误

android studio编译时出现的问题

android studio编译时出现的问题

2. 启动cmd窗口, 到dos下 ,用下面命令进行编译,获取编译的详细信息

gradlew compileDebug –stacktrace 1> a.log 2>&1

上面命令将编译的详细信息, 输出到a.log中, 然后查看日志文件

进入cmd(控制台)进行编译, 获取详细编译信息

进入cmd(控制台)进行编译, 获取详细编译信息

3. 查看日志文件,根据日志文件定位, 代码中那个代码有问题

 

查看android studio详细日志文件 查看android studio详细日志文件

 

查看今天的android studio编译错误

查看具体的android studio编译错误

4. … 阅读全文

android ListView详解

  categories:android资料  author:

来源: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 … 阅读全文

Android Studio导入类库

  categories:android  tags:  author:

     最近实在是受够了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中

粘贴要在android studio中导入的jar文件到libs中

直接通过COPY/PAST 把你下载的jar文件添加到libs文件夹下

二。 设置被粘贴的文件为库文件, 经过测试这个设置可以通知ide,系统中多了个jar, 然后在你需要导入类时, ide可以帮助你进行, 也可以进行编译检查。

在android studio中将粘贴进的文件设置为库

在android studio中将粘贴进的文件设置为库

然后在libs文件夹和添加的*.jar文件下鼠标单击菜单 add as library

三。 设置gradle的编译文件, 通过测试, 不设置这个文件, 程序没办法最后编译成功
在android studio中导入jar文件的关键一步设置build.gradle文件

在android studio中导入jar文件的关键一步设置build.gradle文件

打开App目录下有个build.gradle文件应该项目结构文件,上述的动作只是为了在在文件下添加

阅读全文

ActiveAndroid 管理数据库

  categories:android资料  author:

来源:http://blog.csdn.net/wangjia55/article/details/11257271

虽然android已经提供了管理数据库的工具类,但是对一些同学学习起来还是有些困难的,今天我就介绍一下ActiveAndroid。
ActiveAndroid是一个活性的记录的风格ORM(对象关系映射)。这是什么意思呢?那么,ActiveAndroid允许你保存和检索 SQLite数据库记录,而无需编写一个单独的SQL语句。每个数据库记录被包裹整齐地归为一类,如save()和delete()的方法。

ActiveAndroid这样做远不止这一点,虽然。访问数据库是一件麻烦事,至少可以说,在Android。 ActiveAndroid照顾所有的设置和凌乱的东西,所有的配置,只需几个简单的步骤。

第一步

配置我们的基本信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<manifest ...>
    <application android:name="com.activeandroid.app.Application" ...>

        ...

        <meta-data android:name="AA_DB_NAME" android:value=
阅读全文

Android Volley完全解析

  categories:android资料  author:

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482095

1. Volley简介

我 们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系 统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的 身影,使用率非常高。

不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的 话, 很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节 全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片 的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经 把一切都做好了。

Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image- Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image- Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但 通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

下图所示的这些应用都是属于数据量不大,但网络通信频繁的,因此非常适合使用Volley。

2. 下载Volley

介绍了这么多理论的东西,下面我们就准备开始进行实战了,首先需要将Volley的jar包准备好,如果你的电脑上装有Git,可以使用如下命令下载Volley的源码:

  1. git clone https://android.googlesource.com/platform/frameworks/volley

下载完成后将它导入到你的Eclipse工程里,然后再导出一个jar包就可以了。如果你的电脑上没有Git,那么也可以直接使用我导出好的jar包,下载地址是:http://download.csdn.net/detail/sinyu890807/7152015 。新建一个Android项目,将volley.jar文件复制到libs目录下,这样准备工作就算是做好了。

3. StringRequest的用法

前面已经说过,Volley的用法非常简单,那么我们就从最基本的HTTP通信开始学习吧,即发起一条HTTP请求,然后接收HTTP响应。首先需要获取到一个RequestQueue对象,可以调用如下方法获取到:

  1. RequestQueue mQueue = Volley.newRequestQueue(context);

注 意这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。 RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源 的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。接下来为了要发出一条HTTP请求,我们还需要创建一个StringRequest对象,如下所示:

阅读全文

android studio中http访问网站的几种异常情况

  categories:android  tags:  author:

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编码的不可映射字符的问题

  categories:android  author:

今天用android studio来写代码,然后在代码中加了中文注释导致无法编译:提示错误:“ Gradle: 警告:编码 GBK 的不可映射字符”。

网络上 查找各种解决方法, 也没有最终解决, 可以通过到cmd中进行编译, 找到错误的代码行, 可以进行删除相关注释,一般都能解决,但是不是最好的办法。

下面是从网络上搜索的解决方法,如下(其实我的程序这么操作后,也没有解决, 我是用下面的另外方法进行的解决)
网上也有挺多解决的方法,但是看得不是很明显,这里截图给大家分享一下:

这里是中文代码注释

android studio代码中的 中文注释,容易引起编译问题,程序没办法启动

android studio代码中的 中文注释,容易引起编译问题,程序没办法启动

编译出错,在项目下的build.gradle下添加以下代码即可解决。

复制代码

 

在图中代码中添加相关设置可以解决android studio中文编码问题

在图中代码中添加相关设置可以解决android studio中文编码问题

  1. tasks.withType(Compile) {
  2.     options.encoding = “UTF-8″
  3. }

截图看起来更加清晰哈.

设置android studio的编码方式为utf-8

设置android studio的编码方式为utf-8

 

参照上面的过程进行了设置, 但是在我的项目中, 问题还是存在,后来采用源代码转换成gbk的方式,问题解决,过程如下:

1. 选择源代码文件, 选择其中文件编码… 阅读全文

android studio编译调试错误

  categories:android资料  author:

android studio是个 很好的 android开发工具, 但是使用中,总是有些问题如下:

android studio编译错误 调试

android studio编译错误 调试

 

有各种各样原因,具体就请自己进cmd编译看什么地方出错

1. 需要打开 cmd窗口

2. 进入工程目录

3. 输入命令 gradlew compileDebug –stacktrace

输入命令 gradlew compileDebug --stacktrace

输入命令 gradlew compileDebug –stacktrace

 

 

 

 

 

进入项目的gradle文件所在目录打

gradlew compileDebug –stacktrace
来追踪就可以啦~

编译出的 问题如下:

编译时的字符问题,造成android studio问题

编译时的字符问题,造成android studio问题

昨天编译的时候出现了问题,具体问题具体解决!

详情参考程序中代码情况如下:

阅读全文

Android网络编程之Http通信

  categories:android资料  author:

大多数的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 … 阅读全文



快乐成长 每天进步一点点