已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaIO流详解参考网址:/kevinyangxu/archive/2010/11/28/1890248.html/qamefay/archive/2011/09/01/2161495.htmlJava IO流 一 流的概念 流(Stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程的通信,或读写外围设备、外部文件等。 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。 流的方向是重要的,根据流的方向,流可以分为2类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,但不能读它。 实际上,流的源端和目的端可简单的看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读取数据,而对输出流,也可不知道它的目的端,只是简单的往流中写数据。二 流的三种分类方式 1.按流的方向分为:输入流和输出流 2.按流的数据单位不同分为:字节流和字符流 3.按流的功能不同分为:节点流和处理流三 流的层次结构 四 缓冲流 : 缓冲流要套接在相应的节点流觞,提高了读写的效率。 此处理流的构造方法都得传相对应的基类类型 BufferedReader:提供了readLine方法,用于高效读取一行字符串 BufferedWriter: 提供了newLine用于写入一个行分隔符也就是换行五 转换流:主要作用将字节流转换成字符流。 InputStreamReader 需要和InputStream套接 OutputStreamWriter 需要和OutputStream套接 eg: InputStremReader input=new InputStreamReader(new FileInputStream(.);六 流的结构: 根接口:InputStream/OutputStream 充当数据源的IO类有FileInputStream/FileOutputStream,ByteArrayInputStream/ByteArrayOutputStream等。 充当装饰功能的IO类 BufferedInputStream/BufferedOutputStream,DataInputStream/DataOutputStream等。 它们都是继承装饰接口FilterInputStream/FilterOutputStream. 使用IO时,首先创建一个数据源IO,然后根据需要的功能创建装饰类IO,其构造函数的参数为以创建的数据源IO eg: 我们以创建一个具有缓冲的文件输入流为例,假定需要从磁盘读取文件“C:log.txt”: / 创建一个FileInputStream: FileInputStream fileInput = new FileInputStream(”C:log.txt”); / 创建一个BufferedInputStream: BufferedInputStream bufferedInput = new BufferedInputStream(fileInput); / 现在得到的bufferedInput即是具有缓冲的文件输入流 或者进一步简写如下: InputStream input = new BufferedInputStream(new FileInputStream(”C:log.txt”); / 现在得到的input即是具有缓冲的文件输入流 java.io.Reader 和 java.io.InputStream 区别java.io.Reader 和 java.io.InputStream 组成了 Java 输入类。Reader 用于读入16位字符,也就是 Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。在 Java 中,有不同类型的 Reader 输入流对应于不同的数据源: FileReader 用于从文件输入; CharArrayReader 用于从程序中的字符数组输入; StringReader 用于从程序中的字符串输入; PipedReader 用于读取从另一个线程中的 PipedWriter 写入管道的数据。相应的也有不同类型的 InputStream 输入流对应于不同的数据源: FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。另外,还有两种没有对应 Reader 类型的 InputStream 输入流:相信有过学过JavaEE的人们都有遇到过中文乱码问题吧,最简单的就是表单数据提交时中文出现乱码,乱码难解决吗?其实不难,只要掌握好编码的设置,乱码神马的一边去。 今天主要就讲讲一些常用的可以设置编码的函数的用法。讲一下常见的编码,例如ISO-8859-1,gbk,utf-8等,这三个就是最常见的了。首先,为了防止乱码,我们得先统一编码,然后出现乱码再通过一些函数来解决。 下面讲讲常见的中文乱码解决方法和例子吧.既然说了表单数据出现中文乱码,那就顺便说说解决方法吧. 函数:new String(byte data, String encoding); 这个方法主要就是用于解决上面说的表单数据提交时出现中文乱码,这个方法通常与String.getBytes(String encoding)一起使用. 用法:String str = new String(formMsg.getBytes(ISO-8859-1),utf-8); 因为今天主要要讲一下IO流操作中易出现的中文乱码解决方法,所以就言归正传,说说我在学习中遇到的乱码问题和解决方法吧. 首先,我们都知道Java的IO流中按字节分就有字节流和字符流之分,看字面意思就知道,字节流是按字节为单位来操作的,而字符流当然是按字符为单位来操作的咯,字节流一般是用来操作一些二进制文件,例如MP3文件,JPG等等。字符流呢?一般是用来操作一些文本文件。 android中也有很多地方涉及到IO流操作,当然也有不少中文乱码问题。有一些细节没注意到就有可能导致乱码。 首先讲讲字节流,先贴一方法吧。?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849/* * 读取文件 */public String readerFile(File f) String str = ; FileInputStream fis = null; try fis = new FileInputStream(f); byte b = new byte512; int n; while (n = fis.read(b) != -1) str = str + new String(b, 0, n); b = new byte512; catch (Exception e) e.printStackTrace(); finally try fis.close(); catch (Exception e) e.printStackTrace(); return str; 这个方法就是通过传进的File对象,读取里面的内容,返回一个字符串,如果你把这方法copy去读取含有中文的文件,无意外的话就会出现中文乱码,如果出现中文乱码,该如何解决呢?其实String类有提供方法解决,只要把str = str + new String(b, 0, n);改成str =str + new String(b, 0, n, gbk);就可以解决了。 上面的方法在一般情况下是可以读取中文了,但是,仔细想想,毕竟上面的方法是以字节为单位的,而一个中文占了两个字节,细心的同学应该已经想到了,上面的方法是一次读取512个字节,如果,一个中文刚好就占了第512个字节和第513个字节,你一次读512个字节,狠狠得把他们拆散了,重新new了一个新的字符串,你说乱码不乱码? 所以说,操作含有中文的文件还是通过字符流来好了,字符流操作起来又快,虽然从字节流一步一步升级到字符流有点烦. 还是先贴一方法吧。 ?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253/* * 升级版读取文件 */public String readerFile(File f) String str = ; String line = ; FileInputStream fis = null; InputStreamReader isr = null; BufferedReader br = null; try fis = new FileInputStream(f); isr = new InputStreamReader(fis); br = new BufferedReader(isr); while (line = br.readLine() != null) str = str + line; catch (Exception e) e.printStackTrace(); finally try fis.close(); catch (Exception e) e.printStackTrace(); return str; 如果按上面方法写最后还是出现乱码,你会如何解决?在哪个地方设置正确的编码? 你会学第一种方法?str = str + new String(line.getBytes(ISO-8859-1),gbk);?你自己去试试吧- -。 那你会学第二种方法?str = str + new String(line,gbk);?根本就没有这个方法. 那到底要怎么解决? 其实,Java里有很多地方可以设置编码,上面的解决方法只要把isr = newInputStreamReader
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 5781-2025紧固件六角头螺栓全螺纹C级
- 运矿排土工岗前道德考核试卷含答案
- 味精原料粉碎工岗前评优竞赛考核试卷含答案
- 渔船机驾长岗位合规化技术规程
- 生物柴油装置操作工现场作业技术规程
- 食糖制造工岗前安全意识强化考核试卷含答案
- 胃食管反流病常见症状及护理技术培训
- 肝硬化宣教带图
- 动物营养学课件
- 风湿热诊疗与护理规范
- 2024人教版七年级数学上册全册教案
- 《船舶结构与货运(大副)》-第1章 船舶种类与船体结构
- 2025届新疆维吾尔新疆生产建设兵团可克达拉市中考一模数学试题含解析
- 卫星互联网基础知识培训课件
- 汽车吊安全培训讲稿课件
- 假如我是校长课件
- 国资委贸易管理办法
- DB3208∕T 229-2024 河蟹池塘绿色养殖技术规程
- 肉牛防疫培训课件
- 现代德国的学前教育发展
- 银行安全防范系统工程难点重点分析及监理措施
评论
0/150
提交评论