Android笔记:利用InputStream和BufferedReader 进行字节流 字符流处理
通过socket获取字节流处理时最初使用的是BufferedReader和PrintWriter 这种方式在解析字符串时是比较方便的 但是在处理字节时不够方便最终还是回归到InputStream和OutputStream方式 不使用缓存直接使用字节流操作,一次传输的字节数据在300字节以内,目前没有测试差距会有多大。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Arrays; import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.util.Log; public class SocThread extends Thread {
private String ip = "10.0.0.113";
private int port = 6666;
private String TAG = "socket thread";
private int timeout = 10000;
int maxsize = 256; public Socket client = null;
PrintWriter out;
BufferedReader in;
public boolean isRun = true;
Handler inHandler;
Handler outHandler;
Context ctx;
private String TAG1 = "===Send===";
SharedPreferences sp; public SocThread(Handler handlerin, Handler handlerout, Context context) {
inHandler = handlerin;
outHandler = handlerout;
ctx = context;
MyLog.i(TAG, "创建线程socket");
} /**
* 连接socket服务器
*/
public void conn() { try {
initdate();
Log.i(TAG, "连接中……");
client = new Socket(ip, port);
client.setSoTimeout(timeout);// 设置阻塞时间
MyLog.i(TAG, "连接成功");
in = new BufferedReader(new InputStreamReader(
client.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
client.getOutputStream())), true);
MyLog.i(TAG, "输入输出流获取成功");
} catch (UnknownHostException e) {
MyLog.i(TAG, "连接错误UnknownHostException 重新获取");
e.printStackTrace();
conn();
} catch (IOException e) {
MyLog.i(TAG, "连接服务器io错误");
e.printStackTrace();
} catch (Exception e) {
MyLog.i(TAG, "连接服务器错误Exception" + e.getMessage());
e.printStackTrace();
}
} public void initdate() {
sp = ctx.getSharedPreferences("SP", ctx.MODE_PRIVATE);
ip = sp.getString("ipstr", ip);
port = Integer.parseInt(sp.getString("port", String.valueOf(port)));
MyLog.i(TAG, "获取到ip端口:" + ip + ";" + port);
} /**
* 实时接受数据
*/
@Override
public void run() {
MyLog.i(TAG, "线程socket开始运行");
conn();
MyLog.i(TAG, "1.run开始");
String line = "";
while (isRun) {
try {
if (client != null) {
MyLog.i(TAG, "2.检测数据");
// 以下是按行直接读取字符流
while ((line = in.readLine()) != null) {
MyLog.i(TAG,
"3.getdata" + line + " len=" + line.length());
MyLog.i(TAG, "4.start set Message");
Message msg = inHandler.obtainMessage();
msg.obj = line;
inHandler.sendMessage(msg);// 结果返回给UI处理
MyLog.i(TAG1, "5.send to handler");
} } else {
MyLog.i(TAG, "没有可用连接");
conn();
}
} catch (Exception e) {
MyLog.i(TAG, "数据接收错误" + e.getMessage());
e.printStackTrace();
}
}
} /**
* 发送数据
*
* @param mess
*/
public void Send(String mess) {
try {
if (client != null) {
MyLog.i(TAG1, "发送" + mess + "至"
+ client.getInetAddress().getHostAddress() + ":"
+ String.valueOf(client.getPort()));
out.println(mess);//按字符流发送
out.flush();
MyLog.i(TAG1, "发送成功");
Message msg = outHandler.obtainMessage();
msg.obj = mess;
msg.what = 1;
outHandler.sendMessage(msg);// 结果返回给UI处理
} else {
MyLog.i(TAG, "client 不存在");
Message msg = outHandler.obtainMessage();
msg.obj = mess;
msg.what = 0;
outHandler.sendMessage(msg);// 结果返回给UI处理
MyLog.i(TAG, "连接不存在重新连接");
conn();
} } catch (Exception e) {
MyLog.i(TAG1, "send error");
e.printStackTrace();
} finally {
MyLog.i(TAG1, "发送完毕"); }
} /**
* 关闭连接
*/
public void close() {
try {
if (client != null) {
MyLog.i(TAG, "close in");
in.close();
MyLog.i(TAG, "close out");
out.close();
MyLog.i(TAG, "close client");
client.close();
}
} catch (Exception e) {
MyLog.i(TAG, "close err");
e.printStackTrace();
} }
}
原始字节流读取处理如下
package com.example.testsocket; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.util.Log; public class SocThread extends Thread {
private String ip = "10.0.0.113";
private int port = 6666;
private String TAG = "socket thread";
private int timeout = 10000;
private int maxsize = 256;// 默认接受大小 public Socket client = null;
// PrintWriter out;
// BufferedReader in;
OutputStream out;
InputStream in;
public boolean isRun = true;
Handler inHandler;
Handler outHandler;
Context ctx;
private String TAG1 = "===Send===";
SharedPreferences sp; public SocThread(Handler handlerin, Handler handlerout, Context context) {
inHandler = handlerin;
outHandler = handlerout;
ctx = context;
MyLog.i(TAG, "创建线程socket");
} /**
* 连接socket服务器
*/
public void conn() { try {
initdate();
Log.i(TAG, "连接中……");
client = new Socket(ip, port);
client.setSoTimeout(timeout);// 设置阻塞时间
MyLog.i(TAG, "连接成功");
in = client.getInputStream();
out = client.getOutputStream();
// 以下在字符流时比较好用
// in = new BufferedReader(new InputStreamReader(
// client.getInputStream()));
// out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
// client.getOutputStream())), true);
MyLog.i(TAG, "输入输出流获取成功");
} catch (UnknownHostException e) {
MyLog.i(TAG, "连接错误UnknownHostException 重新获取");
e.printStackTrace();
conn();
} catch (IOException e) {
MyLog.i(TAG, "连接服务器io错误");
e.printStackTrace();
} catch (Exception e) {
MyLog.i(TAG, "连接服务器错误Exception" + e.getMessage());
e.printStackTrace();
}
} public void initdate() {
sp = ctx.getSharedPreferences("SP", ctx.MODE_PRIVATE);
ip = sp.getString("ipstr", ip);
port = Integer.parseInt(sp.getString("port", String.valueOf(port)));
MyLog.i(TAG, "获取到ip端口:" + ip + ";" + port);
} /**
* 实时接受数据
*/
@Override
public void run() {
MyLog.i(TAG, "线程socket开始运行");
conn();
MyLog.i(TAG, "1.run开始");
String line = "";
while (isRun) {
try {
if (client != null) {
MyLog.i(TAG, "2.检测数据");
byte[] temp = new byte[maxsize];// 默认最带为256
int size = 0;
while ((size = in.read(temp)) > 0) {
// -1表示文件结尾
byte[] res = new byte[size];// 默认最带为256
MyLog.i(TAG, "4.start set Message 字节读取");
System.arraycopy(temp, 0, res, 0, size);
for (int i = 0; i < size; i++) {
line += res[i] + " ";
}
MyLog.i(TAG, "3.getdata " + line + " size=" + size);
MyLog.i(TAG, "4.start set Message");
Message msg = inHandler.obtainMessage();
msg.obj = line;
inHandler.sendMessage(msg);// 结果返回给UI处理
MyLog.i(TAG1, "5.send to handler");
} } else {
MyLog.i(TAG, "没有可用连接");
conn();
}
} catch (Exception e) {
MyLog.i(TAG, "数据接收错误" + e.getMessage());
e.printStackTrace();
}
}
} /**
* 发送数据
*
* @param mess
*/
public void Send(byte[] mess) {
try {
if (client != null) {
MyLog.i(TAG1, "发送" + mess + "至"
+ client.getInetAddress().getHostAddress() + ":"
+ String.valueOf(client.getPort()));
out.write(mess);//按字节发送
out.flush();
MyLog.i(TAG1, "发送成功");
Message msg = outHandler.obtainMessage();
msg.obj = mess;
msg.what = 1;
outHandler.sendMessage(msg);// 结果返回给UI处理
} else {
MyLog.i(TAG, "client 不存在");
Message msg = outHandler.obtainMessage();
msg.obj = mess;
msg.what = 0;
outHandler.sendMessage(msg);// 结果返回给UI处理
MyLog.i(TAG, "连接不存在重新连接");
conn();
} } catch (Exception e) {
MyLog.i(TAG1, "send error");
e.printStackTrace();
} finally {
MyLog.i(TAG1, "发送完毕"); }
} /**
* 关闭连接
*/
public void close() {
try {
if (client != null) {
MyLog.i(TAG, "close in");
in.close();
MyLog.i(TAG, "close out");
out.close();
MyLog.i(TAG, "close client");
client.close();
}
} catch (Exception e) {
MyLog.i(TAG, "close err");
e.printStackTrace();
} }
}
参考:
java 从InputStream 获取字节数组
Android笔记:利用InputStream和BufferedReader 进行字节流 字符流处理的更多相关文章
- -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流
File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...
- IO流(字节流,字符流,缓冲流)
一:IO流的分类(组织架构) 根据处理数据类型的不同分为:字节流和字符流 根据数据流向不同分为:输入流和输出流 这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图: 二:字符字节 ...
- IO 复习字节流字符流拷贝文件
/* 本地文件 URL 文件拷贝 *//*文本文件拷贝 可以通过 字符流,也可以通过字节流*/ /*二进制文件拷贝 只可以通过字节流*//* 希望这个例子能帮助搞懂 字符流与字节流的区别 */ imp ...
- IO—》字节流&字符流
字节流 一.字节输出流OutputStream OutputStream此抽象类,是表示输出字节流的所有类的超类.操作的数据都是字节,定义了输出字节流的基本共性功能方法. FileOutputStre ...
- Java之IO流(字节流,字符流)
IO流和Properties IO流 IO流是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键, 因而所有 I/O 的主体实际上是内置在操作系统中的.单独的 ...
- 【C#IO 操作】stream 字节流|字符流 |比特流
stream的简介 Stream 所有流的抽象基类. 流是字节序列的抽象,例如文件.输入/输出设备.进程中通信管道或 TCP/IP 套接字. Stream类及其派生类提供这些不同类型的输入和输出的一般 ...
- servlet 之 response 回复 字节流 字符流
重定向 设置状态吗为302 添加响应头Location(告诉他重定向到哪里去) //response.setStatus(302); //添加响应头Locatio ...
- Java开发笔记(八十五)通过字符流读写文件
前面介绍了文件的信息获取.管理操作,以及目录下的文件遍历,那么文件内部数据又是怎样读写的呢?这正是本文所要阐述的内容.File工具固然强大,但它并不能直接读写文件,而要借助于其它工具方能开展读写操作. ...
- java 输入输出IO流 字节流| 字符流 的缓冲流:BufferedInputStream;BufferedOutputStream;BufferedReader(Reader in);BufferedWriter(Writer out)
什么是缓冲流: 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率. 图解: 1.字节缓冲流BufferedInputStr ...
随机推荐
- webkit浏览器渲染影响因素分析
前言:浏览器的渲染对性能影响非常大,特别是在移动端页面,在宏观上,我们可以参考雅虎那20几条军规来操作,但在微观渲染层面,实际还没有一套相对成型的理论做为依据. 本文只是抛砖引玉,带大家进入微观的优化 ...
- 命令模式坚决svn树冲突(local unversioned, incoming add upon update)
当工作目录修改删除过时更新使用svn更新就容易发生树冲突“Tree Confilict”.会出现类似提示. local unversioned, incoming add upon update 如果 ...
- 修改setInterval作用域
Hello,今天和大家分享如何修改setInterval作用域. 0.引子 最近在做一个项目的时候需要开发一个图片轮播显示的组件,在实现过程中遇到了关于setInterval作用域的问题. Slide ...
- C#多线程与异步的区别
随着拥有多个硬线程CPU(超线程.双核)的普及,多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论.本文主要是想与园中各位高手一同探讨一下如何使用并发来最大化程序的性能. 多线程和异步操作的异 ...
- 【BZOJ】1602: [Usaco2008 Oct]牧场行走(lca)
http://www.lydsy.com/JudgeOnline/problem.php?id=1602 一开始以为直接暴力最短路,但是n<=1000, q<=1000可能会tle. 显然 ...
- Wilddog - 野狗统计
根据业务需求提出的统计代码. <!DOCTYPE HTML> <html lang="en-US"> <head> <meta chars ...
- 为公司无线网络启用802.1x协议
1. EAP类型: EAP-PEAP, EAP-TLS, EAP-TTLS, EAP-MD5 TLS需要客户端服务器端都有证书; 而PEAP和TTLS只需要服务器端证书. 2. 身份验证协议: PAP ...
- 3种用组策略将域帐号加入本地管理员组的方法_jinifly_新浪博客
次当前系统域帐号是怎么在第一次登录时,自动加入域客户端本地管理员组的?我猜不外乎就是脚本.计算机策略或虚拟机初始化的自动应答脚本,结果系统的前任同事找到了答案--GPO的用户策略(确切讲是用户首选项) ...
- 《GK101任意波发生器》升级固件发布(版本:1.0.2build198)
一.固件说明: 硬件版本:0,logic.3 固件版本:1.0.2.build198 编译日期:2014-09-17 ====================================== 二. ...
- SDUT 2610 Boring Counting(离散化+主席树区间内的区间求和)
Boring Counting Time Limit: 3000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descriptio ...