Java基础学习之InputStream的read()方法陷阱
2016-08-25 15:17
411 查看
一、问题描述
今天闲来无事,写了一个下载网上文件的小工具,但当把网上的mp3文件和mp4文件下载下来之后发现打不开,这就郁闷啦!既然能把文件下载下来就证明 URLConnection是没有问题的。查看文件属性也是可以看到文件大小的,这证明数据是有的。很显然是文件读取或写入的时候出现了问题。于是我做了一个测试:
import java.io.*;
public class FileOutputStreamTest{
public static void main(String[] args) throws IOException{
try{
FileInputStream fis = new FileInputStream("Test.txt");
byte[] bbuf = new byte[5];
int hasRead=0;
FileOutputStream fos = new FileOutputStream("result.txt");
while ((fis.read(bbuf)) != -1){
fos.write(bbuf);
}
}
catch(IOException e){
e.printStackTrace();
}
}
}
测试文件Test.txt数据为: abcdef
运行结果result.txt数据为:abcdefbcde
显然这不是我想要的结果,问题出现的原因是read(byte[])读取一次数据之后,下次在读取不会清除上次读取的内容,而只是进行简单的替换。由于最后一次读取时读到的根本不够5个字节,只读取了1个字节,所以第二次读取时bbuf中的数据为fbcde。
二、问题解决
想写入正确的数据只需要进行一点修改即可,话不多说,直接上代码:import java.io.*; public class FileOutputStreamTest{ public static void main(String[] args) throws IOException{ try{ FileInputStream fis = new FileInputStream("Test.txt"); byte[] bbuf = new byte[5]; int hasRead=0; FileOutputStream fos = new FileOutputStream("result.txt"); while ((hasRead = fis.read(bbuf)) != -1){ fos.write(bbuf,0,hasRead); } } catch(IOException e){ e.printStackTrace(); } } }
通过记录每次读取了多少个字节,然后就写入多少个字节,这样一定不会错。
转载请注明出处:http://blog.csdn.net/qq_32451699/article/details/52314824
相关文章推荐
- Java学习之InputStream中read()与read(byte[] b)
- Java基础第十七天学习日记_Collections和Arrays的常用方法、高级for循环、可变参数、静态导入
- 基于java的InputStream.read(byte[] b,int off,int len)算法学习
- Java基础学习笔记 -- 11(方法、重载、递归)
- 黑马程序员------Java基础学习------方法和数组
- Java基础学习之(二)—对象与类的方法参数
- java基础--Java 字节读取流的read方法返回int的原因
- java基础学习总结——equals方法
- Java基础_方法&Constructor的重载——学习笔记
- Java学习之InputStream中read()与read(byte[] b)
- 【Java学习笔记】基础知识学习19【一个大文件的复制方法】
- JAVA基础学习笔记:有趣的静态方法
- JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)
- Java学习之InputStream中read()与read(byte[] b)
- Java InputStream中read(byte[] b)方法小发现
- 【Java学习笔记】基础知识学习6【类的基础、方法,对象基础、包】
- 【Java学习笔记】基础知识学习18【一个小文件的复制方法】
- 基于java的InputStream.read(byte[] b,int off,int len)算法学习!
- 【java编程】IO类之复写BufferedInputStream中read方法