zoukankan      html  css  js  c++  java
  • Java基础——iO(一)

    此文为了解IO知识的基础篇,这块我看了几天,感觉和前段时间学习集合一样,零散又重要。想记录一下这块由浅入深的学习过程。所以,接下来会记录几篇学习笔记,之后会有以前深入总结。因为这块比较重要啊,所以一定要学好。

    一、IO的概述

    IO: (Input Output)

    --- 什么是流:

    一组有顺序的、有起点和终点的数据集合,如文件流、网络流

    --- 流与文件的区别:

    文件是数据的静态存储方法。流是数据在传输时的一种形态。

    java 对数据的操作都是通过流的方式,java 用于操作流的对象都在IO包中。

    流按操作数据分为:

    字节流(InputStream、OutputStream) 和 字符流(Reader、Writer)

    其他所有的IO操作的类都是有它 们派生出来的

    凡是属于字节流的 都是以 InputStream ,  OutputStream 为结尾,比如  FileInputStream, FileOutputStream 等

    凡是属于字符流的,都是以   Reader  , Writer 为结尾 比如  FileReader, PrintWriter 等

    流按流向分为:

    输入流和输出流

    二、字符流 Writer

    字符流的结构(只以输出流为例)

    Writer -- BufferedWriter

    CharArrayWriter

    OutputStreamWriter --FileWriter

    FilterWriter  //过滤流

    PipedWriter   //管道流

    StringWriter

    //例一 创建一个文件,写入一些内容   
    static void test() throws IOException{
        Writer wr=new FileWriter("c:/1.txt");  //把原来的内容覆盖了
        wr.write("这是一行文本");
        wr.write("
    "); //写入换行符
        wr.write("这是第二行文本"); //写到缓冲区中了
        wr.flush(); //刷新缓冲区
        wr.close(); //流使用完,一定要关闭
        }
                    
        //FileWriter(String fileName, boolean append)  
            static void test2()throws IOException{
        Writer wr=new FileWriter("c:/1.txt",true);  //可以给第二个参数传true,表示以追回的方式写入
        wr.write("这是追加方式写入的内容");
        //wr.flush(); 有下面的close,这里不flush也可以    
           wr.close();
        }

    三、标准的IO异常处理

    代码示例:

    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    import java.util.ArrayList;
    import java.util.List;
    
    //把一份名单写入文件
    class Test16 {
        public static void main(String[] args) {
    
            List<String> nameList = new ArrayList<String>();
            nameList.add("PHP");
            nameList.add("Java");
            nameList.add("C#");
            nameList.add("C++");
    
            Writer wr = null;
            try {
                wr = new FileWriter("名单.exe");
                for (String name : nameList) {
                    wr.write(name + "
    ");
                }
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            } finally {
                try {
                    if (wr != null) {
                        wr.close();
                    }
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }
        }
    }
    
    // 关键点,要在finally 中关闭资源,关闭的时候,不要忘了判断这个资源是不是null

    四、字符流 Reader

    //例子,从文件中读取数据

    int read() 读取单个字符 //返回的是这个字符的编码值

    int read(char[] cbuf) 将字符读入数组 //返回值是读到的字符个数,如果读到了末尾,返回-1(-1这个性质经常用到)

    int read(char[] cbuf, int off, int len)  将字符读入数组的某一部分。

    //从文件读取数据 (本例是一个字符一个字符的方式读的)
    static void test4() throws IOException {
        Reader  r=new FileReader("C:/名单.txt");
        int ch=0;
        while(( ch=r.read()) !=-1 ){
            System.out.println((char)ch);
            }        
        }
    //从文件读取数据 ,做为了一个符串打印出来   
    static void test5() throws IOException {
        Reader  r=new FileReader("C:/1.txt");
        char [] buff=new char[1024];
        int count=r.read(buff);
        String str=new String(buff,0,count);
        System.out.println(str);
        r.close();
        }  
    //例子 文件复制 ,把C盘上的某个文件复制到E盘
    //这样的复制是将字符一个一个的复制,很显然,它的效率比较低!
    Reader r=new FileReader("E:\FristOne\src\MyProject.java"); //注意:路径的反斜杠要用转义 Writer w=new FileWriter("E:\desc.txt"); int ch=0; while( (ch= r.read())!=-1 ){ w.write(ch); } r.close(); w.close()

    既然,有一个一个的复制,我们会想,怎么样才能让复制的效率变得更加高效呢?

    我们可以定义一个容器,用它去块一块的去复制,效率就会更高了。下面是图形说明:

     代码示例:

    Reader r=new FileReader("E:\FristOne\src\MyProject.java");
        Writer w=new FileWriter("E:\desc.txt");
        char [] buff=new char[1024];//定义一个容器
        //定义容器之后,会发生一些情况,比如取了几次以后,剩下部分的容量少于定义的容器的容量,这时候让它再去一次势必会有空余的空间被占位。这不是我们想要的,所以就引出下面这个含参的取法。
            int len=0; 
            while( (len= r.read(buff))!=-1 ){
            w.write(buff,0,len);
        }
        r.close();
        w.close();

    关于IO的知识确实蛮多的,下篇待续咯......

  • 相关阅读:
    SET NOCOUNT ON 作用
    C# WinForm控件之Dock先后顺序调整
    Sql查询按某字段值排序
    sql server 中DateName()函数及DatePart()函数
    js的字符串代码库及讲解
    js实现字符串格式的日期加一天
    1、用datetimepicker插件实现限定时间范围的选择 2、时间插件实现默认当天的时间和只能选择小于今天的日期
    js判断开始时间不能小于结束时间
    vue监听路由的变化,跳转到同一个页面时,Url改变但视图未重新加载问题
    js对json格式对象进行增加,修改,删除
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/7136352.html
Copyright © 2011-2022 走看看