一、内存操作流(ByteArrayInputStream、ByteArrayOutputStream)
(一)、 public class ByteArrayInputStream extends InputStream;
ByteArrayInputSteam:该类是InputStream的子类,它从内存中的字节数组中读取数据,因此它的数据源是一个字节数组。这个类的构造方法包括:
ByteArrayInputStream(byte[] buf)--------参数buf指定字节数组类型的数据源。
ByteArrayInputStream(byte[] buf, int offset, int lenght)-----参数buf指定字节数组类型数据源,参数offset指定从数组中开始读取数据的起始下标位置,lenght指定从数组中读取的字节数。
ByteArrayInputStream类本身采用了适配器设计模式,它把字节数组类型转换为输入流类型,使得程序能够对字节数组进行读操作。
public static void byteArrTest() throws IOException{ ByteArrayInputStream bis=new ByteArrayInputStream("abcd".getBytes()); int len=0; while((len=bis.read())!=-1){ System.out.println((char)len+"<=>"+len); } bis.close(); }
(二)、public class ByteArrayOutputStream extends OutputStream。
ByteArrayOutputStream:此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()
和 toString()
获取数据。关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
1、public byte[] toByteArray()创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中
public static void byteArrOut() throws IOException{ ByteArrayOutputStream bos=new ByteArrayOutputStream(); bos.write(97); bos.write(new byte[]{98,99,100}); //public byte[] toByteArray()创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。 byte [] bys=bos.toByteArray(); for(byte b:bys){ System.out.println(b+"<==>"+(char)b); } }
2、public String toString()使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串。新 String 的长度是字符集的函数,因此可能不等于缓冲区的大小。
public static void byteArrOut2() throws IOException{ ByteArrayOutputStream bos=new ByteArrayOutputStream(); bos.write(97); bos.write(new byte[]{98,99,100}); //public String toString()使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串。新 String 的长度是字符集的函数,因此可能不等于缓冲区的大小。 String str=bos.toString(); System.out.println(str);//abcd }
(三)、ByteArrayInputStream、ByteArrayOutputStream一起使用
public static void byteArrOut() throws IOException{ ByteArrayOutputStream bos=new ByteArrayOutputStream(); bos.write(97); bos.write(new byte[]{98,99,100}); byte [] bys=bos.toByteArray(); ByteArrayInputStream bis=new ByteArrayInputStream(bys); int len=0; while((len=bis.read())!=-1){ System.out.print((char)len);//abcd } }
二、打印流(PrintStream,PrintWriter)
PrintStream是FilterOutputStream的子类。
PrintWriter 是 Writer的子类。
打印流的特点:
* A:只有写数据的,没有读取数据。只能操作目的地,不能操作数据源。打印流只有字节打印流PrintStream 与字符打印流PrintWriter
* B:可以操作任意类型的数据。他们的print()系列方法与println()系列方法可以操作任意类型数据。
* C:如果启动了自动刷新,能够自动刷新。但必须调用println()方法
PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
PrintStream ps=new PrintStream(new FileOutputStream("a.txt"),true);
* D:该流是可以直接操作文本文件的。
public PrintStream(File file) throws FileNotFoundException。
public PrintWriter(File file) throws FileNotFoundException。
1、使用PrintStream实现文件的copy
public static void streamCopy() throws IOException{ BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt")); //public PrintStream(OutputStream out,boolean autoFlush)使用该够造函数 开启自动刷新功能 PrintStream ps=new PrintStream(new FileOutputStream("Copy.java"),true); byte [] bys=new byte[1024]; int line =0; while((line=bis.read(bys))!=-1){ ps.println(new String(bys,0,line)); } ps.close(); bis.close(); }
2、使用 PrintWriter实现文件的copy
public static void copy() throws IOException{ BufferedReader br = new BufferedReader(new FileReader("a.txt")); // 封装目的地 //public PrintWriter(OutputStream out,boolean autoFlush);使用该够造函数 开启自动刷新功能 PrintWriter pw =new PrintWriter(new FileWriter("Copy.java"), true); String line = null; while((line=br.readLine())!=null){ pw.println(line); } pw.close(); br.close(); }
三、标准输入输出流(public final class System)
System类中的三个成员变量
//“标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。 public final static InputStream in = null; //“标准”输出流。此流已打开并准备接受输出数据。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。 public final static PrintStream out = null; //“标准”错误输出流。此流已打开并准备接受输出数据。 通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标 public final static PrintStream err = null;
由System.out变量我们可以:
// 有这里的讲解我们就知道了,这个输出语句其本质是IO流操作,把数据输出到控制台。 System.out.println("helloworld"); // 获取标准输出流对象 PrintStream ps = System.out; ps.println("helloworld");