第三十四天
今天了解到了不同的流,学到了字节流、字符流、过滤流和内存操作流的一些方法明天学习缓冲流和Scanner类
流在Java中是比较重要的概念,
1、流分为两种:
①输入流:从流当中不停的吧字节去除
②输出流:把准备好的字节串传给它
2、java.io包中的stream类根据其操作对象分为两大类 字符流和字节流
①字节流:InputStream是所有字节输入的父类,而OutputStream是所有字节输出流的父类。所有字符流都以Stream结尾。
②字符流:Reader是所有读取字符串输入流的父类,Write是所有输出字符串的父类。所有字符流都以Reader/Write结尾。
3、
(1)字节流
①输出字节流OutputStream
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class FileoutStreamDemo { public static void main(String[] args)throws IOException{ out(); } public static void out()throws IOException{ //第一步获得对象 OutputStream out =new FileOutputStream("D:/Hello.txt"); //输出的内容 String info="Hello Java!!"; //将内容转换成字节数组 byte[] buf =info.getBytes(); //写到文件里 out.write(buf); //关闭 out.close(); } }
使用FileOutputStream的另一个构造方法。如果这时再将程序运行一遍,文件里的内容会被覆盖。
追加内容:true
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class FileoutStreamDemo { public static void main(String[] args)throws IOException{ out(); } public static void out()throws IOException{ //第一步获得对象 OutputStream out =new FileOutputStream("D:/Hello.txt",true); //输出的内容 String info="Hello PHP!!"; //将内容转换成字节数组 byte[] buf =info.getBytes(); //写到文件里 out.write(buf); //关闭 out.close(); } }
现在还是存在一个问题,如果在关闭程序以前出现异常,文件就不能关闭,所以应该将关闭放在finally里,不管程序有无异常,都应该关闭流。
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class FileoutStreamDemo { public static void main(String[] args) throws IOException{ out(); } public static void out() { //第一步获得对象 OutputStream out=null; try { out=new FileOutputStream("D:/Hello.txt",true); //输出内容 String info="Hello AD"; //将内容转换成字节数组 byte[] buf=info.getBytes(); //写到文件里 out.write(buf); }catch(IOException e) { e.printStackTrace(); }finally { try { if(out!=null) out.close(); }catch(IOException e) { e.printStackTrace(); } } } }
②输入字节流InputStream
ByteArrayInputStream、StringBufferInputStream、FilelnputStream是三种基本的介质
从Byte数组 StringBuffer 本地文件 中读取数据
import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamDemo { public static void main(String[] args) throws IOException{ in(); } public static void in() { //新建一个对象 FileInputStream in=null; try { in=new FileInputStream("D:/Hello.txt"); //开辟一个空间 byte[] buf=new byte[1024]; int len=-1; while((len=in.read(buf))!=-1) { String s=new String(buf,0,len); System.out.println(s); } }catch(IOException e){ e.printStackTrace(); }finally { try { if(in!=null) in.close(); }catch(IOException e) { e.printStackTrace(); } } } }
(2)字符流
Reader与Writer和其子类都是处理字符流的相关类。字符流可以对数据以一个字符的长度为单位来处理,并进行适当的字符编码转换处理,一般字符流都用来操作纯文本文件。
①字符输出流
Writer是字符输出流,该类是一个抽象类,所以需要使用子类FileWrite类来操作文件。
import java.io.FileWriter; import java.io.IOException; public class WriterDemo { public static void main(String[] args) throws IOException{ write(); } public static void write() throws IOException{ //获取对象 FileWriter fw=new FileWriter("D:/Hello.txt"); //直接输出 fw.write("Hello c+"); //关闭 fw.close(); } }
每次追加内容,上文不被覆盖需要FileWrite新的构造函数
加:true
import java.io.FileWriter; import java.io.IOException; public class WriterDemo { public static void main(String[] args) throws IOException{ write(); } public static void write() throws IOException{ //获取对象 FileWriter fw=new FileWriter("D:/Hello.txt",true); //直接输出 fw.write("Hello c+"); //关闭 fw.close(); } }
②字符输入流
Reader是一个字符输入流,但他是一个抽象类,所以要用FileReader来实例化
import java.io.Reader; import java.io.IOException; import java.io.FileReader; public class ReaderDemo { public static void main(String[] args)throws IOException{ reader(); } public static void reader() throws IOException{ Reader r=new FileReader("D:/Hello.txt"); char[] buf=new char[1024]; int len=0; while((len=r.read(buf))!=-1) { String s=new String(); System.out.println(s); } r.close(); } }
4、字节流与字符流的区别
字节流与字符流的区别主要体现在以下两点。
①读写单位不同:字节流以字节( 8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
②处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
结论:只要是处理纯文本数据,就优先考虑使用字符流,此外,都使用字节流。