问个问题:我向一个文件中的内容用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);
这样就能在屏幕上显示出来,不知道为什么,希望哪位大哥给我解答一下!
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);
这样就能在屏幕上显示出来,不知道为什么,希望哪位大哥给我解答一下!
http://www.10zhizui.cn
这点的问题``你的代码不规范``
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看看,是不是有数据输出了。
以前还真没这样试过,所以有这样的怀疑。
int data;
while((data=system.in.read())!=-1)
{
System.out.write(data);
}
这样在屏幕上输入字符,按回车之后就能在屏幕上输出!唯独用文件输入流,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的。
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')。
所以所谓的自动刷新并不是写一个字节它就自动的刷一次