Java文件下载ContentType设置

String filePath=””; File file=new File(filePath); //解决乱码问题 String filename=URLEncoder.encode(file.getName(),”utf-8″); //重置输出流 response.reset(); Response.AddHeader(“Content-Disposition”, “attachment;filename=”+filename);//设置文件名 response.addHeader(“Content-Length”,file.length);//设置下载文件大小 response.setContentType(“application/octet-stream”);//设置文件类型 OutputStream toClient=new BufferedOuntputStream( response.getOutputStream() );//获取二进制输出流 //读取文件数据 InputStream fis=new BufferedInputStream(new FileInputStream(filePath)); byte[] buffer=new byte[file.length()]; fis.read(buffer); fis.close(); //输出文件数据 toClient.write(buffer); toClient.close(); 文件类型如下: “.*”=”application/octet-stream” “.001″=”application/x-001” “.301″=”application/x-301” “.323″=”text/h323” “.906″=”application/x-906” “.907″=”drawing/907” “.a11″=”application/x-a11” “.acp”=”audio/x-mei-aac” “.ai”=”application/postscript” “.aif”=”audio/aiff” “.aifc”=”audio/aiff” “.aiff”=”audio/aiff” “.anv”=”application/x-anv” “.asa”=”text/asa” “.asf”=”video/x-ms-asf” “.asp”=”text/asp” “.asx”=”video/x-ms-asf” “.au”=”audio/basic” “.avi”=”video/avi” “.awf”=”application/vnd.adobe.workflow” “.biz”=”text/xml” “.bmp”=”application/x-bmp” “.bot”=”application/x-bot” “.c4t”=”application/x-c4t” “.c90″=”application/x-c90” “.cal”=”application/x-cals” “.cat”=”application/vnd.ms-pki.seccat” “.cdf”=”application/x-netcdf” “.cdr”=”application/x-cdr” “.cel”=”application/x-cel” “.cer”=”application/x-x509-ca-cert” “.cg4″=”application/x-g4” “.cgm”=”application/x-cgm” “.cit”=”application/x-cit” “.class”=”java/*” “.cml”=”text/xml” “.cmp”=”application/x-cmp” ...

2016年8月18日 · 2 分钟 · 天边的星星

SQLite清空表并将自增列归零

SQL标准中有**TRUNCATE TABLE**语句,用来清空表的所有内容。但SQLite不支持这个语句。在SQLite中直接使用“**DELETE FROM TableName**”就可以了。对于大多数DBMS来说,用DELETE不如用TRUNCATE 速度快,因为TRUNCATE 不用访问整个表,不用记录数据的变动。 SQLite虽然不支持TRUNCATE,但它对DELETE做了优化:“When the WHERE is omitted(略去) from a DELETE statement and the table being deleted has no triggers(触发器), SQLite uses an optimization(优化) to erase the entire table content without having to visit each row of the table individually. **This “truncate” optimization makes the delete run much faster**.” 通常在清空表的时候,还需要把自增列归零。在SQLite中定义自增列的方法如下: <div id="crayon-51c50d9e7aa71" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes"> <div class="crayon-plain-wrap"> </div> <div class="crayon-main"> <table class="crayon-table "> <tr class="crayon-row"> <td class="crayon-nums "> <div class="crayon-nums-content"> <div class="crayon-num"> 1 </div> </div> </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-51c50d9e7aa71-1" class="crayon-line"> <span class="k">CREATE</span> <span class="k">TABLE</span> <span class="e">TableName </span><span class="sy">(</span> <span class="i">id</span> <span class="k">INTEGER</span> <span class="k">PRIMARY</span> <span class="k">KEY</span> <span class="i">AUTOINCREMENT</span><span class="sy">,</span> <span class="sy">.</span><span class="sy">.</span><span class="sy">.</span> <span class="sy">)</span><span class="sy">;</span> </div> </div> </td> </tr> </table> </div> </div> 当SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表。这个表包含两个列:name和seq。name记录自增列所在的表,seq记录当前序号(下一条记录的编号就是当前序号加1)。如果想把某个自增列的序号归零,只需要修改 sqlite_sequence表就可以了。 <div id="crayon-51c50d9e7aa8a" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes"> <div class="crayon-plain-wrap"> </div> <div class="crayon-main"> <table class="crayon-table "> <tr class="crayon-row"> <td class="crayon-nums "> <div class="crayon-nums-content"> <div class="crayon-num"> 1 </div> </div> </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-51c50d9e7aa8a-1" class="crayon-line"> <span class="k">UPDATE</span> <span class="i">sqlite_sequence</span> <span class="k">SET</span> <span class="i">seq</span> <span class="o">=</span> <span class="cn"></span> <span class="k">WHERE</span> <span class="i">name</span> <span class="o">=</span> <span class="s">&#8216;TableName&#8217;</span><span class="sy">;</span> </div> </div> </td> </tr> </table> </div> </div> 也可以直接把该记录删掉: <div id="crayon-51c50d9e7aab0" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes"> <div class="crayon-plain-wrap"> </div> <div class="crayon-main"> <table class="crayon-table "> <tr class="crayon-row"> <td class="crayon-nums "> <div class="crayon-nums-content"> <div class="crayon-num"> 1 </div> </div> </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-51c50d9e7aab0-1" class="crayon-line"> <span class="k">DELETE</span> <span class="k">FROM</span> <span class="i">sqlite_sequence</span> <span class="k">WHERE</span> <span class="i">name</span> <span class="o">=</span> <span class="s">&#8216;TableName&#8217;</span><span class="sy">;</span> </div> </div> </td> </tr> </table> </div> </div> 要想将所有表的自增列都归零,直接清空sqlite_sequence表就可以了: <div id="crayon-51c50d9e7aac0" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes"> <div class="crayon-toolbar"> <div class="crayon-tools"> <span class="crayon-language">Transact-SQL</span> </div> </div> <div class="crayon-plain-wrap"> </div> <div class="crayon-main"> <table class="crayon-table "> <tr class="crayon-row"> <td class="crayon-nums "> <div class="crayon-nums-content"> <div class="crayon-num"> 1 </div> </div> </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-51c50d9e7aac0-1" class="crayon-line"> <span class="k">DELETE</span> <span class="k">FROM</span> <span class="i">sqlite_sequence</span><span class="sy">;</span> </div> </div> </td> </tr> </table> </div> </div> &nbsp; </div> 来自:http://zhuyanfeng.com/archives/516 ...

2016年8月15日 · 2 分钟 · 天边的星星

IntelliJ IDEA 14.1上JFinal开发环境搭建手册

JFinal官方的教程都是使用Eclipse进行开发的,而使用Intellij IDEA来做开发,不少地方和Eclipse区别还是很大的。 本文参考了网上不少文章,主要沿用了网友的内容,一步一步做了尝试后记录下来,感谢万能的互联网。 分别做了两个Module,分别使用Jetty和tomcat来运行。均测试均可正常跑起来。 本文看起来虽然很长,但实际上步骤不多,为便于初学者了解Intellij IDEA,所以细节写的非常完善,每一步都有截图。 本文使用的开发环境是Intellij IDEA 14.1.4版本。JFinal是2.0版。 请大家注意:不是Intellij IDEA配置繁琐,而是我为了便于入门初学者少走弯路,写得非常细,凡是每一个出现的界面,我都截了图,而且文章里面包含了jetty和tomcat的两个项目。所以看起来比Eclipse好像复杂,其实不是的。简单地说,就五个步骤:建项目(类比于Eclipse的Workspace),建模块(类比于Eclipse的Project),引入Jar包,建Artifacts,写代码。就可以运行了。 一、新建项目 新建一个项目,可以是空项目,也可以是连模块一起建的项目,本文为了演示Jetty和tomcat均能运行的效果,所以先建一个空项目,再分别建两个不同的module,以便区分。 如果项目和模块一起建,可以把Web Application选上,其他的默认就行。 因为我们要分别测试jetty和tomcat的效果,要建两个模块,所以先建一个空项目。 点击“Next”进入下一步。 输入项目名称和项目所在目录,点击“Finish”即可。 二、项目参数配置 1.新建Module 如果新建一个空项目,会立即出来一个Project Structure的配置窗口。如果是连模块一起建的,请从【File】-【Project Structure】中选择,对项目参数进行配置。 首先指定项目所使用的JDK版本: 如果要单独为每个模块指定JDK版本,也可以在模块中进行配置(要在下面的新建模块步骤之后才能操作)。 下面开始新建模块。 选择Modules,准备新建Module。 2.建Jetty运行模块 (1)新建模块 我们先新建一个module,用于使用jetty来运行。 选上“Web Application”后,点击Next。 在出现的窗口中,直接在Module name中输入想要新建的module名字,下面的Content root和Module file location中会自动把路径填进去。 为了便于区分,我们把jetty运行的module命名为jf_jt。 点击“Finish”。 此时会出现如下界面; 选择“Paths”选项卡,选中“Use module compile output path”后,在“Output path”和“Test output path”中均写上类输出的路径。按照一般常规写法,我把这个目录放在module下,web\WEB-INF路径下的classes目录下。 点击“Apply”,把配置启用起来; (2)导入类库 然后点击左侧的Libraries选项卡; 在做这一步之前,我们先要把需要的类库分别拷贝到我们建立的类库目录中。 这个模块是需要jetty来运行的,所以需要JFinal的类库和jetty的类库,事先准备好这几个类库。 Jfinal-2.0-all目录下有需要的类库文件。 “jfinal-2.0-bin.jar”或“jfinal-2.0-bin-with-src.jar”是jfinal本身的jar包,任选一个都可以,为了方便调试,可以选择“jfinal-2.0-bin-with-src.jar”。 目前这个项目是为了Jetty而建的,所以要把“jetty-server-8.1.8.jar”也要包含进去。 在电脑中找到项目目录,进入到Module路径中,新建文件夹; ...

2016年8月14日 · 1 分钟 · 天边的星星

我的Android进阶之旅——>Android关于HttpsURLConnection一个忽略Https证书是否正确的Https请求工具类

下面是一个android HttpsURLConnection忽略Https证书是否正确的Https请求工具类,不需要验证服务器端证书是否正确 import Java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Map; import java.util.Map.Entry; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; /** * 忽略Https证书是否正确的Https Post请求工具类 * &lt;p/&gt; * created by OuyangPeng on 2016/1/17. */ public class HttpUtil { private static final String DEFAULT_CHARSET = "UTF-8"; // 默认字符集 private static final String _GET = "GET"; // GET private static final String _POST = "POST";// POST /** * 初始化http请求参数 */ private static HttpURLConnection initHttp(String url, String method, Map&lt;String, String&gt; headers) throws IOException { URL _url = new URL(url); HttpURLConnection http = (HttpURLConnection) _url.openConnection(); // 连接超时 http.setConnectTimeout(25000); // 读取超时 --服务器响应比较慢,增大时间 http.setReadTimeout(25000); http.setRequestMethod(method); http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); http.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) [chrome](http://www.07net01.com/tags-chrome-0.html)/33.0.1750.146 Safari/537.36"); if (null != headers && !headers.isEmpty()) { for (Entry&lt;String, String&gt; entry : headers.entrySet()) { http.setRequestProperty(entry.getKey(), entry.getValue()); } } http.setDoOutput(true); http.setDoInput(true); http.connect(); return http; } /** * 初始化http请求参数 */ private static HttpsURLConnection initHttps(String url, String method, Map&lt;String, String&gt; headers) throws IOException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException { TrustManager[] tm = {new MyX509TrustManager()}; SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL _url = new URL(url); HttpsURLConnection http = (HttpsURLConnection) _url.openConnection(); // 设置域名校验 http.setHostnameVerifier(new TrustAnyHostnameVerifier()); http.setSSLSocketFactory(ssf); // 连接超时 http.setConnectTimeout(25000); // 读取超时 --服务器响应比较慢,增大时间 http.setReadTimeout(25000); http.setRequestMethod(method); http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); http.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36"); if (null != headers && !headers.isEmpty()) { for (Entry&lt;String, String&gt; entry : headers.entrySet()) { http.setRequestProperty(entry.getKey(), entry.getValue()); } } http.setDoOutput(true); http.setDoInput(true); http.connect(); return http; } /** * get请求 */ public static String get(String url, Map&lt;String, String&gt; params, Map&lt;String, String&gt; headers) { StringBuffer bufferRes = null; try { HttpURLConnection http = null; if (isHttps(url)) { http = initHttps(initParams(url, params), _GET, headers); } else { http = initHttp(initParams(url, params), _GET, headers); } InputStream in = http.getInputStream(); BufferedReader read = new BufferedReader(new InputStreamReader(in, DEFAULT_CHARSET)); String valueString = null; bufferRes = new StringBuffer(); while ((valueString = read.readLine()) != null) { bufferRes.append(valueString); } in.close(); if (http != null) { http.disconnect();// 关闭连接 } return bufferRes.toString(); } catch (Exception e) { e.printStackTrace(); return null; } } /** * get请求 */ public static String get(String url) { return get(url, null); } /** * get请求 */ public static String get(String url, Map&lt;String, String&gt; params) { return get(url, params, null); } /** * post请求 */ public static String post(String url, String params, Map&lt;String, String&gt; headers) { StringBuffer bufferRes = null; try { HttpURLConnection http = null; if (isHttps(url)) { http = initHttps(url, _POST, headers); } else { http = initHttp(url, _POST, headers); } OutputStream out = http.getOutputStream(); out.write(params.getBytes(DEFAULT_CHARSET)); out.flush(); out.close(); InputStream in = http.getInputStream(); BufferedReader read = new BufferedReader(new InputStreamReader(in, DEFAULT_CHARSET)); String valueString = null; bufferRes = new StringBuffer(); while ((valueString = read.readLine()) != null) { bufferRes.append(valueString); } in.close(); if (http != null) { http.disconnect();// 关闭连接 } return bufferRes.toString(); } catch (Exception e) { e.printStackTrace(); return null; } } /** * post请求 */ public static String post(String url, Map&lt;String, String&gt; params) { return post(url, map2Url(params), null); } /** * post请求 */ public static String post(String url, Map&lt;String, String&gt; params, Map&lt;String, String&gt; headers) { return post(url, map2Url(params), headers); } /** * 初始化参数 */ public static String initParams(String url, Map&lt;String, String&gt; params) { if (null == params || params.isEmpty()) { return url; } StringBuilder sb = new StringBuilder(url); if (url.indexOf("?") == -1) { sb.append("?"); } sb.append(map2Url(params)); return sb.toString(); } /** * map转url参数 */ public static String map2Url(Map&lt;String, String&gt; paramToMap) { if (null == paramToMap || paramToMap.isEmpty()) { return null; } StringBuffer url = new StringBuffer(); boolean isfist = true; for (Entry&lt;String, String&gt; entry : paramToMap.entrySet()) { if (isfist) { isfist = false; } else { url.append("&"); } url.append(entry.getKey()).append("="); String value = http://blog.csdn.net/ouyang_peng/article/details/entry.getValue(); if (null == value || "".equals(value.trim())) { try { url.append(URLEncoder.encode(value, DEFAULT_CHARSET)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } return url.toString(); } /** * 检测是否https */ private static boolean isHttps(String url) { return url.startsWith("https"); } /** * 不进行主机名确认 */ private static class TrustAnyHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { return true; } } /** * 信任所有主机 对于任何证书都不做SSL检测 * 安全验证机制,而Android采用的是X509验证 */ private static class MyX509TrustManager implements X509TrustManager { public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } } } ...

2016年8月10日 · 4 分钟 · 天边的星星

ButterKnife:8.1.0的使用

https://github.com/JakeWharton/butterknife 最近使用的新版的ButterKnife,跟之前有点不一样的地方。记录一下! 导入依赖项:Project Structure→app→Dependencies→add→Library Dependence然后搜索ButterKnife导入对应的依赖。 需要添加的一些插件 Project的build.gradle文件中增加classpath内容: ``` buildscript { repositories { jcenter() } dependencies { classpath &lt;span class="hljs-symbol">'com&lt;/span>.android.tools.build:gradle:&lt;span class="hljs-number">2.0&lt;/span>&lt;span class="hljs-number">.0&lt;/span>' classpath &lt;span class="hljs-symbol">'com&lt;/span>.neenbedankt.gradle.plugins:android-apt:&lt;span class="hljs-number">1.8&lt;/span>' &lt;span class="hljs-comment">//增加这一句&lt;/span> } } allprojects { repositories { jcenter() } } task clean(&lt;span class="hljs-class">&lt;span class="hljs-keyword">type&lt;/span>:&lt;/span> &lt;span class="hljs-type">Delete&lt;/span>) { delete rootProject.buildDir } 2. app的build.gradle文件中增加classpath内容: ``` `apply plugin: &lt;span class="hljs-string">'com.neenbedankt.android-apt'&lt;/span>&lt;span class="hljs-comment">//增加这一句&lt;/span> dependencies { compile fileTree(&lt;span class="hljs-keyword">include&lt;/span>: [&lt;span class="hljs-string">'*.jar'&lt;/span>], dir: &lt;span class="hljs-string">'libs'&lt;/span>) testCompile &lt;span class="hljs-string">'junit:junit:4.12'&lt;/span> compile &lt;span class="hljs-string">'com.android.support:appcompat-v7:23.4.0'&lt;/span> compile &lt;span class="hljs-string">'com.jakewharton:butterknife:8.1.0'&lt;/span> apt &lt;span class="hljs-string">'com.jakewharton:butterknife-compiler:8.1.0'&lt;/span>&lt;span class="hljs-comment">//增加这一句&lt;/span> }` 代码中的使用,具体就是之前的inject变成了现在的bind,其他变化不大: ``` `public <span class=“hljs-class”><span class=“hljs-keyword”>class</span> <span class=“hljs-title”>MainActivity</span> <span class=“hljs-keyword”><span class=“hljs-keyword”>extends</span></span> <span class=“hljs-title”>AppCompatActivity</span> {</span> <span class=“hljs-annotation”>@BindView</span>(<span class=“hljs-type”>R</span>.id.btn_qq) <span class=“hljs-type”>Button</span> qqBtn; <span class=“hljs-annotation”>@Override</span> <span class=“hljs-keyword”>protected</span> void onCreate(<span class=“hljs-type”>Bundle</span> savedInstanceState) { <span class=“hljs-keyword”>super</span>.onCreate(savedInstanceState); setContentView(<span class=“hljs-type”>R</span>.layout.activity_main); ...

2016年8月10日 · 1 分钟 · 天边的星星

10大H5前端框架

作为一名做为在前端死缠烂打6年并且懒到不行的攻城士,这几年我还是阅过很多同门从知名到很知名的各种前端框架,本来想拿15-20个框架来分享一下,但在跟几个前辈讨教写文章的技巧时果断被无情的打击了,所以这里我还是低调的只拿出10个框架来个大锅乱炖来简单介绍,凑够字数也就全剧终了。 原本写这篇文章想围绕着 CSS 框架来的,但因为目前界内比较流行并遍地开花的主要还是 JS+CSS 模式的框架,并且自己靠着一点 JS 功底,就想专门针对 CSS,所以最后来个大锅乱炖都大致聊聊。下面的框架也没有什么先后顺序之分,我想到啥就写啥啦( 作为前端,我一向都这么的任性 ^_^ )。 Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( 呵呵了 ),这是说明它的强大之处,拥有框架一壁江山的势气。自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者废的决心,来让自己成长。结果受到周围各种基友的引诱开始了 Bootstrap 旅程。本人虽然是个设计+前端的万里有一的人才,但是老天只让我会用 PS 和各种设计工具却不给我跟设计妹子一样的审美,所以这也是我最初选择 Bootstrap 的原因之一,它让我做出来的东西好歹能在妹子面前装个逼,不过时间长了难免觉得 Bootstrap 美的让人烦躁, 但好在它的每个版本都会有很大的改变,不会让人觉得自己做的网站会跟很多网站撞脸。Bootstrap 的用法及其简单( 这也可能就是 Bootstrap 作者阅攻城士无数,了解他们痛的结果 ),以至于是个小前端都可以快速上手,几乎没什么学习成本。 官网:http://getbootstrap.com/ Github:https://github.com/twbs/bootstrap/ 作者:Mark Otto 和Jacob Thornton Star:93,112 总结:Bootstrap 最大的优势就是它非常流行,流行就代表你有问题就有很多人帮你解决问题,就代表装逼它就是利器,还有就是界面比较和谐,容易上手,关注它的童鞋应该发现最新 V4 版也开始支持 FlexBox 布局,这是非常好的升级体验。 劣势是 class 命名不够语义化,并且各种缩写,以至于我离了文档就是个菜,最近开始整混合 APP,选框架的时候首选就是它,但之前搞 PC 一直没注意,后来搞混合右键属性看它的时候,瞬间一阵凉风袭来,Bootstrap 好小,小到我只好选择别的框架。 AUI 第三个是最近刚起来的AUI,虽然作者声称是专为APICloud开发者设计的一套UI框架,但实际它还是解决了很多移动前端开发的普遍问题,是主要面向混合开发的 CSS 框架。看起来作者比较猖狂,各种高级 CSS3 遍地使用,这让我也不得不去查查这些个 CSS3 的兼容性。不负众望果然选的都是兼容不错的属性,哈哈了一顿激动从前辈手上大胆认识了几个好东西,并且框架还提供了聊天界面、计数列表等组件,解决了很多复杂的让我骂娘的布局,现在可以直接拿走就用。 Github:https://github.com/liulangnan/aui 官网:http://www.auicss.com/ 作者:流浪男 Star:92 总结:这个框架对我来说有个优点就是纯 CSS 框架,自己以前也就用过 Pure,自己有点 JS 能力,如果不是复杂的效果,找个纯 CSS 框架自己随便改改就可以,而现在 CSS3 也已经能够做到动画,效率、质量、高效全兼顾,所以还是选择了这种 CSS 框架。有一点觉得不满的是这框架的文档真的好那什么,说好的高大上呢。 ...

2016年8月4日 · 2 分钟 · 天边的星星

隐藏弹出键盘,Edittext有光标实现方式

1、第一种方式 edittext.setRawInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE); edittext.setTextIsSelectable(true); 2、第二种方式 /** * 禁止Edittext弹出软件盘,光标依然正常显示。 */ public void disableShowSoftInput(EditText editText) { if (android.os.Build.VERSION.SDK_INT &lt;= 10) { // editText.setInputType(InputType.TYPE_NULL); editText.setRawInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE); editText.setTextIsSelectable(true); } else { Class&lt;EditText&gt; cls = EditText.class; Method method; try { method = cls.getMethod("setShowSoftInputOnFocus",boolean.class); method.setAccessible(true); method.invoke(editText, false); }catch (Exception e) { // TODO: handle exception } try { method = cls.getMethod("setSoftInputShownOnFocus",boolean.class); method.setAccessible(true); method.invoke(editText, false); }catch (Exception e) { // TODO: handle exception } } }

2016年8月3日 · 1 分钟 · 天边的星星

Android 监听锁屏/开屏事件

1. 两种方案 (1) 监听BroadcastReceiver (2)获取PowerManager事件 ### 2. BroadcastReceiver {#articleHeader1} #### 2.1. 事件 总共有3个事件: Intent.ACTION_SCREEN_ON : 屏幕点亮 Intent.ACTION_SCREEN_OFF :屏幕关闭 Intent.ACTION_USER_PRESENT: 用户解锁 #### 2.2. 权限 监听用户解锁需要在AndroidManifest中注册权限 &lt;uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /&gt; #### 2.3. IntentFilter代码 if (mContext != null) { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_USER_PRESENT); mContext.registerReceiver(mScreenReceiver, filter); } ### 3. PowerManager {#articleHeader2} PowerManager manager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); if (manager.isScreenOn()) { if (mScreenStateListener != null) { mScreenStateListener.onScreenOn(); } } else { if (mScreenStateListener != null) { mScreenStateListener.onScreenOff(); } } ...

2016年8月2日 · 4 分钟 · 天边的星星

Java读取文件MD5的两种方案

最近要弄一下Java读取文件MD5,注意这里是小文件,网上找了一下,有两种解决方案,一种是用MessageDigest来实现,另种是用org.apache.commons.codec.digest来实现,代码如下: **[java]** [view plain](http://blog.csdn.net/wangqiuyun/article/details/22941433#) [copy](http://blog.csdn.net/wangqiuyun/article/details/22941433#) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> <span class="tracking-ad" data-mod="popu_167">[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/274974)</span><span class="tracking-ad" data-mod="popu_170">[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/274974/fork)</span></div> </div> - <span class="keyword">package</span> cdm; - <span class="keyword">import</span> java.io.File; - <span class="keyword">import</span> java.io.FileInputStream; - <span class="keyword">import</span> java.io.FileNotFoundException; - <span class="keyword">import</span> java.io.IOException; - <span class="keyword">import</span> java.math.BigInteger; - <span class="keyword">import</span> java.nio.MappedByteBuffer; - <span class="keyword">import</span> java.nio.channels.FileChannel; - <span class="keyword">import</span> java.security.MessageDigest; - - <span class="keyword">import</span> org.apache.commons.codec.digest.*; - <span class="keyword">import</span> org.apache.commons.io.IOUtils; - - <span class="keyword">public</span> <span class="keyword">class</span> testMD5 { - - <span class="keyword">public</span> <span class="keyword">static</span> String getMd5ByFile(File file) <span class="keyword">throws</span> FileNotFoundException { - String value = <span class="keyword">null</span>; - FileInputStream in = <span class="keyword">new</span> FileInputStream(file); - <span class="keyword">try</span> { - MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, <span class="number"></span>, file.length()); - MessageDigest md5 = MessageDigest.getInstance(<span class="string">&#8220;MD5&#8221;</span>); - md5.update(byteBuffer); - BigInteger bi = <span class="keyword">new</span> BigInteger(<span class="number">1</span>, md5.digest()); - value = bi.toString(<span class="number">16</span>); - } <span class="keyword">catch</span> (Exception e) { - e.printStackTrace(); - } <span class="keyword">finally</span> { - <span class="keyword">if</span>(<span class="keyword">null</span> != in) { - <span class="keyword">try</span> { - in.close(); - } <span class="keyword">catch</span> (IOException e) { - e.printStackTrace(); - } - } - } - <span class="keyword">return</span> value; - } - - <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> main(String[] args) <span class="keyword">throws</span> IOException { - - String path=<span class="string">&#8220;E:\\commons-codec-1.9-bin.zip&#8221;</span>; - - String v = getMd5ByFile(<span class="keyword">new</span> File(path)); - System.out.println(<span class="string">&#8220;MD5:&#8221;</span>+v.toUpperCase()); - - FileInputStream fis= <span class="keyword">new</span> FileInputStream(path); - String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fis)); - IOUtils.closeQuietly(fis); - System.out.println(<span class="string">&#8220;MD5:&#8221;</span>+md5); - - <span class="comment">//System.out.println(&#8220;MD5:&#8221;+DigestUtils.md5Hex(&#8220;WANGQIUYUN&#8221;));</span> - } - - } </div> 运行: ![](http://img.blog.csdn.net/20140404160025078?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3FpdXl1bg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 结果在官网提供的MD5一致。 附commons-codec-1.9.jar下载地址:[http://commons.apache.org/proper/commons-codec/download_codec.cgi](http://commons.apache.org/proper/commons-codec/download_codec.cgi) 如果要处理过G的文件,请参照:[http://www.cnblogs.com/yaowukonga/p/3523668.html](http://www.cnblogs.com/yaowukonga/p/3523668.html)

2016年7月29日 · 2 分钟 · 天边的星星

Fragment销毁时replace和add两个方法的区别

这个首先从一个bug说起,如图: 我们都知道fragment切换有两种方式: replace方式 transaction.replace(R.id.content, IndexFragment); add-hide-show方式 transaction.add(R.id.content, IndexFragment); transaction.hide(otherfragment); transaction.show(thisfragment); 而上面按钮中出现bug的就是采用第二种方式。然后我们来分析下用add,hide,show为什么出现这种bug,我把每个操作都打印出了以下日志: 复现bug的操作是: 1.首先打开,默认选中的是第一个tab,如上面的一张图片正常那样。 2.切换到tab2,并把tab1 hide掉; 3.再切回到tab1,并不会触发tab1对应fragment的任何生命周期; 4.然后home键进入后台,我在activity的onPause()中手动对IndexFragment赋空,模拟长时间后台,系统销毁了该引用。 IndexFragment=null; 5.再次启动,其实tab1 的fragment实例在内存中还在,只是他的引用被销毁了。 6.再切到tab2,这里其实是先把tab1的hide,在show tab2,但是tab1 的fragment引用为空,所以无法hide,就出现了tab2叠在tab1上的花屏情况。 7.再切到tab1,tab1就会重复创建对象。 同样的操作,我们使用replace的方式 使用replace方式,虽然这种方式会避免上述的bug,但也是重复创建了对象。因为replace方式,对应的FrameLayout只有一 层,而add方式,这个FrameLayout其实有2层。但是这种方式的缺点是:每次replace会把生命周期全部执行一遍,如果在这些生命周期函数 里拉取数据的话,就会不断重复的加载刷新数据。 那么最合适的处理方式是这样的: 1.在add的时候,加上一个tab参数 transaction.add(R.id.content, IndexFragment,”Tab1″); 2.然后当IndexFragment引用被回收置空的话,先通过 IndexFragment=FragmentManager.findFragmentByTag(“Tab1″); 找到对应的引用,然后继续上面的hide,show;

2016年7月27日 · 1 分钟 · 天边的星星