自学内容网 自学内容网

java 实训第13天 IO流

Java IO流

一、说明
    I: Input    输入
    O:    Output    输出
    
    输入和输出的方向:
        输入(Input): 从其他的资源读取数据到java程序。
        输出(Output):从java程序写出数据到其他资源载体。
        
二、Java中的IO操作分类

    1. 以字符作为最小单位进行操作,本质仍然是字节流(字符流)
    2. 以字节作为最小单位操作(字节流)  
    
    java中io操作的接口:
                    输入            输出
        字节流    -    InputStream  - OutputStream   
        字符流    -    Reader       - Writer  
        
三、字符流
Writer:
1、定义
    Writer是字符输出流:
    
    Writer是一个抽象类,不能直接使用,需要通过它的已知实现类操作  
    操作的是文件 - Writer - OutputStreamWriter - FileWriter 


2、FileWriter
    构造方法:
        FileWriter(File file)  
        FileWriter(File file, boolean append)  
        FileWriter(String fileName)  
        FileWriter(String fileName, boolean append)  
        
        说明:
            append表示是否打开追加模式,
                true 表示将当前内容追加到原文件的末尾
                false    表示用当前内容重写原文件
                
    
    常用方法:
        void write(int c);  
        void write(char[] cbuf);  
        void write(char[] cbuf, int off, int len);
        void write(String str);  
        void write(String str, int off, int len);
        
    说明:
        wite方法,不会立即将数据写入磁盘的文件中,而是先写入到缓冲
        区,目的是为了提高效率,当缓冲区满了后,数据会流入文件;如果
        不希望数据留在缓冲,则可以调用flush方法,立即刷新。
        
    刷新缓冲区:
        void flush() //刷新缓冲区
    
    关闭文件输出流: 在关闭流时会自动调用flush方法
        void close()
        
Reader:字符输入流
    继承关系:Reader - InputStreamReader - FileReader
    
    构造方法:
        FileReader(File file) //接受一个File对象
        FileReader(String fileName)//接受一个文件的路径字符串
    
    常用方法:
        read() //读取第一个字符
        read(char[] cbuf, int offset, int length)
        read(char[] cbuf)
        read(CharBuffer target)
        
    关闭文件输入流:
        void close();
        
    案例:读取文件内容
    //构建文件输入流 FileReader
        FileReader fileReader = new FileReader("D:" + PS + "test" + PS + "out.txt");
        char[] chars = new char[4];
        int readChars = 0;
        while ((readChars = fileReader.read(chars))!=-1){
            String str = new String(chars, 0, readChars);
            System.out.println(str);
        }
        fileReader.close();


练习:
    1、利用File实现递归删除,写死。
    2、统计工作空间下Java文件,并输出代码行数
    3、复制文件
    
    
四、字节流
1、主要的类
    InputStream
    OutputStream
    
    字符流的底层也是基于字节流实现,字节流比较通用。
    

2、FileOutputStream 文件字节输出流
    构造方法:
        FileOutputStream(String name, boolean append)
        FileOutputStream(File file, boolean append)
        
    常用方法:
        write(byte b[])
        
        
    案例代码:
        //定义文件路径
          String path = "E:\\java72_projects\\java-api\\src\\cn\\hxzy\\apimod\\day08\\files\\erro.log";

          FileOutputStream fileOutputStream = null;

          try {
              //打开文件
              fileOutputStream = new FileOutputStream(path);

              //操作文件
              String content = "hello java,欢迎使用idea!";
              fileOutputStream.write(content.getBytes("UTF-8"));
              //fileOutputStream.flush();

          } catch (Exception e) {
              e.printStackTrace();
          } finally {
              //关闭文件
              if(fileOutputStream != null) {
                  try {
                      fileOutputStream.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  } finally {
                      fileOutputStream = null;
                  }
              }
          }
        
    
3、FileInputStream 文件字节输入流
    构造方法:
        FileInputStream(File file)
        FileInputStream(String name)
    常用方法:
        int read()
        int read(byte[] b)

    案例代码:
        //定义文件路径
          String path = "E:\\java72_projects\\java-api\\src\\cn\\hxzy\\apimod\\day08\\files\\erro.log";
          String path1 = "E:\\java72_projects\\java-api\\src\\cn\\hxzy\\apimod\\day08\\files\\erro-out.log";


          //构建字节输入流
          FileInputStream fileInputStream = null;

          //构建字节输出流
          FileOutputStream fileOutputStream = null;
          try {
              fileInputStream = new FileInputStream(path);

              fileOutputStream = new FileOutputStream(path1);

              //操作
              byte[] btns = new byte[2];
              //读取2个字节-》btns
              int count = 0;
              //这种问题如何解决?
              while ((count = fileInputStream.read(btns)) != -1) {
                  //将读取的文件数据写出到其他文件
                  //fileOutputStream.write(btns, count);
                  fileOutputStream.write(btns, 0, count);

                  //控制台打印
                  /*String result = new String(btns, "UTF-8");
                  System.out.println(result);*/
              }

          } catch (Exception e) {
              e.printStackTrace();
          } finally {
              //先关输入还是先关输出?  --- 先关输入
              //关闭
              if(fileInputStream != null) {
                  try {
                      fileInputStream.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  } finally {
                      fileInputStream = null;
                  }
              }

              if(fileOutputStream != null) {
                  try {
                      fileOutputStream.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  } finally {
                      fileOutputStream = null;
                  }
              }
          }

    
练习:通过字节输入和输出流实现将视频文件进行复制。


五、装饰器
    由于InputStream&OutputStream没有缓冲区,导致java程序需要直接与磁盘进行IO操作,
    增加了BufferedInputStream&BufferedOutputStream 

1、BufferedInputStream
    构造方法:
        BufferedInputStream(InputStream in)
        BufferedInputStream(InputStream in, int size)

    主要方法:
        synchronized void flush()

2、BufferedOutputStream
    构造方法:
        BufferedOutputStream(OutputStream out)
        BufferedOutputStream(OutputStream out, int size)

3、BufferedReader

    String readLine()    //读取一行


4、BufferedWriter

    在字符的装饰类上扩展了标记功能
    
    //用于标记当前文件中的操作位置
    void mark(int readAheadLimit)
    //将文件操作指针重置到mark标记位
    void reset()
    
案例代码:
    String path = "E:\\java72_projects\\java-api\\src\\cn\\hxzy\\apimod\\day08\\files\\main.txt";

    //从文件中读取字符  file read
    FileReader fileReader = new FileReader(path);
    BufferedReader bufferedReader = new BufferedReader(fileReader);

    //char cha = (char)bufferedReader.read();

    System.out.println((char)bufferedReader.read());
    bufferedReader.mark(10);
    System.out.println((char)bufferedReader.read());
    System.out.println((char)bufferedReader.read());
    System.out.println((char)bufferedReader.read());
    bufferedReader.reset();
    System.out.println((char)bufferedReader.read());
    System.out.println((char)bufferedReader.read());
    System.out.println((char)bufferedReader.read());

    //执行结果: a,b,c,d,b,c,d
    

六、系统流
    
    System.err 标准错误输出流
    System.out 标准输出流
    System.in 标准输入流
    
    Scanner 扫描器
    案例:
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        System.out.println(str);
        
        
    利用装饰器配合系统标准输入流实现扫描器功能:
        BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);

        System.out.println("请输入内容:");
        byte[] bt = new byte[255];
        int read = bufferedInputStream.read(bt, 0, bt.length);
        String str = new String(bt, 0, read, "utf-8");

        System.out.println("您接收的内容是:"+str);
    
    
    
    
    


    


 


原文地址:https://blog.csdn.net/binishuaio/article/details/143599466

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!