java Io流学习(二) 字节流
2017-08-02 11:27
155 查看
一、IO流分类
IO流若按照流的方向可以分为:输出流(内容从程序内存到磁盘文件的过程,即向文件中添加内容)的类:OutputStream,Writer.
输入流(内容从磁盘空间到程序内存的过程,即从文件中读取内容)的类:InputStream,Reader.
按照操作对象也可以分为:
字节流(操作对象是单个字节)的类:InputStream,OutputStream.
字符流(操作对象是单个字符)的类:Reader,Writer.
因此IO流的顶级父类就是InputStream,OutputStream,Reader,Writer,其余的流类都是继承于这4个类,因此只需要了解4个父类的属性方法,基本子类操作就没有多大问题
二、InputStream(字节输入流)
InputStream是java所有的字节输入流的父类,其本质是一个抽象类,因此实例化父类对象的时候一般通过子类对象向上实例化,而对于InputStream的API只需要了解几个常规的即可(下面会举实例展示各个APi的作用)1、read()方法
package com; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class Test5 { public static void main(String[] args) throws Exception { File file=new File("D:"+File.separator+"a.txt");//创建file对象,a.txt中的内容是"zhangsan" // InputStream stream=new InputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象 InputStream stream=new FileInputStream(file); //子类FileInputStream向上转型实例化父类InputStream //read()方法,单字节读取,返回的int就是读取到的字节的int表示方式, byte c[]=new byte[1024]; //创建字节数组,用于存储读取出来的字节 int z=0; int x=0; while((z=stream.read())!=-1){ //进入循环 c[x]=(byte)z; //注意要转成字节然后存放到存放到字节数组中去 x++; } stream.close(); System.out.println(new String(c)+"1"); } }
2、read(byte[])方法
package com; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; public class Test4 { public static void main(String[] args) throws Exception { File file=new File("D:"+File.separator+"a.txt");//创建file对象,a.txt中的内容是"zhangsan" // InputStream stream=new InputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象 InputStream stream=new FileInputStream(file); //子类FileInputStream向上转型实例化父类InputStream //read(byte[])方法,一次读取,返回读取成功的字节个数,同时字节会读入到数组中--较为方便 byte b[]=new byte[1024]; int i=stream.read(b); stream.close(); System.out.println(i); System.out.println(new String(b,0,i)); } }
3、read(byte b[],int off,int len)
package com; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; public class Test6 { public static void main(String[] args) throws Exception { File file=new File("D:"+File.separator+"a.txt");//创建file对象,a.txt中的内容是"zhangsan" // InputStream stream=new InputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象 InputStream stream=new FileInputStream(file); //子类FileInputStream向上转型实例化父类InputStream //read(bytep[] b,int off ,int len)方法,从输出流中读取最多len个字节到数组中,从下表0ff开始添加数据 int len=(int)file.length(); byte[] b=new byte[1024]; int i=0; while((i=stream.read(b, 0, len))!=-1){ //等于是多次调用read()方法,单个字节单个字节的读取,知道len个字节为止 System.out.println(new String(b)); } stream.close(); }
以上3个方法运行的结果都是“zhangsan”,但是追究效率来说,建议使用read(byte[] b )方法较好,一次读入,注意在建立数组的时候的长度,可以根据流的长度来确认,避免占用较多内存
三、OutputStream (字节输出流)
OutputStream是javaio流中所有输出流的父类,因此同上述的输入流一样,只需要了解其常用API即可(重点在write方法)1)write(int b)方法
package com; import java.io.*; public class Test7 { public static void main(String[] args) throws Exception { File file=new File("D:"+File.separator+"c.txt");//创建file对象,注意此时我的D盘是没有c.txt的文件的 //流的操作会自动判断是否有该文件存在,若有,则进行覆盖,若没有则会新建,然后在输出内容 // OutputStream stream=new OutputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象 OutputStream stream=new FileOutputStream(file); //子类FileOutputStream向上转型实例化父类OutputStream //write(int b)方法,注意参数是字节的int型位数,而不是常规int String str="hello"; byte b[]=str.getBytes();//字节输出流,要操作字节,所以把字符转成字节 for (int i = 0; i < b.length; i++) { stream.write(b[i]); } stream.close(); } }
2)write(byte[])方法
package com; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream; public class Test8 { public static void main(String[] args) throws Exception { File file=new File("D:"+File.sep 4000 arator+"c.txt");//创建file对象,注意此时我的D盘是有c.txt的文件的 //流的操作会自动判断是否有该文件存在,若有,则进行覆盖,若没有则会新建,然后在输出内容 // OutputStream stream=new OutputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象 OutputStream stream=new FileOutputStream(file); //子类FileOutputStream向上转型实例化父类OutputStream String str="zhangsan"; byte b[]=str.getBytes();//字节输出流,要操作字节,所以把字符转成字节 stream.write(b); //一次输出整个数组 stream.close(); } }
3)write(byteb [] ,int off,int len )
package com; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream; public class Test9 { public static void main(String[] args) throws Exception { File file=new File("D:"+File.separator+"c.txt");//创建file对象,注意此时我的D盘是有c.txt的文件的 //流的操作会自动判断是否有该文件存在,若有,则进行覆盖,若没有则会新建,然后在输出内容 // OutputStream stream=new OutputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象 OutputStream stream=new FileOutputStream(file); //子类FileOutputStream向上转型实例化父类OutputStream String str="wagnwu"; byte b[]=str.getBytes();//字节输出流,要操作字节,所以把字符转成字节 int len=b.length-1; //少取一个字节 stream.write(b, 0, len);//等于是单个单个字节输出 stream.close(); } }
以上3个write()方法的结果,请自行运行查看,仔细观察会发现,三种方法的情况的话,后两种方法效率会较高(第二种一次性输出所有字节,第三种获取字节只输出想要的部分内容),另注意,输出流操作完毕后记得运行close()方法
相关文章推荐
- Java学习日志(19-3-IO流-字节流操作)
- Java学习之IO流上(字符流: FileReader FileWriter BuffereedReader BufferedWriter 字节流:FileInputStream FileOutputStream BufferedInputStream BufferedOutputS)
- 黑马程序员--Java学习日记之IO流(字符流和字节流)
- (42)Java学习笔记——IO流 / 字节流
- 黑马程序员 java学习笔记 Day5:IO流、字符流、字节流
- 黑马程序员--Java基础学习笔记【IO流-字节流、转换流】
- 黑马程序员 java学习笔记3-IO流之字节流与装饰设计模式
- java基础学习IO流之字节流 十一 -4
- 黑马程序员--Java基础学习之IO流之字节流、字符流、读取写入文件、Copy文件、键盘输入输出、流操作的基本规律
- java学习笔记IO输入与输出——IO流概述及字节流(2)
- java中IO流的学习笔记(1、字节流写入数据)
- Java学习笔记之IO流中的文件字节流
- java基础学习_IO流02_递归、IO流字节流、IO流字符流(自学)_day20总结
- Java IO学习笔记(三):字节流与字符流
- Java IO学习笔记:字节流
- 黑马程序员_IO流-字节流的学习(一)
- Java IO流学习总结
- 黑马程序员_java学习日记_IO流
- 黑马程序员 java学习笔记2-IO流
- 黑马程序员 java学习笔记4-Io流学习后可能会用到的实例