黑马程序员技术交流社区
标题:
请教关于I0流的几个疑问
[打印本页]
作者:
黄嵘才
时间:
2012-12-16 14:16
标题:
请教关于I0流的几个疑问
在使用IO流做文件的复制时有点疑问
1.我发现我用以下之个方法运复制的时候并不能完全复制。是不是我的逻辑有问题?
2.有没有可能在没有读到文件末尾也可以返回结束符-1(如注释)
【代码】
private static void copy_3() throws IOException {
/*
* 3.使用库的包装流,
*/
//包装输入流
FileInputStream fis = new FileInputStream("爱不释手.mp3");
BufferedInputStream bis = new BufferedInputStream(fis);
//包装输出流
FileOutputStream fos = new FileOutputStream("爱不释手_3.mp3");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//直接使用包装流的输入输出
while(bis.read() != -1){//问题,即使还没有到整个文件的尾,也有可以返回-1?
bos.write(bis.read());
System.out.println(bis.read());
}
}
作者:
翁鹏
时间:
2012-12-16 15:17
while(bis.read() != -1){//问题,即使还没有到整个文件的尾,也有可以返回-1?
bos.write(bis.read());
System.out.println(bis.read());
以上逻辑出现了问题
,你对read()方法的理解错误,请再看看毕老师的视频, 详细查阅一下API的read方法。
正确的一种写法应该是:
int num = 0;
while((num = bis.read()) != -1) //这才是读一个,写一个
{
bos.write(num);
}
作者:
焦健
时间:
2012-12-16 17:07
import java.io.*;
class IO10
{
public static void main(String[] args)throws IOException
{
copy_3();
}
private static void copy_3() throws IOException
{
/*
* 3.使用库的包装流,
*/
//包装输入流
FileInputStream fis = new FileInputStream("D://1.mp3");
BufferedInputStream bis = new BufferedInputStream(fis);
//包装输出流
FileOutputStream fos = new FileOutputStream("D://3.mp3");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//直接使用包装流的输入输出
for(int ch =0;(ch=bis.read()) !=-1;){
bos.write(ch);
}
fos.close();
fis.close();
}
}
/* while(bis.read() != -1){
bos.write(bis.read());
System.out.println(bis.read());
}
你的这个代码问题出在while循环这里,
这里会执行一次read()方法,判断条件,
然后在用wirte写入的时候传入的又是一个read方法。
最后打印时又调用一次read方法,这3次调用等于读取了3次。
read方法不会重复读取,会依次向下读取。
所以,用于判断的那个read方法读取出来的内容没有写入到流中。
System.out.println(bis.read());读取的内容直接打印出来,也没有写入流中。
只有传入write方法的read读取出来的内容才能写入进去。
所以你这么复制只能复制1/3进去,而且是有间隔的数据,无法使用。
上面是我给修改过的代码,
*/
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2