Xiaobo Sun

Eclipse-Unix http://umlfact.berlios.de/~s_xsun/

Java Stream

stream应该是水龙头里的水资源,
InputStream:是一个出水龙头(把水封装在里头)的一个实物对象,该对象的read方法呢,就想成这
个"出水龙头"这一机制对象的开关钮,你read或openStream(其他对象包容InputStream对象的对象方法)
一下呢,就等于打开了出水龙头的按钮,水就出来了,里头封装的水是什么性质的呢,
你就用相应的容器来装,如string或byte[].....
OutputStream:你就在InputStream基础上反着想就ok了
=====================================================================================
当然,我们可以在Inputstream和OutputStream数据源的基础上,从实际需要触发,
      来重新封装出不同性能机制的输入、输出流了,java.io包中提供了很丰富的输入、输出流对象,如:
     基于字节流的stream:
      DataOutputStream----DataInputStream:
         FileOutputStream-----FileInputStream:
File->inputstream->...
...->outputstream->File

        .............等,可以用InputStream和OutputStream从JDK文档查阅
     基于字符流的stream(典型的以write 和reader来标识的):
      FileWriter---FileReader:
         StringWriter---StringReader:
          .........等,你自己可以用Writer和Reader从JDK文档里头查看说明
======================================================================================

InputStreamReader r = new InputStreamReader(System. in ); // InputStream from console
BufferedReader in = new BufferedReader ( r );
String line ;
while (( line = in . readLine ()) != null) {
  System. out . println ( "> "+line );
}

FileReader r = new FileReader ( args [0]); // InputStream from file
BufferedReader in = new BufferedReader ( r );
String line ;
while (( line = in . readLine ()) != null) {
  System. out . println ( "> "+line );
}

FileWriter w = new FileWriter ( args [0]); //OutputStream to file
BufferedWriter bw = new BufferedWriter (w);
PrintWriter out = new PrintWriter (bw);
out . println ( "dies" );
out . println ( " ... ist ein Log!" );
out . println ( "Ciao!" );
out . close (); // schliessen nicht vergessen !
===================================================================
FileInputStream是InputStream的子类,由名称上就可以知道, FileInputStream主要就是从指定的File中读取资料至目的地。

FileOutputStream是OutputStream的子类,顾名思义,FileOutputStream主要就是从来源地写入资料至指定的File中。

标准输入输出串流物件在程式一开始就会开启,但只有当您建立一个FileInputStream或FileOutputStream的实例时,实际的串流才会开启,而不使用串流时,也必须自行关闭串流,以释放与串流相依的系统资源。

下面这个程式可以复制档案,程式先从来源档案读取资料至一个位元缓冲区中,然后再将位元阵列的资料写入目的档案:

  • FileStreamDemo.java
package onlyfun.caterpillar;

import java.io.*;

public class FileStreamDemo {
public static void main(String[] args) {
try {
byte[] buffer = new byte[1024];

FileInputStream fileInputStream =
new FileInputStream(new File(args[0]));
FileOutputStream fileOutputStream =
new FileOutputStream(new File(args[1]));

System.out.println("复制档案:" +
fileInputStream.available() + "位元组");
while(true) { // 从来源档案读取资料至缓冲区
if(fileInputStream.available() < 1024) {
int remain;
while((remain = fileInputStream.read())
!= -1) {
fileOutputStream.write(remain);
}
break;
}
else {
fileInputStream.read(buffer);
// 将阵列资料写入目的档案
fileOutputStream.write(buffer);
}
}

// 关闭串流
fileInputStream.close();
fileOutputStream.close();

System.out.println("复制完成");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println(
"using: java FileStreamDemo src des");
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
}
}

这个程式示范了两个 read() 方法,一个可以读入指定长度的资料至阵列,一个一次可以读入一个位元组,每次读取之后,读取的指标都会往前进,您使用available()方法获得还有多少位元组可以读取;除了使用File来建立FileInputStream、FileOutputStream的实例之外,您也可以直接使用字串指定路径来建立。

不使用串流时,记得使用close()方法自行关闭串流,以释放与串流相依的系统资源。

posted on 2008-05-19 15:21 Xiaobo Sun 阅读(953) 评论(1)  编辑  收藏 所属分类: Java

评论

# re: Java Stream 2008-12-16 09:52 Xiaobo Sun

public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(System.in));
String s;
while (bufferedReader.read() != -1) {
System.out.println("input something:");
s = bufferedReader.readLine();
System.out.println("input is: " + s);
}
}
======================================
java io 有两种类型的读写方法。

一种是以字节为单位读写的,InputStream、OutputStream(interface) 下面有很多类像FileInputStream、PipedInputStream 等皆继承了上述接口。

另外一种就是你上面提到的以unicode为单位进行读写的方法。 表现为 Reader、Writer、接口,像BufferedReader 就继承了Reader接口。

BufferedReader ****===> 在读取的时候,会先开辟一个缓冲区,把这些数据读到缓冲区,等到满了以后,就直接拿出来。

至于InputStreamReader,****===> An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and translates them into characters according to a specified character encoding.通过这个类可以把这两种方式读取出来的信息相互切换。

system.in ****===> 这是控制台输入信息时读入的管道。她继承PrintStream ,而PrintStream 类 继承了FilterOutputStream 类。这个类实现了OutputStream 接口。   回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜