黑马程序员-io

来源:互联网 发布:星际迷航新三部曲 知乎 编辑:程序博客网 时间:2024/06/04 19:47

----------- androidjava、期待与您交流! ------------


一. 输入流 InputStream



      InputStream是一个抽象类,在流中必须按顺序读去数据,而在包


装类中可跳跃读去数据流。
      方法:skip(long n) 跳过n个字节数,适用于包装流.
                available() 返回当前数据流中可读取的字节数。
                mark(int readlimit) 适用于包装类,从建立标记位置


开始最多可读取多少字节.
                reset() 与mark配合使用. 适用于包装流
                markSupported() 判断当前流对象是否支持mark和


reset.
                close() 流操作结束后关闭.
                mark(),skip(),reset()不适合接点流.
      问题:有了垃圾回收器,为什么还要调用close()方法尼?
               垃圾回收器只管java程序中类事例对象,不会管系统所


产生的资源,程序需要自己碉用流对象的close()方法,


               通知系统释放对象所表示的流资源.
二. 输出流:向其中连续写入字节的对象.
     OnputStream是一个抽象类
     该类的方法:write(int b) 将整数b写入输出流。
                          write(byte[] b) 将数组中的字节数据流写


入输出流
                          write(byte[] b,int off,int len) 将数组


中off元素到len个元素写入输出流
                          flush() 清空缓冲区,并输出到io设备
                          close() 段开输出流,强制输出到io设备.
三. 文件输入/输出流FileInputStream和FileOutputStream
      FileInputStream和FileOutputStream类是分别来创建磁盘文件的


输入流和输出流对象,


     通过构造函数来指定文件路径和文件名.
     FileInputStream对象将文件内容读入(字节形式)并显示.
     FileOutputStream对象将串内容以字节形式写到文件中.
     Reader和Writer类 用于读写文本数据
     FileWriter对象将串内容以字符形式写到文件中
     FileReader对象将文件内容读入(以字符形式)并显示

     PipedInputStream类和PipedOutputStream类  实现管道通信


                                                             inputStream


                                                       outputStream



         数据操作流:


         在IO包中,提供了两个与平台无关的数据操作流:
       数据输出流(DataOutputStream)
       数据输入流(DataInputStream)
         通常数据输出流会按照一定的格式将数据输出,在通过数据输入流按照一定的格式将数据读入。
         缓存流:
         缓存流为IO流增加了内存缓存区,增加缓存区有两个基本目的
       允许Java程序一次不止操作一个字节,这样提高了程序的性能。
       由于有了缓存区,似的再留上执行Skip、mark和reset方法都成为可能。
         BufferdInputStream和BufferdOutputStream是java提供的两个缓存区包装类,不管底层系统是否使用了缓存区,这两个类在自己的实力对象中创建缓存区。
         BufferdReader和BufferdWriterl类:BufferdReader的readLine方法可以一次读取一行文本,Bufferdwriter的newLine方法可以向字符流中写入不同操作系统下的换行符。

         数据操作流:


         在IO包中,提供了两个与平台无关的数据操作流:
       数据输出流(DataOutoutStream)
       数据输入流(DataInputStream)
         通常数据输出流会按照一定的格式将数据输出,在通过数据输入流按照一定的格式将数据读入。
         缓存流:
         缓存流为IO流增加了内存缓存区,增加缓存区有两个基本目的
       允许Java程序一次不止操作一个字节,这样提高了程序的性能。
       由于有了缓存区,似的再留上执行Skip、mark和reset方法都成为可能。
         BufferdInputStream和BufferdOutputStream是java提供的两个缓存区包装类,不管底层系统是否使用了缓存区,这两个类在自己的实力对象中创建缓存区。
         BufferdReader和BufferdWriterl类:BufferdReader的readLine方法可以一次读取一行文本,Bufferdwriter的newLine方法可以向字符流中写入不同操作系统下的换行符。

import java.io.*;class BufferedReaderDemo {/*字符读取流缓冲区;该缓冲区提供了一个一次读一行的方法readLine,方便于对文本数据的获取当返回null时,表示读到文件末尾*/public static void main(String[] args) throws IOException{//创建一个字符流FileReader fr = new FileReader("buf.txt");//为了提高效率,加入缓冲区技术。将字符读取流对象做为参数传递给换成对象的构造函数。BufferedReader bufr = new BufferedReader(fr);//String s1 = bufr.readLine();//System.out.println("s1="+s1);String line = null;while((line=bufr.readLine())!=null){System.out.println(line);}bufr.close();}}

import java.io.*;class BufferedWriterDemo{public static void main(String[] args) throws IOException{//创建一个字符写入流对象FileWriter fw = new FileWriter("buf.txt");//为了提高字符写入流。加入了缓冲技术//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造器就可以了。BufferedWriter bufw = new BufferedWriter(fw);//bufw.write("1234567");for(int x=1;x<5;x++){bufw.write("abcd"+x);bufw.newLine();bufw.flush();}//刷新方法。bufw.flush();bufw.close();}}

复制文件

import java.io.*;class CopyTestByBuf{public static void main(String args[]){BufferedReader bufr = null;BufferedWriter bufw = null;try{bufr = new BufferedReader(new FileReader("BufferedReaderDemo.java"));bufw = new BufferedWriter(new FileWriter("Copy.txt"));String line = null;while((line=bufr.readLine())!=null){bufw.write(line);bufw.newLine();bufw.flush();}}catch (IOException e){throw new RuntimeException("读写失败");}finally{try{if(bufr != null){bufr.close();}}catch (IOException e){throw new RuntimeException("读取关闭失败");}try{if(bufw != null){bufw.close();}}catch (IOException e){throw new RuntimeException("写入关闭失败");}}}}

ByteArrayInputStream与ByteArrayOutputStream类  

它们分别是InputStream与OutputStream的子类,属于字节流类。用于以IO流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映像文件的功能
ByteArrayInputStream有两个构造函数,每个构造函数都需要一个字节数组来作为数据源:
 
 
   (1)ByteArrayInputStream(byte[] buf) 
   (2)ByteArrayInputStream(byte[] bbuf, int offset, int len);
第二个构造函数指定仅使用数组buf中的从offset开始的length个元素作为数据源.
 
ByteArrayOutputStream也有两个构造函数;
(1)ByteArrayOutputStream() 
   (2)ByteArrayOutputStream(int len);
第一种形式的构造函数创建一个32字节的缓冲区,第二个形式则是根据参数指定的大小创建缓冲区,缓冲区的大小在数据过多时能够自动增长。
import java.io.ByteArrayInputStream;  import java.io.ByteArrayOutputStream;  import java.io.IOException;  import java.io.InputStream;  import java.io.OutputStream;   public class ByteArrayTest {      public static void main(String[] args) {         String tmp = "abcdefghigklmnopqrstuvwxyz";         byte[] src = tmp.getBytes();         ByteArrayInputStream in = new ByteArrayInputStream(src);  //src为转换前的内存块       ByteArrayOutputStream out = new ByteArrayOutputStream();         transform(in, out);         byte[] result = out.toByteArray();   //result为转换后的内存块       System.out.println(new String(result));                   transform(System.in, System.out);       }      public static void transform(InputStream in, OutputStream out){          try {              int ch = 0;              while((ch = in.read()) != -1){              int upperCh = Character.toUpperCase((char)ch);              out.write(upperCh);              }          } catch (IOException e) {              e.printStackTrace();          }      }  } 



----------- androidjava、期待与您交流! ------------


0 0