问个问题:我向一个文件中的内容用FileInputStream的read()方法一个字节一个字节读取(比如文件中有111111这几个字符),然后用system.out的write方法将文件中的内容在屏幕上输出:
FileInputStream fis=new FileInputStream("1.txt");
int data;
while((data=fis.read())!=-1)
{
     System.out.write(data);
}
可是这样就是不能在屏幕上显示出来,但是如果我用字节数组存取,
byte[] buf=new byte[100];
int len=fis.read(buf);
System.out.write(buf,0,len);
这样就能在屏幕上显示出来,不知道为什么,希望哪位大哥给我解答一下!

解决方案 »

  1.   

    用System.out.println()试一试
    http://www.10zhizui.cn
      

  2.   

     System.out.write(data); 
    这点的问题``你的代码不规范``
      

  3.   

    我知道System.in和System.out有这个问题,想不到自己生成一个文件流也存在这个问题。System.in和System.in有这个问题,可以解释为系统资源共享的问题,也就是System.in获得控制台资源后,System.out就必须等待,直到System.in释放资源,反过来一样。从操作系统级别来看,System.in和System.out也是一种文件(操作系统都把一切资源当作文件看待来管理的),从System的源代码来看,其实System.in和System.out也是一个FileInpputStream,所以是不是自己生成的文件流也有这样的制约。我这里也只是猜测,LZ可以写段代码测试一下,自己生成的两个文件流分别读写,看看是否也有这样的约束。比如
    FileInputStream   fis=new   FileInputStream( "1.txt "); 
    FileOutputStream fos = new FileOutputStream("2.txt");
    int   data; 
    while((data=fis.read())!=-1) 

              //System.out.write(data); 
        fos.write(data);

    在fos.write(data);设置个断点,在文件读完以前,手动用notepad打开2.txt看看,是不是有数据输出了。
    以前还真没这样试过,所以有这样的怀疑。
      

  4.   

    楼上的,先谢谢你,这个我先前就试过了,用FileOutputStream在另外一个文件之中输出是可以的,如果用system.in用输入,比如:
    int   data; 
    while((data=system.in.read())!=-1) 

              System.out.write(data); 
    }
    这样在屏幕上输入字符,按回车之后就能在屏幕上输出!唯独用文件输入流,printstream输出流,一个一个字节输出就不可以!真的感觉很奇怪,不知道为什么!! 
      

  5.   

    在System.out.write(data);后面加一句System.out.flush();就行了
    原因是没有刷新输出流
      

  6.   

    谢谢,我怎么这么笨,没想到,api的了解还不够啊,非常感谢!
      

  7.   

    这样在屏幕上输入字符,按回车之后就能在屏幕上输出!唯独用文件输入流,printstream输出流,一个一个字节输出就不可以!真的感觉很奇怪,不知道为什么!! 
    ---------------------------
    你也说是按回车后才会输出的,对不对?也就是说你并不能让System.in读入一个字节就让System.out打印一个字节到控制台。这跟你用文件输入流读入的情况相似,不是吗?对于System.in来说,回车就是输入流的结束标志,所以在没有输入回车之前,while((data=system.in.read())!=-1)这个循环一直成立,所以System.in继续占用控制台资源, System.out.write(data);就会一直把数据保存在输出流缓存中,但输入回车后,while((data=system.in.read())!=-1)循环条件不满足,循环结束,System.in不再继续read,即释放了控制台资源,所以System.out.write(data);才把输出流缓存中的信息打印到控制台。也就是System.out.write(data);是在循环退出后才打印到控制台的,在循环中只是把信息保留在输出流缓存中,因为控制台资源没有被释放。同样的,对于文件流来说,遇到文件结束符,read才会结束,跟System.in遇到回车符一个道理。但是为什么文件流会跟System.out排斥,这点我也不明白,因为System.out用到的是控制台资源,文件流用到的是文件资源,应该没有什么冲突,但是事实上确实冲突了,也就是LZ你说的情况确实发生了,所以我才怀疑是不是对文件流的操作都会这样。或者你可以试试用管道流把文件输入流和System.out连接,或者把System.out重新导向到某个文件。to bingzhu 
    对于
    int       data;   
    while((data=system.in.read())!=-1)   
    {   
                        System.out.write(data);   

    这样的代码,就算你加入System.out.flush();也做不到读入一个字节输入一个字节的,结果也是全读入全输出。对于输出流,本身就可以设置自动flush的,而System.out应该就是设置了自动flush的。
      

  8.   

    import java.io.FileInputStream;public class Main {
    public static void main(String[] args) throws Exception {
    FileInputStream fis = new FileInputStream("1.txt");
    int data = 0;
    while( (data=fis.read()) != -1 ) {
    System.out.write(data);
    System.out.flush();
    }
    }
    }
    像这样写一下刷一下 那不就读一个字节输出一个字节了另外JavaDoc中对PrintStream的自动刷新是这么说的:为了自动刷新,可以创建一个 PrintStream;这意味着可在写入 byte 数组之后自动调用 flush 方法,可调用其中一个 println 方法,或写入一个换行符或字节 ('\n')。
    所以所谓的自动刷新并不是写一个字节它就自动的刷一次