当前位置: 代码迷 >> J2SE >> 关于javaIO流中PrintStream的write()和print()方法的有关问题
  详细解决方案

关于javaIO流中PrintStream的write()和print()方法的有关问题

热度:17   发布时间:2016-04-23 20:40:20.0
关于javaIO流中PrintStream的write()和print()方法的问题
关于下面这段代码:
import java.io.*;
import java.util.*;
import java.util.zip.*;
public class ZIPcompress {
public static void main(String[] args)
{
try
{
FileOutputStream f=new FileOutputStream("test1.zip");
CheckedOutputStream csum=new CheckedOutputStream(f,new Adler32());//维护写入数据校验和的输出流,校验和用于验证数据的完整性
ZipOutputStream out=new ZipOutputStream(new BufferedOutputStream(csum));
out.setComment("a test of java zip");
for(int i=0;i<args.length;i++)
{
System.out.println("writing file:"+args[i]);
BufferedReader in =new BufferedReader(new FileReader(args[i]));
out.putNextEntry(new ZipEntry(args[i]));
int c;
while((c=in.read())!=-1)
out.write(c);
in.close();
}
out.close();
System.out.println("checksum:"+csum.getChecksum().getValue());//输出流文件关闭之后校验和才有效
//现在来提取文件
FileInputStream fi=new FileInputStream("test1.zip");
CheckedInputStream icsum=new CheckedInputStream(fi,new Adler32());
ZipInputStream in2=new ZipInputStream(new BufferedInputStream(icsum));
ZipEntry ze;
System.out.println("checksum:"+icsum.getChecksum().getValue());
while((ze=in2.getNextEntry())!=null)
{
System.out.println("reading file:"+ze);
int c;
while((c=in2.read())!=-1)
System.out.write(c);
}
in2.close();
}catch(Exception e)
{
e.printStackTrace();
}
}
}

此时输出:
writing file:data1.txt
writing file:data2.txt
checksum:2351909358
checksum:1
reading file:data1.txt
today is Friday
tomorrow is Saturday
the day after tomorrow is Sunday!reading file:data2.txt
aaaaaaaaaaaaaa

当我把System.out.write(c)改为System.out.print((char)c)时可以成功输出:
writing file:data1.txt
writing file:data2.txt
checksum:4167911358
checksum:1
reading file:data1.txt
today is Friday
tomorrow is Saturday
the day after tomorrow is Sunday!reading file:data2.txt
aaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbb
大家应该知道我的两个文件的内容了吧,为什么write()方法读不出最后一行,而print()方法可以。
!!!注意到使用write()方法读出时,最下面是一行空白,说明文件是有内容的,(压缩文件中两个文件的内容都是完整的)就是无法显示。不知道各位是否可以给个解释。谢谢!!!
------解决方案--------------------
你只需要在System.out.write(c);后面增加一行System.out.flush();就可以了,因为write方法不会自动flush缓冲区,而是碰到回车才会flush,所以你就看不到最后一行了。

附上PrintStream类的write方法源码,你看看就明白了。

    public void write(int b) {
try {
    synchronized (this) {
ensureOpen();
out.write(b);
if ((b == '\n') && autoFlush)
    out.flush();
    }
}
catch (InterruptedIOException x) {
    Thread.currentThread().interrupt();
}
catch (IOException x) {
    trouble = true;
}
    }
  相关解决方案