热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第一行代码笔记5:网络

转自:http:blog.csdn.netcynhafaarticledetails6882061一、字节流和字符流1、用在哪a.所有的文件在硬盘或在传输时都是

转自:http://blog.csdn.net/cynhafa/article/details/6882061


一、字节流和字符流


1、用在哪

a.所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的。

b.字符只有在内存中才会形成。某些情况,如一个程序频繁操作一个资源,则性能会很低,此时为了提升性能,就可将一部分数据暂时读入到内存的一块区域中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。


2、原理图


缓存造成两个影响:1)上面说到的提升性能;2)开发中如果使用字符流而不关闭执行,则在文件中看不到输出的内容(因为部分还保存在缓存中),但是用字节流能看到。


3、用法详解

a.用法简介

如上图所示,打开文件,然后得到输入/输出流,读写数据,然后关闭流。


b.类介绍

1)字节流:InputStream/OutputStream是所有字节输入/输出流的祖先。

2)字符流:Reader/Writer是所有读取字符串输入流/输出字符串的祖先。

以上四个类都是抽象的。所有InputStream/OutputStream的子类主要用在处理二进制数据,它是按字节来处理的,但实际上很多数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是需要进行字符集的转化。这两个之间通过InputStreamReader和OutputStreamWriter来关联,开发中出现的中文乱码其实就是在字节流和字符流之间转化不统一造成的。

BufferedInputStream、PipedInputStream之类主要为了提高性能和使用方便。


c.相互转换

1)从字节流转为字符流时,实际上就是byte[]转为String时:public String(byte  bytes[],  String  charsetName)。

2)从字符流转为字节流时, 实际上就是String转为byte[]时:byte[] String.getBytes(String  charsetName)。


d.InputStreamReader、OutputStreamWriter简介

InputStreamReader是字节流通向字符流的桥梁:它使用指定的charset读取字节并将其解码为字符。它使用的字符集可以指定或者使用平台默认的。每次调用InputStreamReader的read()都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多字节,使其超过满足当前读取操作所需的字节。

为了提高效率,可考虑在BufferedReader内包装InputStreamReader:BufferedReader  in  =  new BufferedReader(new  InputStreamReader(System.in))


二、贴一个访问网络的工具类

public static String URLConn(String strURL, String jsonData) {String result = "null";HttpURLConnection conn = null;try {jsonData = "j=" + jsonData;URL url = new URL(strURL);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");conn.setDoOutput(true);conn.setDoInput(true);OutputStream os = conn.getOutputStream();os.write(jsonData.getBytes("utf-8"));BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuffer buffer = new StringBuffer();String line = "";while ((line = in.readLine()) != null) {buffer.append(line);}result = buffer.toString();conn.disconnect();strURL += jsonData;System.out.println("--strURL------" + strURL);System.out.println("打印数据");System.out.println(result);} catch (Exception e) {e.printStackTrace();System.out.println("网络异常:"+e.toString());return "null";
} finally {if (conn != null) {conn.disconnect();}}return result;} // 第一个参数为输入流,第二个参数为字符集编码private static String readData(InputStream inSream, String charsetName)throws Exception {ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = -1;while ((len = inSream.read(buffer)) != -1) {outStream.write(buffer, 0, len);}byte[] data = outStream.toByteArray();outStream.close();inSream.close();return new String(data, charsetName);}
}

当用post传递数据时,需指定传递数据的编码方式(os.write(jsonData.getBytes("utf-8"));),这样服务器端接受中文才能不乱码;还需指定接受服务器数据的编码方式,这样android端才不会乱码。

关于乱码问题:

1、当有os.write(jsonData.getBytes("utf-8"));时,中文可不编码json.put("carName""洗车");

2、os.write(jsonData.getBytes());时,要编码(当然只要默认编码是UTF-8,则可不指定。)json.put("carName"URLEncoder.encode("洗车""utf-8"));

乱码问题欢迎参考这篇文章:http://bashenmail.iteye.com/blog/509046,关注评论。









推荐阅读
author-avatar
三八依依2010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有