欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

Java IO流 讲解,javaio流讲解

来源: javaer 分享于  点击 14737 次 点评:171

Java IO流 讲解,javaio流讲解


对于一些初学Java的人来说 io关系不太好理解 但你明白了 代码敲多了 就会慢慢理解了

下面这个图就很好诠释了Java IO流的关系

我们先讲讲最基础的!

IO流的分类

按流向分类:
输入流 读取数据
输出流 写出数据
按数据类型分类:
字节流
字节输入流 读取数据 InputStream
字节输出流 写出数据 OutputStream
字符流
字符输入流 读取数据 Reader
字符输出流 写出数据 Writer

注意:一般我们在探讨IO流的时候,如果没有明确说明按哪种分类来说,默认情况下是按照数据类型来分的。

字节输入流

对于字节输入流InputStream 类是Java所有输入流类的父类 该类为抽象类 实现如下

public abstract class InputStream extends Object implements Closeable

常用方法:

  • read():从输入类读取数据 逐字节读取输入数据
  • skip(long n):将指针从当前位置向后跳动n个字节
  • mark():在指针位置做一个标记
  • Reset():将指针移动到标记位置
  • close():关闭输入流

读取数据1:

public void fun(){
           FileInputStream fis=null;
           InputStream is=null;
           try {
            fis=new FileInputStream("a.txt");
            int len;
            while((len=fis.read())!=-1){
                System.out.print((char)len);
            }
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("读取文件异常");
        }finally{
            if(is!=null)
                try {
                    is.close();
                } catch (IOException e) {
                    System.out.println("关闭输入流异常");
                }
            if(fis!=null)
                try {
                    fis.close();
                } catch (IOException e) {
                    System.out.println("关闭文件输入流异常");
                }
        }
       }

不过上面这种方式属于逐字节读取数据 效率低 我们可以一个字节数组一个字节数组读取 下面我们来改下

读取数据2:

public void fun(){
           FileInputStream fis=null;
           InputStream is=null;
           byte [] bys=new byte[1024];//数组的长度一般是1024或者1024的整数倍
           try {
            fis=new FileInputStream("a.txt");
            int len;
            while((len=fis.read(bys))!=-1){
                System.out.print(new String(bys,0,len));
            }
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("读取文件异常");
        }finally{
            if(is!=null)
                try {
                    is.close();
                } catch (IOException e) {
                    System.out.println("关闭输入流异常");
                }
            if(fis!=null)
                try {
                    fis.close();
                } catch (IOException e) {
                    System.out.println("关闭文件输入流异常");
                }
        }
       }

虽然这样效果提高了 但还有一个问题 一般情况下 对于文本文件的处理 我们都会采用字符流来解决

字节输出流

对于字节输入流OutputStream 类是Java所有输出流类的父类 该类为抽象类 实现如下

public abstract class OutputStream extends Object implements Closeable

常用方法:

  • write();向输出流写入数据 只能逐字节输出数据
  • flush();在具有缓冲功能的子类对象中 强制清空缓
  • close():关闭输出流

write:

public void write(int b):写一个字节
public void write(byte[] b):写一个字节数组
public void write(byte[] b,int off,int len):写一个字节数组的一部分

写入数据1:写一个字节数组

 public void fun(){
           FileOutputStream fos=null;
           OutputStream os=null;
           try {
            fos=new FileOutputStream("d.txt");
            fos.write("hello world".getBytes());
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("写入文件失败");
        }finally{
            if(os!=null)
                try {
                    os.close();
                } catch (IOException e) {
                    System.out.println("关闭输出流失败");
                }
            if(fos!=null)
                try {
                    fos.close();
                } catch (IOException e) {
                    System.out.println("关闭文件输出流失败");
                }
        }

       }

写入数据2:写一个字节数组的一部分

 public void fun6(){
           FileOutputStream fos=null;
           OutputStream os=null;
           byte [] bys={97,98,99,100,101};
           try {
            fos=new FileOutputStream("d.txt");
            fos.write(bys,0,3);
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("写入文件失败");
        }finally{
            if(os!=null)
                try {
                    os.close();
                } catch (IOException e) {
                    System.out.println("关闭输出流失败");
                }
            if(fos!=null)
                try {
                    fos.close();
                } catch (IOException e) {
                    System.out.println("关闭文件输出流失败");
                }
        }

       }

如果你想写入换行,那么怎么办?不同的系统针对不同的换行符号识别是不一样的

windows:\r\n
linux:\n
Mac:\r

而一些常见的个高级记事本,是可以识别任意换行符号的。

 public void fun(){
           FileOutputStream fos=null;
           OutputStream os=null;
           try {
            fos=new FileOutputStream("d.txt");
            fos.write(("hello"+"\r\n").getBytes());
            fos.write(("java"+"\r\n").getBytes());
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("写入文件失败");
        }finally{
            if(os!=null)
                try {
                    os.close();
                } catch (IOException e) {
                    System.out.println("关闭输出流失败");
                }
            if(fos!=null)
                try {
                    fos.close();
                } catch (IOException e) {
                    System.out.println("关闭文件输出流失败");
                }
        }

       }

字符输入流

Reader类

用来从输入流中读入数据 该类也是一个抽象类 定义了所有字节输入流,具有流共有的特性 其他具体的字符输入流类继承自Reader类

常用方法:

  • read():从输入类读取数据 逐字节读取输入数据
  • skip(long n):将指针从当前位置向后跳动n个字节
  • mark():在指针位置做一个标记
  • Reset():将指针移动到标记位置
  • close():关闭输入流

读取数据1:

public void fun(){
          FileReader fr=null;
           try {
            fr=new FileReader("d.txt");
            int len;
            while((len=fr.read())!=-1){
                System.out.print((char)len);
            }
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("读取文件失败");
        }finally{
            if(fr!=null)
                try {
                    fr.close();
                } catch (IOException e) {
                    System.out.println("关闭输入流失败");
                }
        }

       }

读取数据2:

 public void fun(){
          FileReader fr=null;
         char [] ch=new char[1024];
           try {
            fr=new FileReader("d.txt");
            int len;
            while((len=fr.read(ch))!=-1){
                System.out.print(new String(ch,0,len));
            }
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("读取文件失败");
        }finally{
            if(fr!=null)
                try {
                    fr.close();
                } catch (IOException e) {
                    System.out.println("关闭输入流失败");
                }
        }

       }

字符输出流

Writer类

用来从输出流中写入数据 该类也是一个抽象性 定义了所有字节输出流,具有输出流共有的特性 其他具体的字符输出流类继承自Writer类

常用方法:

  • write();向输出流写入数据 只能逐字节输出数据
  • flush();在具有缓冲功能的子类对象中 强制清空缓冲区
  • close():关闭输出流

写入数据1:

public void fun(){
          FileWriter fw=null;

           try {
           fw=new FileWriter("e.txt");
            fw.write("呵呵呵");
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("读取文件失败");
        }finally{
            if(fw!=null)
                try {
                    fw.close();
                } catch (IOException e) {
                    System.out.println("关闭输入流失败");
                }
        }

       }

写入数据2:

public void fun(){
          FileWriter fw=null;
          char [] ch={'和','j','1'};
           try {
           fw=new FileWriter("e.txt");
            fw.write(ch);
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("读取文件失败");
        }finally{
            if(fw!=null)
                try {
                    fw.close();
                } catch (IOException e) {
                    System.out.println("关闭输入流失败");
                }
        }

相关文章

    暂无相关文章

用户点评