• JAVA基础-I/O流学习笔记(一)


      第一次写博文,内心无比激动,成长在此开始!

      最近一直在自学java基础,看到I/O流这章了,先写下对I/O流的了解吧!

    一、I/O流简介

      I/O是实现java编程输入和输出的基础,可以方便的将数据进行输入/输出操作。java把不同的输入/输出源(硬盘、文件、网络连接等)抽象的描述成“流”,由于流的存在,实现了不同输入/输出源之间的交换数据。

      java中关于流的操作的类都在java.io包中。

    二、流的分类

      2.1按照流向

      按照流向来分,流分为输入流和输出流。

      输入流:从输入源向内存中输入数据。

      输出流:从内存中向输出源输出数据。

      此处的输入和输出是从程序运行时的内存来说的。

      输入流主要是以InpuStream和Reader作为基类,输出流主要以OutputStream和Writer作为基类,基类都为抽象类,无法直接建立对象。

      2.2按照操作数据

      按照操作数据来分,流分为字节流和字符流。字节流和字符流的用用法几乎一致。区别是操作的单元不同,字节流操作的是字节,字符流操作的是字符。

      字节流是以InputStream和OutputStream为基类,字符流是以Writer和Reader作为基类。

      2.3按照流的角色

      按照流的角色可以分为节点流和包装流。

      可以从一个具体的输入/输出源(硬盘、文件、网络连接等)读/写数据的流,称为节点流,使用节点流时,程序直接操作实际的数据源。

      包装流是对已存在的流进行包装,通过包装后的流实现对数据的读/写。

      (java包装流来包装节点流是一种典型的装饰者模式,通过使用包装流来包装不同的节点流)

    三、InputStream和Reader

      先来介绍一下两个输入流基类。

    InputSream中常用的方法:

    int read(); 从输入流中读取数据的下一个字节

    int read(byte[] b); 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
          int read(byte[] b,int off, int len); 将输入流中最多 len 个数据字节读入 b 数组中,放入数组b时,不是从数组起点开始,而是从off位置开始的,返回实际读取的字节数。

    void close(); 关闭此输入流并释放与该流关联的所有系统资源。

    Reader中常用的方法:

    int read(); 从输入流中读取数据的下一个字符

    int read(char[] c); 从输入流中读取一定数量的字符,并将其存储在缓冲区数组c中
          int read(char[] c,int off, int len); 将输入流中最多 len 个数据字符读入 c  数组中,放入数组c时,不是从数组起点开始,而是从off位置开始的,返回实际读取的字符数。

    void close(); 关闭此输入流并释放与该流关联的所有系统资源。

    对比可以看到InputStream和Reader所提供的功能基本一致。InputStream和Reader是抽象类,不能建立实例,下面是FileInputStream类来实现读取自身的效果。

     1 package it.study.io;
     2 
     3 import java.io.File;
     4 import java.io.FileInputStream;
     5 import java.io.IOException;
     6 
     7 public class InputStreamDemo {
     8     public static void main(String[] args) throws IOException{
     9         //创建文件目录
    10         File f=new File("InputStreamDemo.java");
    11         //建立文件输入流对象
    12         FileInputStream in=new FileInputStream(f);
    13         //建立缓冲数组
    14         byte[] by=new byte[1024];
    15         //用于保存实际读取的字节数
    16         int l=0;        
    17         while((l=in.read(by))!=-1)
    18             //打印字节数组中写入的数据
    19             System.out.print(new String(by,0,l));
    20         //close()放在finally里会更加安全
    21         in.close();
    22     }
    23 }

             

    执行以上程序会产生读取自身的效果并且将此显示出来。

    下面是用FileReader类实现。

     1 package it.study.io;
     2 
     3 import java.io.File;
     4 import java.io.FileReader;
     5 import java.io.IOException;
     6 
     7 public class ReaderDemo {
     8     public static void main(String[] args){
     9             //创建文件目录
    10         File f=new File("ReaderDemo.java");
    12         //如果在try中声明和赋值FileReader,则只在try中生效,即在try外面声明,内部赋值。
    13         FileReader fr=null;
    14         try{
    15             fr=new FileReader(f);
    16             
    17             //建立字符数组
    18             char[] ch=new char[64];
    19             //实际有效的字符数
    20             int l=0;
    21             while((l=fr.read(ch))!=-1){
    22                 System.out.print(new String(ch,0,l));
    23                 
    24             }
    25             
    26         }
    27         catch(IOException i){
    28             i.printStackTrace();
    29             
    30         }
    31         finally{
    32             //关闭流时需要进行判断该流是否为空,如果为空,进行close(),会报错。
    33             if(null!=fr){
    34                 try{
    35                     fr.close();
    36                 }
    37                 catch(IOException i){
    38                     i.printStackTrace();
    39                 }
    40             }
    41             
    42         }
    43     }
    44 }

     

    四、OutputStream和Writer

    OutputSteam中常用的方法:

    void write(int b); 将指定的字节写入的输出流中

    void write(byte[] b); 将指定的字节数组写入到输出流中

    void write(byte[] b,int off,int len); 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流中。

    void close();  关闭此输出流并释放与此流有关的所有系统资源。

    Writer中常用的方法:

    void write(int c); 写入单个字符

    void write(String str); 将指定的字符串写入的输出流中

    void wirte(String str,int off,int len); 将指定的字符串从偏移量off开始的len个字符写入到输出流中

    void write(char[] b); 将指定的字符数组写入到输出流中

    void write(char[] b,int off,int len); 将指定 char 数组中从偏移量 off 开始的 len 个字符写入此输出流中。

    void close();  关闭此输出流并释放与此流有关的所有系统资源。

    使用FileOutputStream类,将该自身复制到电脑d盘下的Demo.txt文件中。

     1 package it.study.io;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     6 
     7 public class OutputStreamDemo {
     8     public static void main(String[] args){
     9         FileOutputStream fos=null;
    10         FileInputStream fis=null;
    11         try{
    12             //建立输入流对象
    13             fis=new FileInputStream("OutputStreamDemo.java");
    15             //建立输出流对象,将本文件复制到d盘下中,文件名为Demo.txt
    16             fos=new FileOutputStream("D:\Demo.txt");
    17             //建立缓冲字节数组
    18             byte[] b=new byte[1024];
    19             //实际的字节数量
    20             int len=0;
    21             while((len=fis.read(b))!=-1){
    22                 
    23                 //将字节数组的有效字节写入到Demo.txt中。
    24                 fos.write(b,0,len);
    25             }
    26             
    27         }
    28         catch(IOException i){
    29             i.printStackTrace();
    30         }
    31         finally{
    32             
    33             //关闭流对象
    34             if(null!=fis){
    35                 try{
    36                     fis.close();
    37                 }
    38                 catch(IOException i){
    39                     i.printStackTrace();
    40                 }
    41             }
    42             if(null!=fos){
    43                 try{
    44                     fos.close();
    45                 }
    46                 catch(IOException i){
    47                     i.printStackTrace();
    48                 }
    49             }
    50             
    51         }
    52     }
    53 }

    下面使用FlieWriter来实现:

     1 import java.io.FileWriter;
     2 import java.io.IOException;
     3 
     4 public class WriterDemo {
     5 
     6     public static void main(String[] args)throws IOException {
     7         // TODO Auto-generated method stub
     8         FileReader fr=new FileReader("WriterDemo.java");
    10         FileWriter fw=new FileWriter("D:\wirte.txt");
    11         char[] c=new char[64];
    12         int len=0;
    13         while((len=fr.read(c))!=-1){
    14             fw.write(c,0,len);
    15             
    16         }
    17         fr.close();
    18         fw.close();
    19 
    20     }
    21 
    22 }

    这篇先写到这,下一篇将针对常用的包装流进行详细说明!

  • 相关阅读:
    ASP.NET Core "完整发布,自带运行时" 到jexus
    Exploring Message Brokers: RabbitMQ, Kafka, ActiveMQ, and Kestrel--reference
    如何给Windows Server 2012 R2 添加“磁盘清理”选项
    win8、server 2012 清除winsxs文件夹
    win10企业版永久激活2017怎么用
    WCF Routing服务,负载均衡
    Net分布式系统之五:C#使用Redis集群缓存
    Net分布式系统之四:RabbitMQ消息队列应用
    Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用
    Net分布式系统之二:CentOS系统搭建Nginx负载均衡(下)
  • 原文地址:https://www.cnblogs.com/chun2015/p/4925511.html
Copyright © 2020-2023  润新知