- 浏览: 109909 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
晨必须的:
列是求和计算出来的,怎么破?用ResultSetMetaDat ...
ResultSetMetaData和DatabaseMetaData用法介绍 -
xiaoyao3857:
“Apache Ant 是一个基于 Java的生成工具。”就像 ...
Ant是什么? -
glyustb:
但是现在的版本已经没有getbean方法了,改成getObje ...
Spring中的getBean -
jimmy9495:
Class.forName("sun.jdbc. ...
ResultSetMetaData和DatabaseMetaData用法介绍 -
x98zero:
以上的查询适用于SQLSERVER,ORACLE的需要要其他方 ...
like通配符查询
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 { //1. 这是从键盘读入一行数据,返回的是一个字符串
//2. 这是从文件中逐行读入数据 BufferedReader
in = new
BufferedReader(new
FileReader("IOStreamDemo.java"
)); //3. 这是从一个字符串中逐个读入字节
//4. 这是将一个字符串写入文件
} |
对于上面的例子,需要说明的有以下几点:
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 { BufferedReader
br = new
BufferedReader
( new
InputStreamReader
(System.in)); |
在这里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.*; public class
Logon implements Serializable {
int
seconds = 5; |
类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有权威的说明。
发表评论
-
Java反射经典实例
2009-06-14 19:37 1810Java 提供了一套机制来动态执行方法和构造方法,以及数组操作 ... -
Java反射经典实例
2009-06-14 19:14 0Java 提供了一套机制来动态执行方法和构造方法,以及数组操 ... -
疯狂代码 写给WEB2.0的站长(转载我的BT下载实验室)
2008-07-12 10:07 984当互联网吵吵嚷嚷的进 ... -
log4j备用
2008-06-06 18:12 1136下面给出得Log4J配置文件实现了输出到控制台,文件,回滚文件 ... -
Servlet提供服务的方法1-了解servlet
2008-06-06 18:11 1195Servlet 通过下面的方法来提供服务: l ... -
Servlet提供服务的方法2-了解servlet
2008-06-06 18:10 1092HTTP Servlets 使用 HTTP request 对 ... -
JOX是一套用户XML document.和Java beans之间进行数据传递的JAVA类库
2008-06-06 18:09 2362JOX是一套用户XML document.和Java bea ... -
JVM的内存管理机制 java.lang.OutOfMemoryError: PermGen spa
2008-04-24 15:50 2103PermGen space的全称是Permanent Gene ...
相关推荐
### 浅谈Java输入输出流 #### 一、引言 Java作为一种广泛应用的编程语言,在处理数据时提供了非常强大且灵活的输入输出功能。然而,Java的输入输出操作可能看起来较为复杂,因为开发者通常需要处理多种不同的对象...
### Java的输入输出流概述 #### 一、引言 Java 的输入输出(I/O)功能强大且灵活,为开发者提供了处理各种数据源的能力。I/O 操作涉及到的数据源包括但不限于文件、内存、网络连接等。尽管 I/O 操作强大,但其复杂...
"Java 输入/输出流技术步骤说明" Java 中的流可以分为两种:字节流和字符流。字节流是指以字节为单位的流,主要用于处理二进制数据,而字符流是指以字符为单位的流,主要用于处理文本数据。Java 中的流都是从四个...
Java的输入输出流技术是Java编程中不可或缺的一部分,它提供了数据传输和处理的途径,涵盖了文件操作、网络通信、标准输入输出等多种场景。在Java中,流被分为两大类:字节流和字符流。 字节流主要由两个抽象基类...
Java中的输入输出流是编程中不可或缺的一部分,它们用于在程序和外部资源之间传输数据。Java提供了丰富的类库来支持各种类型的输入输出操作,包括文件操作、网络通信、数据压缩等。这里我们将深入探讨Java中的输入...
### 标准输入输出流(System.in/out/err) Java中定义了三个标准的数据流,它们分别是: - **System.in**:这是标准输入流,通常用于从控制台接收用户输入。它是一个`InputStream`对象。 - **System.out**:这是标准...
- **输入输出流**:熟悉文件读写操作,包括文本文件和二进制文件的处理。 - **泛型与注解**:了解泛型和注解的使用方法及其重要性。 #### 二、数据结构与算法 与JavaSE学习同步进行的是对数据结构与算法的学习。这...
总之,Java 中的 Socket 编程是实现客户端-服务器应用程序的关键技术,它基于 TCP/IP 协议,通过输入输出流进行数据交换。虽然相比其他高级的网络通信库,Socket 编程可能较为繁琐,但它提供了更底层的控制,适用于...
- `FileOutputStream`:向文件写入数据的输出流。 - **字符流**: - `FileReader`:以字符形式读取文本文件。 - `FileWriter`:以字符形式向文本文件写入数据。 #### 缓冲流 为了提高数据读写的效率,Java提供...
java IO流是java语言中用于输入输出操作的基本类库,IO流是Java程序中最基本也最重要的一部分,java IO流主要可以分为两大类:字节流和字符流。在java中,四大抽象类是IO流的基础,它们分别是InputStream、...
Java内存流,主要指的是ByteArrayInputStream和ByteArrayOutputStream这两个类,它们分别代表了内存中的输入流和输出流。在Java中,通常我们处理输入和输出时,会涉及到文件操作,但内存流允许我们在内存中进行数据...
### Java之浅谈深说——教你如何成长为Java编程高手 在IT行业中,Java作为一种广泛使用的编程语言,其重要性不言而喻。对于希望成为Java编程高手的学习者来说,掌握正确的学习路径至关重要。本文将根据提供的标题、...
浅谈 Java8 Stream flatMap 流的扁平化操作 Java8 中的 Stream 是一个新概念,它不是输入输出的 Stream 流,而是一种用函数式编程方式在集合类上进行复杂操作的工具。Stream 提供了两种操作:中间操作和终止操作。...