我们在开发过程中不可避免遇到字符编码问题。遇到乱码问题的时候一定要保持清晰,网上很多关于字符编码集,这里我也就不介绍各种编码,这里我介绍自己编程中遇到字符编码问题时的思路。

  乱码问题 无非就是 字节 与 字符 转换时出现问题。

  

  下面一张图显示处理数据的过程:

  

   

  

  

  上面过程中 最复杂的就是 编码 与 解码 两个过程,幸运的是 现在的高级语言都已经帮我们把整个步骤做了。

  而 存储 与 读取这两个步骤之中我们最常见的就是 读取 问题,因为存储非常简单,而读取就要考虑到字符编码的问题了。

  我们知道在C语言中读取文件最基本的方法是read(int fd, void *buf, sizt_t qty)    fd文件描述符 buf 用来存放数据的目的缓冲区 qty:要读取的字节数

  我们要考虑的是把文件中的字节读取出来后如何组装这些字节,让他们显示原来的模样,用C语言处理明显很复杂,但是其他语言都是基于C语言的处理过程,我们要明白大致原理。

  Java I/O最低层的 InputStream接口(面向字节),其他所有的高层I/O接口都是基于该接口的。所以我们不管是文件处理还是网络编程一般都是先获得要处理对象的InputStream实例,然后现在选择 合适的接口 对InputStream的实例进行封装。而这些接口都帮我们完成了解码过程,所以我们一般在创建这些接口实例的时候只用指定解码方案就可以了, 而且解码方案要和编码方案一致,不然就乱码了。

  下面代码读取的是博客园的首页的HTML代码:

         //创建一个Resource对象
UrlResource url = new UrlResource("http://www.cnblogs.com");
//获取资源的InputStream
InputStream in = url.getInputStream();
//解码方案
String charsetName = "UTF-8";
//选择合适的IO接口,因为这里我们要读取的是网页,所以选择Scanner接口比较合适
//Scanner:一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。
Scanner scanner = new Scanner(in, charsetName);
while (scanner.hasNextLine())
System.out.println(scanner.nextLine());

  里面的 URLResource 引用了Spring 里面的 类。

  

  所以在Java IO编程的时候 我们要做的也就两个步骤 1: 选择合适的IO接口 2 选择合适的编码/解码方案

Java I/O编程思路的更多相关文章

  1. 3.JAVA之GUI编程Frame窗口

    创建图形化界面思路: 1.创建frame窗体: 2.对窗体进行基本设置: 比如大小.位置.布局 3.定义组件: 4.将组件通过add方法添加到窗体中: 5.让窗体显示,通过setVisible(tur ...

  2. 二十三、Java基础--------网络编程

    Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...

  3. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  4. 【转】Lua coroutine 不一样的多线程编程思路

    Lua coroutine 不一样的多线程编程思路 Sunday, Apr 26th, 2009 by Tim | Tags: coroutine, Lua 上周末开始看<Lua程序设计> ...

  5. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

  6. JAVA的网络编程【转】

    JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...

  7. 【Socket】Java Socket基础编程

    Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...

  8. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  9. helloworld讲解cocos2d-x的编程思路与要点

    用helloworld讲解cocos2d-x的编程思路与要点 本文以cocos2d-x的helloworld为例,讲解cocos2d-x引擎的特点和要点,2.2为了展示新功能,把包括屏幕自适应在内的新 ...

随机推荐

  1. G - Shuffle'm Up

    题目大意: 是一个洗牌游戏,首先给出两堆牌,s1,s2,先从s1上面拿一张牌再从s2上面拿一张牌依次往下可以洗好牌,然后把洗好的牌再分成两堆继续洗,直到这堆牌的顺序与给的顺序相同可以停止,当然如果洗不 ...

  2. HDU 4118 树形DP Holiday's Accommodation

    题目链接:  HDU 4118 Holiday's Accommodation 分析: 可以知道每条边要走的次数刚好的是这条边两端的点数的最小值的两倍. 代码: #include<iostrea ...

  3. mybatis 关联对象mapper.xml的写法

    https://github.com/zfrHJ/mybaties/blob/master/mybaties/src/com/itheima/mybatits/mapper/OrdersMapperC ...

  4. 通过控件获取cell

    #pragma mark - 通过控件获取cell -(UITableViewCell*)GetCellFromTableView:(UITableView*)tableView Sender:(id ...

  5. opengl 函数

    ( 7 )光栅化.象素操作函数. 像素位置 glRasterPos*() .线型宽度 glLineWidth() .多边形绘制模式 glPolygonMode() ,读取象素 glReadPixel( ...

  6. [转] Nginx + CGI/FastCGI + C/Cpp

    接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...

  7. [转] 消息系统该Push/Pull模式分析

    信息推拉技术简介 “智能信息推拉(IIPP)技术”是在网上信息获取技术中加入了智能成份,从而有助于用户在海量信息中高效.及时地获取最新信息,提高了信 息系统主动信息服务的能力.如果引入基于IIPP的主 ...

  8. Android的GridView和Gallery结合Demo

    Android的GridView和Gallery结合Demo Demo介绍:首页是一个GridView加载图片,竖屏时显示3列图片,横屏时显示4列图片;并且对图片进行大小限制和加灰色边框处理. 点击某 ...

  9. .NET六大剑客:栈、堆、值类型、引用类型、装箱和拆箱

    .NET六大剑客:栈.堆.值类型.引用类型.装箱和拆箱 一.“堆”,“栈”专区 这两个字我相信大家太熟悉了,甚至于米饭是什么?不知道...“堆”,“栈”是什么?哦,这个知道... 之前我也写过一篇堆栈 ...

  10. css.day02

    1.复合选择器 复合选择器 一般会有几个标签混合使用 .把多个组合成一个  称之为复合 1.1标签指定式 复合选择器 (交集选择器) 格式: 标记选择器+ 类名/ID名称 { 属性:值;} 实际情况用 ...