免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1225 | 回复: 0
打印 上一主题 下一主题

Java Stream学习摘记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-28 14:13 |只看该作者 |倒序浏览
Java中,我们称可以从其中读入字节序列的对象为输入流(input stream);而将由字节序列写入的对象称为输出流(output stream)。两个重要的抽象类:InputStream和OutputStream。为了处理Unicode编码的字符,引入另两个抽象类:Reader和Writer,它们分别用于读、写基于双字节的字符。
InputStream有一个抽象方法
abstract int read()
用于读入一个字节,并返回读入的字节;如果到达输入流尾将返回-1。
同样的,OutputStream也定义了一个抽象方法
abstract void write(int b)
用于向输出位置写入一个字节。
注意:当有线程调用这两个方法时,可能由于网络连接等原因而造成阻塞,该线程将被挂起。
在读入字节时,调用available()可以得到当前流可得到的字节数,如
int byteAvailable = System.in.available();
完成读写流操作时,要调用close()释放系统资源。对于输出流,close()清空用于输出的缓冲(buffer用于输出时字符的暂存,多个字符组成一个包一同发送);特别地如果未关闭一个文件,将有可能丢失最后一个字节包。同样的,可以也手动的调用flush()来清空缓存。
其他重要方法(使用参考文档)
int read(byte[] b);
int read(byte[] b,int off,int len);
long skip(long n);
void mark(int readlimit);
void reset();
boolean markSupported();
void write(byte[] b);
void write(byte[] b,int off,int len);
InputStream,OutputStream,Reader和Writer是Java Stream zoo的四个基础类,它们不能实例化,但可以是某些方法的返回值。它们派生出了超过60种不同类型的流。Java将不同的单一功能分派到不同类型的流实现,要实现某个复合功能时将两个或多个流联合起来,称之为过滤流。比如,实现从某个文件读取数字,
FileInputStream fin = new FileInputStream("file.dat");
DataInputStream din = new DataInputStream(fin);
double s = din.readDouble();
注意:上面代码创建的流并没有相应的磁盘文件,它仍然需要从输入流相关文件访问数据,关键在于现在多了一个可用的接口(interface)。
总之,u must be prepared to continue ayering system constructors until u hava access to the functionality u want.
关于java.io.FileOutputStream构造方法的一个注意点:
FileOutputStream(String name),参数路径名要么是绝对路径,要么是与当前目录相关的路径。该方法将自动删除同名的其他文件。相似的还有FileOutputStream(File f);
但FileOutputStream(String name,boolean append),若append参数为true,数据将追加在该文件末,同名的已存在不会被删除。
利用DataOutput接口的下列方法可以实现写数字,字符,布尔值或字符串
writeChars(),writeByte(),writeInt(),writeShort(),writeLong(),writeFloat(),writeDouble(),writeChar(),writeBoolean(),writeUTF()
比如调用writeInt()将一次写入4个字节,而不管实际数字,所以输出对我们来说经常是不可读的。writeUTF()使用UTF(Unicode Text Format)写字符串数据(具体参见CoreJava Page630)。同样的有DatInput接口,具体方法参见文档。
随机访问文件流(Random-Access File Streams)
利用RandomAccessFile类可以查找和写数据到文件任意位置。它实现DataInput和DataOutput两个接口。对文件的操作,只读或读写,如
RandomAccessFile in = new RandomAccessFile("file.dat","r");
RandomAccessFile inOut = new RandomAccessFile("file.dat","rw");
随机访问文件有一个文件指针,它通常指向读或写的下一条纪录的位置。seek(long n)用于将文件指针设置在文件任意字节位置。
getFilePointer()返回文件指针的当前位置。
利用InputStreamReader和OutputStreamWriter实现Unicode字符和其他字符的转化。如
InputStreamReader in = new InputStreamReader(System.in);
在Windows下通用的编码方式是ISO 8859-1(ISO Latin-1),也即ANSI code。本机编码对于不能表示的Unicode码以?表示。更多编码方式参见Page634-638.
利用PrintWriter可以实现文本输出,但使用时必须连接目的(destination)。
PrintWriter out = new PrintWriter(new FileWriter("file.dat"),boolean mode);
或PrintWriter out = new PrintWriter(new FileOutputStream("file.dat"),boolean mode);
参数mode设置是否自动清空。
相应的用BufferedReader可以实现文本的输入,将buffered reader连接到一个输入源
BufferedReader in = new BufferedReader(new FileReader("file.dat"));
FileReader能够将字节转化成Unicode码。
readLine()读入一行文本内容。
对于其他的输入源,需要使用InputStreamReader。InputStreamReader不会自动将字节转化为Unicode码
BufferedReader in2 = new BufferedReader(new InputStreamReader(System.in));
BufferedReader in3 = new BufferedReader(new InputStreamReader(url.openStream()));
读取数
String s = in.readLine();
double x = Double.parseDouble(s);
如果是单行一个数,这样很容易就实现了;如果单行有多个数,则需要StringTokenizer。
ZIP文件流
每个ZIP文件的文件头包含文件名和使用的压缩算法。使用ZipInputStream读入ZIP文件
ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname));
ZipEntry entry;
while ((entry = zip.getNextEntry()) != null)
{
    analyze entry;
    ...
    zin.closeEntry();
}
zin.close();
读取ZIP entry的内容,如读取一个ZIP的文本文件
BufferedReader in =new BufferedReader(new InputStreamReader(zin));
String s;
while((s = in.readLine()) != null)
    do sth. with s;
写ZIP文件
FileOutputStream fout = new FileOutputStream("test.zip");
ZipOutputStream zout = new ZipOutputStream(fout);
for all files
{
    ZipEntry ze = new ZipEntry(file name);
    zout.putNextEntry(ze);
    send data to zout;
    zout.closeEntry();
}
zout.close();
更多方法参见文档。JAR文件使用JarInputStream和JarOutputStream处理。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/14786/showart_79341.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP