io的一个问题

likaijie 2007-11-15 10:45:45
问个问题:我向一个文件中的内容用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);
这样就能在屏幕上显示出来,不知道为什么,希望哪位大哥给我解答一下!
...全文
130 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingzhu 2007-11-17
  • 打赏
  • 举报
回复
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')。
所以所谓的自动刷新并不是写一个字节它就自动的刷一次
qybao 2007-11-16
  • 打赏
  • 举报
回复
我知道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看看,是不是有数据输出了。
以前还真没这样试过,所以有这样的怀疑。



wenxiang_tune 2007-11-16
  • 打赏
  • 举报
回复
System.out.write(data);
这点的问题``你的代码不规范``
qybao 2007-11-16
  • 打赏
  • 举报
回复
这样在屏幕上输入字符,按回车之后就能在屏幕上输出!唯独用文件输入流,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的。



likaijie 2007-11-16
  • 打赏
  • 举报
回复
谢谢,我怎么这么笨,没想到,api的了解还不够啊,非常感谢!
bingzhu 2007-11-16
  • 打赏
  • 举报
回复
在System.out.write(data);后面加一句System.out.flush();就行了
原因是没有刷新输出流
likaijie 2007-11-16
  • 打赏
  • 举报
回复
楼上的,先谢谢你,这个我先前就试过了,用FileOutputStream在另外一个文件之中输出是可以的,如果用system.in用输入,比如:
int data;
while((data=system.in.read())!=-1)
{
System.out.write(data);
}
这样在屏幕上输入字符,按回车之后就能在屏幕上输出!唯独用文件输入流,printstream输出流,一个一个字节输出就不可以!真的感觉很奇怪,不知道为什么!!
lihaifeng0412 2007-11-15
  • 打赏
  • 举报
回复
关注
ftj237 2007-11-15
  • 打赏
  • 举报
回复
用System.out.println()试一试
http://www.10zhizui.cn

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧