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

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

  

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

  

   

  

  

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

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

  我们知道在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. python 代码格式化工具:autopep8

    学习资料: https://github.com/hhatto/autopep8 背景 autopep8 会根据 PEP 8 样式文档来格式化 python 代码.它使用 pep8 来决定代码的哪部分 ...

  2. linux 编译安装apache

    1.下载apache.安装apache #wget http://apache.etoak.com//httpd/httpd-2.4.4.tar.gz #tar zxvf httpd-2.4..4.t ...

  3. N - Is It A Tree?(判断环)

    题意,就是判断这点点是不是组成的一颗树,也就是判断是否有环,就是没看出来如果是森林怎么办,试一试吧,最可恶的还没有说有多少节点.....就是个坑 /////////////////////////// ...

  4. Heavy Transportation

    题目大意: 雨果的沉重运输是快乐的,当浮空运输出现故障时候他可以扩展业务, 但他需要一个聪明的人告诉他是否真的是一种把他的客户构建了巨型钢起重机的地方需要的所有街道都可以承受重量(这句是直接有道翻译的 ...

  5. poj2325

    题目大意描述: 题目:固执的数??持久的数?? 2014/12/06 18:41 数字乘法的持久性由 Neil Sloane定义, (Neil Sloane在一个娱乐杂志上发表关于数字持久性的文章 6 ...

  6. 常用的bat命令

    获取输入法adb shell settings get secure default_input_method修改输入法adb shell settings put secure default_in ...

  7. [Angular 2] ng-class and Encapsulated Component Styles

    import {Input, Component, View, NgClass} from "angular2/angular2"; @Component({ selector: ...

  8. Android-Socket传输 GPRS网络

    手机使用GPRS网络与server进行Socket通信,代码下载地址:http://download.csdn.net/detail/wu20093346/7768481 用UDP协议与Socket调 ...

  9. CSDN markdown 编辑器 第四篇 LaTex语法

    Latex是为了写数学公式的. 嗯-但实际这样的语言的作用是为了排版的.数学公式仅仅是他的附加属性. 可是markdown引入这个全然是为了写公式.其它的Latex语法不支持. CSDN markdo ...

  10. 我也要这样写define、、

    今天在TCO1B看到这位大神的代码,简直醉了,当需要手速的时候可以考虑使用一下.. #define V(x) vector<x > #define vs V(string) #define ...