JavaIO流之字节流
字节流
抽象基类:InputStream,OutputStream。
- 字节流可以操作任何数据。
注意:
- 字符流使用的数组是字符数组,char[] chs ;
- 字节流使用的数组是字节数组,byte[] bt ;
FileOutputStream fos=new FileOutputStream(“a.txt”); fos.write("abcde"); //直接将数据写入到了目的地。 fos.close();//只关闭资源。 FileInputSteam fls=new FileInputStream("a.txt"); //fis.available();//获取关联的文件字节数。如果文件体积不大,可以这样操作。 byte[]buf=new byte[fis.available()];//创建一个刚刚好的缓冲区。//但是这有一个弊端,就是文件过大,大小超出Jvm的内容空间时,会内存溢出。 fis.read(buf); System.out.println(new String(buf));
例子:
需求:copy一个图片。
BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("1.jpg")); BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("2.jpg")); int by=0; while(by=bufis.read()!=-1){ bufos.write(by); bufos.newLine(); } bufis.close(); bufos.close();
小结:
目前学习的流对象:
- 字符流: FileReader FileWriter BuffereedReader BufferedWriter
- 字节流:FileInputStream FileOutputStream BufferedInputStream BufferedOutputStream
补充:
1.字节流的read()方法读取的是一个字节。为什么返回的不是byte类型,而是int类型呢?
- 因为read方法读到末尾时返回的是-1,而在所操作的数据中很容易出现连续多个1的情况,而连续读到8个1,就是-1,导致读取会提前停止。所以将读到的一个字节提升为一个int类型的数值,但是只保留原字节,并在剩余二进制位补0。
具体操作是:byte&255 or byte&0xff
- 对于write方法,可以一次写入一个字节,但接收的是一个int类型数值。只写入该int类型的数值的最低一个字节(8位)。
- 简单说:read方法对读到的数据进行提升,write对操作的数据进行转换。