Java I/O编程思路
我们在开发过程中不可避免遇到字符编码问题。遇到乱码问题的时候一定要保持清晰,网上很多关于字符编码集,这里我也就不介绍各种编码,这里我介绍自己编程中遇到字符编码问题时的思路。
乱码问题 无非就是 字节 与 字符 转换时出现问题。
下面一张图显示处理数据的过程:

上面过程中 最复杂的就是 编码 与 解码 两个过程,幸运的是 现在的高级语言都已经帮我们把整个步骤做了。
而 存储 与 读取这两个步骤之中我们最常见的就是 读取 问题,因为存储非常简单,而读取就要考虑到字符编码的问题了。
我们知道在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编程思路的更多相关文章
- 3.JAVA之GUI编程Frame窗口
创建图形化界面思路: 1.创建frame窗体: 2.对窗体进行基本设置: 比如大小.位置.布局 3.定义组件: 4.将组件通过add方法添加到窗体中: 5.让窗体显示,通过setVisible(tur ...
- 二十三、Java基础--------网络编程
Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...
- JAVA的网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- 【转】Lua coroutine 不一样的多线程编程思路
Lua coroutine 不一样的多线程编程思路 Sunday, Apr 26th, 2009 by Tim | Tags: coroutine, Lua 上周末开始看<Lua程序设计> ...
- 【转】JAVA之网络编程
转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...
- JAVA的网络编程【转】
JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...
- 【Socket】Java Socket基础编程
Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...
- Java面向对象 网络编程 上
Java面向对象 网络编程 上 知识概要: (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...
- helloworld讲解cocos2d-x的编程思路与要点
用helloworld讲解cocos2d-x的编程思路与要点 本文以cocos2d-x的helloworld为例,讲解cocos2d-x引擎的特点和要点,2.2为了展示新功能,把包括屏幕自适应在内的新 ...
随机推荐
- hive 模块
- python获取网络时间和本地时间
今天我们来看一下如何用python获取网络时间和本地时间,直接上代码吧,代码中都有注释. python获取网络时间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 高效实现 std::string split() API
Qt下一个 QString 实现split()性能.和std::string未实现它的.STL也未实现.只有自己可以写一. #include <string> #include <v ...
- tomcat URL简写案例:模拟站点www.baidu.com的訪问
tomcat URL简写案例:模拟站点 * 实际URL:http://www.baidu.com:8080/myweb/1.html * 实际位置:F:\mywebapps\myweb\1.htm ...
- Linux cpuinfo 详解
在Linux系统中,如何详细了解CPU的信息呢? 当然是通过cat /proc/cpuinfo来检查了,但是比如几个物理CPU/几核/几线程,这些问题怎么确定呢? 经过查看,我的开发机器是1个物理C ...
- Java Math 类中的新功能--浮点数
Java™语言规范第 5 版向 java.lang.Math和 java.lang.StrictMath添加了 10 种新方法,Java 6 又添加了 10 种.这个共两部分的系列文章的 第 1 部分 ...
- 下拉框上移、下移、添加、移除demo
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> <sc ...
- Xcode 的正确打开方式——Debugging(转)
转自CocoaChina http://www.cocoachina.com/ios/20150225/11190.html 程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不 ...
- JavaScript那些事儿(01): 对象
一. 对象是什么 是单身童鞋们正在查找的“对象”吗?是的,他/她就是活生生的对象. Javascript是一种基于对象的语言, 你遇到的所有东西几乎都是对象. 但它又不同于基于类的语言.那么“类”又是 ...
- C++简单工厂模式
核心思想:用一个工厂类根据不同的输入条件new出不同的派生类指针,然后由多态调用不同派生类中virtual函数,得到不同的结果 所有的判断处理在工厂类中完成,通过CreateFactory函数,根据不 ...