- 浏览: 325762 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
y_715:
document.getElementById("e ...
JSTL EC TABLE extremeTable 学习 -
wangyj0898:
学习了。。。
display table 标签用法 -
hejiajie2008:
没有图啊
图解myeclipse把maven普通java项目变成web项目的全程操作 -
zhangyu_2100:
[align=center][/align][color=br ...
request.getRealPath()的替代方法 -
senhui19:
LZ写的真不错呀,现在开发中都经常是用DetachedCrit ...
Hibernate的Criteria用法总结
Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流....本文的目的是为大家做一个简要的介绍。
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样
Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的:
在这其中InputStream和OutputStream在早期的Java版本中就已经存在了,它们是基于字节流的,而基于字符流的Reader和 Writer是后来加入作为补充的。以上的层次图是Java类库中的一个基本的层次体系,如果你感兴趣想了解更多内容的话,可以到Sun公司主页 获取更多信息。
在这四个抽象类中,InputStream和Reader定义了完全相同的接口:
int read() int read(char cbuf[]) int read(char cbuf[], int offset, int length) |
而OutputStream和Writer也是如此:
int write(int c) int write(char cbuf[]) int write(char cbuf[], int offset, int length) |
这六个方法都是最基本的,read()和write()通过方法的重载来读写一个字节,或者一个字节数组。
更多灵活多变的功能是由它们的子类来扩充完成的。知道了Java输入输出的基本层次结构以后,本文在这里想给大家一些以后可以反复应用例子,对于所有子类的细节及其功能并不详细讨论。
import java.io.*; public class IOStreamDemo { public void samples() throws IOException { //1. 这是从键盘读入一行数据,返回的是一个字符串 BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in)); System .out.print("Enter a line:" ); System .out.println(stdin.readLine()); //2. 这是从文件中逐行读入数据 BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java" )); String s, s2 = new String(); while ((s = in.readLine())!= null ) s2 += s + "\n" ; in.close(); //3. 这是从一个字符串中逐个读入字节 StringReader in1 = new StringReader(s2); int c; while ((c = in1.read()) != -1) System .out.print((char)c); //4. 这是将一个字符串写入文件 try { BufferedReader in2 = new BufferedReader(new StringReader(s2)); PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out" ))); int lineCount = 1; while ((s = in2.readLine()) != null ) out1.println(lineCount++ + ": " + s); out1.close(); } catch (EOFException e) { System .err.println("End of stream" ); } } } |
对于上面的例子,需要说明的有以下几点:
1. BufferedReader 是Reader 的一个子类,它具有缓冲的作用,避免了频繁的从物理设备中读取信息。它有以下两个构造函数:
BufferedReader (Reader in) BufferedReader (Reader in, int sz) |
这里的sz是指定缓冲区的大小。
它的基本方法:
void close( ) //关闭流 void mark(int readAheadLimit) //标记当前位置 boolean markSupported() //是否支持标记 int read() //继承自Reader的基本方法 int read(char [] cbuf, int off, int len) //继承自Reader的基本方法 String readLine() //读取一行内容并以字符串形式返回 boolean ready() //判断流是否已经做好读入的准备 void reset() //重设到最近的一个标记 long skip(long n) //跳过指定个数的字符读取 |
2. InputStreamReader 是InputStream 和Reader 之间的桥梁,由于System.in是字节流,需要用它来包装之后变为字符流供给 BufferedReader 使用。
3. PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out" )));
这句话体现了Java输入输出系统的一个特点,为了达到某个目的,需要包装好几层。首先,输出目的地是文件IODemo.out,所以最内层包装的是FileWriter,建立一个输出文件流,接下来,我们希望这个流是缓冲的,所以用BufferedWriter 来包装它以达到目的,最后,我们需要格式化输出结果,于是将PrintWriter 包在最外层。
Java提供了这样一个功能,将标准的输入输出流转向,也就是说,我们可以将某个其他的流设为标准输入或输出流,看下面这个例子:
import java.io.*; public class Redirecting { public static void main(String [] args) throws IOException { PrintStream console = System.out; BufferedInputStream in = new BufferedInputStream ( new FileInputStream ( "Redirecting.java" )); PrintStream out = new PrintStream ( new BufferedOutputStream ( new FileOutputStream ("test.out" ))); System.setIn(in); System.setOut(out); BufferedReader br = new BufferedReader ( new InputStreamReader (System.in)); String s; while ((s = br.readLine()) != null ) System.out.println(s); out.close(); System.setOut(console); } } |
在这里java.lang.System的静态方法
static void setIn(InputStream in) static void setOut(PrintStream out) |
提供了重新定义标准输入输出流的方法,这样做是很方便的,比如一个程序的结果有很多,有时候甚至要翻页显示,这样不便于观看结果,这是你就可以将标准输出流定义为一个文件流,程序运行完之后打开相应的文件观看结果,就直观了许多。
Java流有着另一个重要的用途,那就是利用对象流对对象进行序列化。下面将开始介绍这方面的问题。
在一个程序运行的时候,其中的变量数据是保存在内存中的,一旦程序结束这些数据将不会被保存,一种解决的办法是将数据写入文件,而Java中提供了一种机制,它可以将程序中的对象写入文件,之后再从文件中把对象读出来重新建立。这就是所谓的对象序列化Java中引入它主要是为了RMI(Remote Method Invocation)和Java Bean所用,不过在平时应用中,它也是很有用的一种技术。
所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子:
import java.io.*; import java.util.*; public class Logon implements Serializable { private Date date = new Date(); private String username; private transient String password; Logon(String name, String pwd) { username = name; password = pwd; } public String toString() { String pwd = (password == null ) ? "(n/a)" : password; return "logon info: \n " + "username: " + username + "\n date: " + date + "\n password: " + pwd; } public static void main(String[] args) throws IOException , ClassNotFoundException { Logon a = new Logon("Morgan" , "morgan83" ); System .out.println( "logon a = " + a); ObjectOutputStream o = new ObjectOutputStream ( new FileOutputStream ("Logon.out" )); o.writeObject(a); o.close(); int seconds = 5; long t = System .currentTimeMillis() + seconds * 1000; while (System .currentTimeMillis() < t) ; ObjectInputStream in = new ObjectInputStream ( new FileInputStream ("Logon.out" )); System .out.println( "Recovering object at " + new Date()); a = (Logon)in.readObject(); System .out.println("logon a = " + a); } } |
类Logon是一个记录登录信息的类,包括用户名和密码。首先它实现了接口Serializable,这就标志着它可以被序列化。之后再main方法里ObjectOutputStream o = new ObjectOutputStream ( new FileOutputStream ("Logon.out" ));新建一个对象输出流包装一个文件流,表示对象序列化的目的地是文件Logon.out。然后用方法writeObject 开始写入。想要还原的时候也很简单ObjectInputStream in = new ObjectInputStream ( new FileInputStream ("Logon.out" ));新建一个对象输入流以文件流Logon.out为参数,之后调用readObject方法就可以了。
需要说明一点,对象序列化有一个神奇之处就是,它建立了一张对象网,将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件,更为奇妙的是,如果你一次序列化了好几个对象,它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝,有关深层拷贝的问题在JavaWorld 上有一篇文章做了几种实现方法的介绍和比较,有兴趣者可以去看看。
关键字transient在这里表示当前内容将不被序列化,比如例子中的密码,需要保密,所以没有被写入文件。
对Java的输入输出功能,就浅浅的介绍到这里,本文的目的只是开一个好头,希望能让大家对Java输入输出流有个基本的认识,更多更为全面的信息在http://java.sun.com有权威的说明。
发表评论
-
智力题
2010-08-27 10:56 1774A说:是B偷吃的,B说:是D偷吃的。C说;我没有偷吃。D说:B ... -
experience
2009-12-28 12:05 11461.报错信息 servlet-mapping配置的问题200 ... -
JDBC高级应用二
2009-12-28 11:33 978JDBC高级应用(二)本来想继续谈JDBC的高级连结方式,事务 ... -
在JAVA文件中获取该项目的相对路径
2009-11-12 14:36 13971.基本概念的理解 绝对路径:绝对路径就是你的主页上的文 ... -
明明白白Unsupported major.minor version 49.0的错误
2009-10-26 17:19 952一:要解决的问题 我们在尝鲜 JDK1.5 的时候,相信不少人 ... -
log4j详解
2009-09-02 13:04 828log4j.properties 使用 一.参数意义说明 输出 ... -
java 文件读取 路径问题
2009-08-25 15:23 15121.如何获得当前文件路径 常用: 字符串类型:System ... -
图解myeclipse把maven普通java项目变成web项目的全程操作
2009-08-05 20:06 3937图解myeclipse把maven普通java项目变成web项 ... -
浅谈java输入输出流(二)
2009-07-09 18:05 2379导读: stream代表的是任何有能力产出数据的数据源,或 ... -
常用Java开源库(新手必看)
2008-12-15 12:46 1745Jakarta common: Commons Logging ... -
浅谈Java内部类的四个应用场景
2008-12-15 12:44 913Java内部类是Java言语的一个很重要的概念,《Java编程 ... -
使用 HttpClient 和 HtmlParser 实现简易爬虫
2008-12-02 20:51 1423这篇文章介绍了 HtmlParse ... -
htmlparser使用指南
2008-11-28 13:10 1996转载:http://www.yeeach.com/2008/0 ... -
file的getPath getAbsolutePath和getCanonicalPath的不同
2008-09-16 09:12 1077file的这几个取得path的 ... -
JAVA使用winrar解压缩和解带有密码的压缩包的一个类
2008-09-05 13:38 2684通过使用winrar这个工具对文件进行操作。唯一 ... -
window.event的属性
2008-08-07 18:03 1612<script language="JavaS ... -
十个习惯让你精通新的开发技术(转)
2008-05-29 17:44 1032这篇文章,是从我的《 ... -
java汉字转换为拼音
2008-05-09 17:14 2019import java.util.Iterator;impor ... -
把JSP放到WEB-INF后以保护JSP源代码
2008-04-17 08:52 4610本人在看《J2EE核心模式》(“Core J2ee Patte ... -
关于VO、PO的理解-java的(PO,VO,TO,BO,DAO,POJO)解释
2008-03-30 17:00 1601O/R Mapping 是 Object Relational ...
相关推荐
浅谈Java的输入输出流.pdf 浅谈Java的输入输出流.pdf
浅谈Java输入输出流的使用。 Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。在Java类库中,IO部分的内容是很庞大的,因为它涉及...
软件工程师-浅谈Java的输入输出流技术步骤说明.pdf
Java语言的输入输出功能是十分...在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流....本文的目的是为大家做一个简要的介绍。
精品教育教学资料
Java中的流分为两种,一种是字节流,另一种是字符流。这篇文章主要介绍了JAVA中输入输出流的相关资料,需要的朋友可以参考下
通常,我们从某一台计算机上面取得另一台计算机上的信息是通过socket的输入/输出流,打开另一台计算机的socket连接,然后取得outputStream来写入数据.但如果要调用另一台计算机上,另一个Java虚拟机上面的对象的...
A 打印输出,比如java的System.out.println(),比如js的alert(),这种办法常用,必须掌握 B Debug,可以参考我们的视频《坦克大战》,详细讲了Eclipse的调试。 C 删掉一部分调试一部分,也就是去掉一...
1387.4 以数据库作为输入输出 1437.5 保持输出的顺序 1457.6 小结 146第8章 管理Hadoop 1478.1 为实际应用设置特定参数值 1478.2 系统体检 1498.3 权限设置 1518.4 配额管理 1518.5 启用回收站 ...