- 浏览: 1305681 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
kay11:
...
JAVA生成简单的随机字符串(a-zA-Z0-9) -
zhangliguoaccp:
您好关于登录页面的验验证码这块怎么解决的?还有登录成功后,跳转 ...
JAVA,模拟HTTP登录 -
107x:
不错,谢谢!
<c:foreach 循环 map -
wenjin:
不知楼主是不还在想请叫一下我自己开的Tomcat下载一个文件C ...
Android 下载文件及写入SD卡 -
zyywgf:
JSTL c标签,fn标签,fmt标签
java的核心库java.io提供了全面的IO接口,包括:文件读写,标准设备输出等等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在具体使用中很多初学者对Java.io包的使用非常含糊,本文将详细解说关于Java.io的使用。
一. Input和Output
1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO系统中,所有的stream(包括Input和Out stream)都包括两种类型:
1.1 以字节为导向的stream
以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型:
input
stream:
1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
2) StringBufferInputStream:把一个String对象作为InputStream
3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作
4) PipedInputStream:实现了pipe的概念,主要在线程中使用
5) SequenceInputStream:把多个InputStream合并为一个InputStream
Out
stream
1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2) FileOutputStream:把信息存入文件中
3) PipedOutputStream:实现了pipe的概念,主要在线程中使用
4) SequenceOutputStream:把多个OutStream合并为一个OutStream
1.2 以Unicode字符为导向的stream
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型:
Input
Stream
1) CharArrayReader:与ByteArrayInputStream对应
2) StringReader:与StringBufferInputStream对应
3) FileReader:与FileInputStream对应
4) PipedReader:与PipedInputStream对应
Out
Stream
1) CharArrayWrite:与ByteArrayOutputStream对应
2) StringWrite:无与之对应的以字节为导向的stream
3) FileWrite:与FileOutputStream对应
4) PipedWrite:与PipedOutputStream对应
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如 CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的 是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。
1.3 两种不现导向的stream之间的转换
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。
2. stream添加属性
2.1 “为stream添加属性”的作用
运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。
如果我们要往一个文件中写入数据,我们可以这样操作:
FileOutStream fs = new FileOutStream(“test.txt”);
然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如果我们想实现“先把要写入文件的数据先缓存到内存 中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和 FilterOutStream的子类,为FileOutStream添加我们所需要的功能。
2.2 FilterInputStream的各种类型
2.2.1 用于封装以字节为导向的InputStream
1) DataInputStream:从stream中读取基本类型(int、char等)数据。
2) BufferedInputStream:使用缓冲区
3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)
4) PushbackInputStream:很少用到,一般用于编译器开发
2.2.2 用于封装以字符为导向的InputStream
1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream
2) BufferedReader:与BufferedInputStream对应
3) LineNumberReader:与LineNumberInputStream对应
4) PushBackReader:与PushbackInputStream对应
2.3 FilterOutStream的各种类型
2.2.3 用于封装以字节为导向的OutputStream
1) DataIOutStream:往stream中输出基本类型(int、char等)数据。
2) BufferedOutStream:使用缓冲区
3) PrintStream:产生格式化输出
2.2.4 用于封装以字符为导向的OutputStream
1) BufferedWrite:与对应
2) PrintWrite:与对应
3. RandomAccessFile
1) 可通过RandomAccessFile对象完成对文件的读写操作
2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
3) 可以直接跳到文件中指定的位置
4. I/O应用的一个例子
java 代码
import java.io.*; public class TestIO{ public static void main(String[] args) throws IOException{ //1.以行为单位从一个文件读取数据 BufferedReader in = new BufferedReader( new FileReader("F:\\nepalon\\TestIO.java")); String s, s2 = new String(); while((s = in.readLine()) != null) s2 += s + "\n"; in.close(); //1b. 接收键盘的输入 BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter a line:"); System.out.println(stdin.readLine()); //2. 从一个String对象中读取数据 StringReader in2 = new StringReader(s2); int c; while((c = in2.read()) != -1) System.out.println((char)c); in2.close(); //3. 从内存取出格式化输入 try{ DataInputStream in3 =new DataInputStream(new ByteArrayInputStream(s2.getBytes())); while(true) System.out.println((char)in3.readByte()); } catch(EOFException e){ System.out.println("End of stream"); } //4. 输出到文件 try{ BufferedReader in4 =new BufferedReader(new StringReader(s2)); PrintWriter out1 =new PrintWriter(new BufferedWriter(new FileWriter("F:\\nepalon\\ TestIO.out"))); int lineCount = 1; while((s = in4.readLine()) != null) out1.println(lineCount++ + ":" + s); out1.close(); in4.close(); } catch(EOFException ex){ System.out.println("End of stream"); } //5. 数据的存储和恢复 try{ DataOutputStream out2 =new DataOutputStream(new BufferedOutputStream( new FileOutputStream("F:\\nepalon\\ Data.txt"))); out2.writeDouble(3.1415926); out2.writeChars("\nThas was pi:writeChars\n"); out2.writeBytes("Thas was pi:writeByte\n"); out2.close(); DataInputStream in5 =new DataInputStream( new BufferedInputStream(new FileInputStream("F:\\nepalon\\ Data.txt"))); BufferedReader in5br =new BufferedReader(new InputStreamReader(in5)); System.out.println(in5.readDouble()); System.out.println(in5br.readLine()); System.out.println(in5br.readLine()); } catch(EOFException e){ System.out.println("End of stream"); } //6. 通过RandomAccessFile操作文件 RandomAccessFile rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw"); for(int i=0; i <10; i++) rf.writeDouble(i*1.414); rf.close(); rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r"); for(int i=0; i <10; i++) System.out.println("Value " + i + ":" + rf.readDouble()); rf.close(); rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw"); rf.seek(5*8); rf.writeDouble(47.0001); rf.close(); rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r"); for(int i=0; i <10; i++) System.out.println("Value " + i + ":" + rf.readDouble()); rf.close(); } }
关于代码的解释(以区为单位):
1区中,当读取文件时,先把文件内容读到缓存中,当调用in.readLine()时,再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”)。
1b区中,由于想以缓存字节读取方式从标准IO(键盘)中读取数据,所以要先把标准IO(System.in)转换成字符导向的stream,再进行BufferedReader封装。
2区中,要以字符的形式从一个String对象中读取数据,所以要产生一个StringReader类型的stream。
原文:http://groups.tianya.cn/bulo/ShowArticle.asp?idWriter=0&Key=0&buloid=18526&ArticleID=254743
发表评论
-
Spring 和JFreeChart 用出现Unable to validate using XSD
2012-08-09 17:31 1712错误显示: 信息: XML validation disab ... -
web.xml不认<taglib>解决办法:
2012-07-11 15:24 893在web.xml不认<taglib>解决办法: ... -
Portal服务器,Portlet容器,Portlet 的区别
2011-08-24 17:06 1564这里所说的Portal是指JCP-JSR168规范所描述的 ... -
AMF,RTMP,RTMPT,RTMPS(转)
2011-04-28 13:10 18751. AMF AMF(是Action Message F ... -
web.xml 中的listener,filter,servlet 加载顺序
2011-04-22 13:35 1067首先,加载顺序与它们 ... -
JDOM修改XML中指定节点的内容
2011-03-21 09:45 2148UpdateXML 写道 package com.util; ... -
SSH配置多个数据源
2011-01-18 16:35 9812SSH配置多个数据源 1. 编写hibernate的数据库配 ... -
SSH中调用存储过程
2010-12-29 08:46 5519SSH中调用带返回结果集的存储过程: public clas ... -
HibernateDaoSupport与JdbcDaoSupport总结
2010-12-28 13:56 1285Spring框架中Dao支持总结:Dao 的支持类可以有 ... -
DBCP,CP30及proxool连接池在spring+hibernate中的配置
2010-12-22 17:08 5881用spring默认的连接池性能效率不高, 如果数据库重启, 应 ... -
IP过滤DEMO
2010-11-01 15:59 1229import java.io.IOException; im ... -
FCKEditor Demo
2010-11-01 15:56 1941FCKEditor 的官方下载: http://source ... -
htmlunit带框架的简单处理测试demo
2010-07-07 14:58 3708package com.htmlunit.test; i ... -
模式在SSH中的简单举例
2010-05-17 14:37 1058闲着没事,瞎想,回想了几个简单的模式在SSH的应用。有不对的还 ... -
AspectJ入门 安装及简单使用
2010-05-15 19:20 7029一、下载安装 1. download http: ... -
org.apache.commons.lang.RandomStringUtils
2010-05-05 09:01 1958来自包:apache的commons-lang.jar包下载: ... -
spring字符集过滤器配置
2010-05-04 14:53 2583<!-- spring的字符集过滤器 --> ... -
Cannot instantiate abstract class or interface
2010-05-03 22:49 3876org.hibernate.InstantiationExce ... -
org.hibernate.hql.ast.QuerySyntaxException: ? is not mapped
2010-05-03 21:52 40662010-5-3 21:48:23 org.apache.ca ... -
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit
2010-05-03 21:32 4157MyEclipse 开发 SSH 整合时 java.la ...
相关推荐
java.io包详细解说,讲得很详细 同类文档:Java-从Decorator,Adapter模式看Java IO库,已上传
java.io.CharConversionException: isHexDigit.最近项目运行出现了这个问题,刚开始就知道是编码问题,怎么改编码都不正确,在网上搜到的文章。
java.io.Reader 和 java.io.InputStream 的区别
专业的课程讲解 所有的程序都离不开信息的输入和输出。例如,从键盘读取数据、在网络上交换数据、打印报表、读写文件信息等,都要涉及数据输入输出的处理。...在Java中,处理数据流的类主要被放在java.io包中 。
ajax,js传值到后台,后台出现java.io.CharConversionException: isHexDigit 异常
gnu.io.CommDriver.class gnu.io.CommPort.class gnu.io.CommPortEnumerator.class gnu.io.CommPortIdentifier.class gnu.io.CommPortOwnershipListener.class gnu.io.Configure.class gnu.io.I2C.class gnu.io.I2...
串口通讯需要的jar包,gnu.io.SerialPort; gnu.io.CommPortIdentifier; gnu.io.SerialPort; gnu.io.SerialPortEvent; gnu.io.SerialPortEventListener; gnu.io.UnsupportedCommOperationException; Copy RXTXcomm...
串口通信gnu.io包不存在,这里提供jar包,下载导入即可,亲测可用
java.io.Serializable序列化问题
网上找来了相关java文件,改文件包主要用于解决类似找不到sun.io.CharToByteConverter类及相关方法情况,放到对应引用文件目录下编译即可。 PS:java文件编码格式为UTF-8,如果有其它编码格式,自己调整一下就行,我...
NULL 博文链接:https://yizhilong28.iteye.com/blog/1154098
Java.nio 与Java.io比较
java.io clojure.java.io 的 JK7 java.nio.file.Path 兼容性依赖信息该库托管在 Releases 上。 依赖: [me.moocar/java.io " 0.1.0 " ]用法是 JDK7 中引入的文件路径的抽象。 这个库提供了和 Paths 之间的兼容性。 ...
Eclipse 进行 ANT 时错误 Javadoc failed java.io.IOException Cannot run program javadoc
http://blog.csdn.net/maoxiang/archive/2008/09/20/2954553.aspx 详细见
import java.io.*; public class udptest { ///创建一个数据包套接字对象ds,并且指定连接的端口号 ///创建一个数据包对象dp ///指定一个字节数组,用来存储接受的数据 public static void rev() { try { ...
socket.io,socket.io-client 用于java或android连接nodejs websocket
开发java时,使用的一个引用包,平时dos中测试开发小程序时,可能缺少;
经过研究和讨论,最终决定用Socket.io实现消息的推送,而在SpringBoot用Socket.io实现消息推送在网上的例子太少了,本人研究了一天的Socket.io,终于对Socket.io的应用比较清晰了。为了同行们的相互学习,在这里贴出...