JavaIO流之常用流总结(一)

首先概述一下IO是什么

  你想象 并思考一下  当你编辑一个文本文件,忘记了ctrl+s而关闭了 是不是很蛋疼,当你电脑上插入一个U盘 把一个视频从U盘拷入你电脑硬盘里。这些数据都是在那些设备上?

  我们可以把这种数据的传输 看作是一种数据的流动,按照流动的方向,以内存为基准,分为输入input和输出output,即流向内存是输入流,输出内存的输出流

  在Java中I/O操作主要是指使用其IO包下的内容进行输入,输出操作 通常 输入叫做读取数据 输出叫做写出数据

  根据数据流向的不同 我们可以把其分为:输入流和输出流

    输入流:把数据从其他设备上读取到内存中的流

    输出流:把数据从内存中写出到其他设备上的流

  根据数据的格局类型可以分为:字节流和字符流

    字节流:以字节为单位 读写数据的流

    字符流:以字符为单位,读写数据的流

    在IO流下的两大分类都有两个祖宗倍的类

      字节流中:

        输入流: InputStream(字节输入流)

        输出流:OutputStream(字节输出流)

      字符流中:

        输入流:Reader(字符输入流)

        输出流:Writer(字符输出流)

先扯扯字节流:

  在面向对象思想中有“万物皆对象”,而在这里我也把字节套一套叫"一切皆字节".

  一切文件数据在存储时,都是以二进制数字的形式保存 都一个一个的字节 那么传输时一样如此。所以,字节流可以传输任意文件数据。所以我们时时刻刻都要明确,无论使用什么样的流对象 底层传输始终为二进制数据

  字节输入流[InputStream]:

    IO.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。定义了字节输入流的基本共性功能方法

      例如:

        public void close():关闭此输入流并释放与此流相关链的任何系统资源

        public abstract int read():从输入流读取数据的下一个字节

        public int read(byte[] b):从输入流中读取一些字节数,并将它们存储到字节数组b中

注意:当完成了对流的操作方法时必须调用close方法来释放系统资源

    FileInputStream类:
      IO.FileInputStream类是文件输入流,从文件中读取字节

      构造方法:

        FileInputStream(File file):通过打开与实际文件的连接来创建一个FileInputStream 该文件由文件系统中的File对象file命名

        FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名

 当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FIleNotFoundException。

代码实例:

//使用File对象创建流对象
    File file=new File("a.txt");
    FileInputStream fos=new FileInputStream(file);
//使用文件名称创建流对象
    FileInputStream fos=new FileInputStream("b.txt");

  读取字节数据:

    1.读取字节:read方法,每次可以读取一个字节的数据 提升为int类型 读取到文件末尾,返回-1,代码示例:   

//首先使用文件名称创建流对象
    FileInputStream fis=new FileInputStream("read.txt");
//然后读取数据,返回一个字节
    int read=fis.read();
    System.out.Println((char)read);
    read=fis.read();
    System.out.Println((char)read);
    read=fis.read();
    System.out.println((char)read);
    read=fis.read();
    SYstem.out.println((char)read);
 //读取到末尾 返回-1
    read=fis.read();
    System.out.println(read);
//最后记得关闭资源
    fis.close();
//------------------------------------------------------------------------------------
//使用循环进行读写
    //首先使用文件名创建流对象
        FileInputStream fis=new FileInputStream("read.txt");
    //定义变量,保存数据
        int b;
    //循环读取
        while((b=fis.read())!=-1){
            System.out.println((char b));
        }
    //关闭资源
    fis.close();

注意: 读取字节会自动提升为int类型, 流操作完毕后必须释放系统资源 调用close方法

    2.使用字节数组读取:read(byte[] b),每次读取b的长度个字节到数组中,返回读取到的有效字节个数 读取到末尾时,返回-1

代码示例:

//使用文件名称创建流对象
    FileInputStream fis=new FileInputStream("d:\\aaa.txt");//文件中为abcde
    //定义变量 作为有效个数
    int len;
    //定义字节数组 作为装字节数据的容器
    byte[] b=new byte[2];
    //循环读取
    while ((len=fis.read(b))!=-1){
        //每次读取后,把数组编程字符串打印
        //System.out.println(new String(b));    //len每次读取的有效字节个数     System.out.println(new String(b,0,len));
    }
    //关闭资源
    fis.close();//如果正常执行会导致单一个  所以要通过len获取有效的字节//使用数组读取 每次读取多个字节 可以减少系统IO操作次数 提高读写效率  

  字节输出流[OutputStream]:

    IO.OutputStream抽象类是表示字节输出流的所有类的超类,将知道的字节信息写出目的地.他定义了字节输出流的基本共性功能方法

    例如:

      public void close():关闭此输出流并释放与此流相关联的任何系统资源

      public void flush():刷新此输出流并强制任何缓冲的输出字节被写出

      public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流

      public void write(byte[] b,int off,int len):从指定的字节数组写入len字节,从偏移量off开始输出到此输出流

      public abstract void write(int b):将指定的字节输出流

注意:当完成流的操作时 必须调用close方法释放系统资源

    FileOutputStream类:

      OutputStream有很多子类 最简单的莫过于FileOutputStream类,此类为文件输出流,用于将数据写出到文件

    构造方法:

      public FileOutputStream(File file):创建文件输出流以写入由指定的File对象表示的文件

      public FileOutputStream(String name):创建文件输出流以指定的名称写入文件

当你创建一个流对象时 必须传入一个文件路径 该路径下 如果没有这个文件 会创建该文件 如果有这个文件 会清空这个文件的数据

代码示例: 

//使用File对象创建流对象
    File file=new File("a.txt");
    FileOutputStream fos=new FileOutputStream(file);
    //使用文件名称创建流对象
    FileOutputStream fosr=new FileOutputStream("b.txt");

   写出字节数据:

    1.写出字节:write(int b)方法 每次可以写出一个字节数据

//使用文件名称创建流对象
    FileOutputStream fos=new FileOutputStream("aaa.txt");
    //写出数据
    fos.write(97);//写出第一个字节
    fos.write(98);//写出第二个字节
    fos.write(99);//写出第三个字节

    //关闭资源
    fos.close();

 注意:虽然参数为int类型四个字节 但是只会保留一个字节的信息写出

    2.写出字节数组:write(byte[] b) 每次可以写出数组中的数据

    

//使用文件名称创建流对象
    FileOutputStream fos=new FileOutputStream("fos.txt");
    //字符串转换为字节数组
    byte[] b="黑马程序员".getBytes();
    //写出字节数组数据
    fos.write(b);
    //关闭资源
    fos.close();

    3.写出指定长度字节数组:write(byte[] b,int off,int len) 每次写出从off索引开始 len个字节,代码示例:

  

//使用文件名称创建流对象
    FileOutputStream fos=new FileOutputStream("fos.txt");
    //字符串转换为字节数组
    byte[] b="abcde".getBytes();
    //写出从索引2开始 2个字节 索引2时c 两个字节 也就是cd
    fos.write(b,2,2);
    //关闭资源
    fos.close();

   数据追加续写

 每次程序运行 创建输出流对象 都会清空目标文件中的数据

  public FileOutputStream(File file,boolean append):创建文件输出流以写入由指定的File对象表示的文件.

  public FileOutputStream(String name,boolean append):创建文件输出流以指定的名称写入文件

这两个构造方法,参数中都需要传入一个boolean类型的指 true表示追加数据 false表示清空原有数据 代码示例:

  

//使用文件名称创建流对象
    FileOutputStream fos=new FileOutputStream("aaa.txt",true);
    //字符串转换为字节数组
    byte[] b="abcde".getBytes();
    //写出从索引2开始,2个字符 索引2是c 两个字节 也就是cd
    fos.write(b);
    //关闭索引
    fos.clos e();

  输出换行

windows系统中 换行比符号是\r\n。代码示例:

//使用文件名称创建流对象
    FileOutputStream fos=new FileOutputStream("aaa.txt");
    //定义字节数组
    byte[] words={97,98,99,100,110};
    //遍历数组
    for (int i = 0; i < words.length; i++) {
        //写出一个字节
        fos.write(words[i]);
        //写出一个换行 换行符号转成数组写出
        fos.write("\r\n".getBytes());
    }
    //关闭资源
    fos.close();

字符流

  字符输入流【Reader】

    IO.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它的基本共性方法

  public void close():关闭此流并释放与此流相关联的任何系统资源

  public int read():从输入流读取一个字符

  public int read(char[] cbuf):从输入流中读取一些字符 并将它们存储到字符数组cbuf中

  FileReader类:

    IO.FileReader类是读取字符文件的便利类 构造时使用系统默认的字符编码和默认字节缓冲区,所谓系统默认字符编码:windows默认中文编码时GBK 默认字节缓冲区时一个字节数组 用来临时存储字节数据的

    构造方法:

      FileReader(File file):创建一个新的FileReader 给定要读取的File对象

      FileRader(String fileName):创建一个新的FileReader 给定要读取的文件的名称

  

//使用文件名称创建流对象

  FileReader fr=new FileRader("d:\\bb.txt");

  //读取字符数据

  int b=fr.reader();

  //使用字符数组读取

  char[] c=new char[2];

  System.out.println(new String(c));

  

  字符输出流【Writer】:

    IO.Writer抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地.它包含了输出流的基本共性方法:

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

      void write(char[] c):写入字符数组

      abstract void write(char[] c,int off,int len):写入字符数组的某一部分 off数组的开始索引,len写的字符个数

      void write(String str):写入字符串

      void write(String str,int off, int len):写入字符串的某一部分 off数组的开始索引 len个数

      void flush():刷新该留的缓冲

      void close():关闭此流(关闭时也会自动刷新

   FileWriter类:

      IO.FileWriter类是写出字符到文件的便利类 构造时使用系统默认的字符编码和默认字节缓冲区

    构造方法:

      FileWriter(File file):创建一个新的FileWriter 给定要读取的File对象

      FileWriter(String fileName):创建一个新的FileWriter 给定要读取的文件的名称

    

//使用文件名称创建留对象
    FileWriter fw=new FileWriter("d:\\aaa.txt");
    //写出字符
    fw.write(97);
    //关闭和刷新
    fw.write(98);
    fw.flush();
    fw.write(99);
    fw.close();
    //write的其他用法
    fw.write("嘿嘿);
    fw.write(new char[])
    //续写与换行
    FileWriter fw=new FileWriter("aaa.txt",true);
    fw.write("\r\n");

 提一嘴使用异常处理IO错误  这里只写除JDk7新特性写法 因为这种写法比较常见  

try(FileInputStream fis=new FileInputStream(filepath);  FileOutputStream fos=new FileOutputStream(filePath1)){
            byte[] buffer=new byte[1024];
            while (true){
                int temp=fis.read(buffer,0,buffer.length);
                if(temp==-1){
                    break;
                }else {
                    fos.write(buffer,0,temp);
                }
            }
        }catch (IOException e){
            System.out.println(e);
        }

说到存储数据 不得不提一提Priperties类

  属性集【Properties】继承与Hashtable 用来表示一个持久的属性集 此类因为继承字hash所以采用键值结构存储数据 ,每个键及其对应值都时一个字符串

  构造方法

    public Properties():创建一个空的属性列表

  基本存储方法:

    public Object setProperty(String key,String value):保存一对属性

    public String getProperty(String key):使用此属性列表中指定的键搜索属性值

    public Set<String>stringPropertyNames():所有键的名称的合集

  代码示例:

//创建属性集对象
   Properties properties=new Properties();
   //添加键值对元素
   properties.setProperty("小明","14");
   properties.setProperty("小方","15");
   properties.setProperty("小花","13");
   //打印属性集对象
   System.out.println(properties);
   //通过键 获取属性值
   System.out.println(properties.getProperty("小明"));
   System.out.println(properties.getProperty("小方"));
   System.out.println(properties.getProperty("小花"));
   //遍历属性集 获取所有键的集合
   Set<String> strings=properties.stringPropertyNames();
   //打印键值对
   for (String string : strings) {
      System.out.println(strings+"--"+properties.getProperty(string));
   }  

与流相关的方法

  public void load(InputStream inStream):从字节输入流中读取键值对

  代码示例:

//创建属性集对象
        Properties  pro=new Properties();
        //加载文本中信息到属性集
        pro.load(new FileInputStream("d:\\aaa.txt"));
        //遍历集合并打印
        Set<String>strings =pro.stringPropertyNames();
        for (String string : strings) {
            System.out.println(string+"--"+pro.getProperty(string));
        }

  

原文地址:https://www.cnblogs.com/chengX3programmer/p/9384037.html

时间: 2024-11-10 13:47:00

JavaIO流之常用流总结(一)的相关文章

java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等

原文:java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等 源代码下载:http://www.zuidaima.com/share/1550463397366784.htm ava 常用流处理工具 StreamTool ,常见的InputStream 流转字符串, 转字节数组等等 **应用场景: ** 1. 文件上传 2. js / css / img 等文件读取输出. 转字符串输出 (js & css) , 转字节数组输出 (img .. swf

16个IO常用流

在包java.io.*:下 有以下16个常用的io流类: (Stream结尾的是字节流,是万能流,通常的视频,声音,图片等2进制文件, Reader/Writer结尾的是字符流,字符流适合读取纯文本文件, 而类前面带Buffered为其相应的缓冲流) FileInputStream; FileOutputStream; FileReader; FileWriter; (File开头的流类,操作对象是一般文件)---4个常用的文件流. BufferedReader; BufferedWriter;

java基础知识回顾之javaIO类--内存操作流ByteArrayInputStream和ByteArrayOutputSteam(操作字节数组)

直接看代码: package cn.itcast.io.p6.bytestream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class ByteArrayStreamDemo { /** * @param args * @throws IOException * 特点 * 1.内存操作流 * 2.不操作底层资源,不调

有关IO流的其他常用流

操作基本数据类型的流.内存操作流.打印流.标准输入流和标准的输出流.随机访问流.合并流.序列化流/反序列化流.属性集合类 一.操作基本数据类型的流 DataInputStream :数据输入流 DataOutputStream:数据输出流 可以操作一些基本数据类型 egg: DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt")); das.writeByte(10); das.writeS

10.4-全栈Java笔记:常用流详解(二)

上节我们讲到「Java中常用流:文件字节流和字节数组流」,本节我们继续走起~  缓冲流 BufferedInputStream和BufferedOutputStream这两个流是处理流,通过内部缓存数组来提高操作流的效率. [示例1]使用缓冲流实现文件的高效率复制操作 public class Demo06 { public static void main(String[] args) { new Demo06().copyFile("d:/a.txt", "d:/b.tx

Java学习资料-常用流类

1.常用流类 1.1 字节流 1.1.1 InputStream(输入流) 1.1.2 OutputStream(输出流) 1.1.3 FileInputStream(文件输入流) 1.1.4 FileOutputStream(文件输出流) 1.1.5 BufferedInputStream(缓冲输入流) 1.1.6 BufferedOutputStream(缓冲输出流) 1.1.7 PrintStream(打印流) 1.2字符流 1.2.1 Reader类 1.2.2 Writer类 1.2.

Java8 Stream流API常用操作

Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些常用的Stream流操作; Stream流简介 A sequence of elements supporting sequential and parallel aggregate operations. Stream流是一个来自数据源的元素队列并支持聚合操作 Stream流中常用方法的分类 1.

Java-IO流之转换流的使用和编码与解码原理

一.理论: 1.字符流和字节流区别是什么? 字符流=字节流+编码集,在实际读取的时候其实字符流还是按照字节来读取,但是会更具编码集进行查找编码集字典解析相应的字节,使得一次读取出一个字符: 2.什么是转换流? 转换流就是原本是字节流,但是读取到的数据是字符,所以我们希望使用字符流来进行操作,那么就可以使用转换流进行转换: 转换流=字节流+编码集. 转换流的特点是可以指定编码集. 3.转换流的作用: (1).从控制台读取数据输入(键盘输入),将它们写入到文件(我们写的是字符吧): (2).当对文件

面试题:JavaIO流分类详解与常用流用法实例

Java流概念: Java把所有的有序数据都抽象成流模型,简化了输入输出,理解了流模型就理解了Java IO.可以把流想象成水流,里面的水滴有序的朝某一方向流动.水滴就是数据,且代表着最小的数据流动单位,在字节流中,水滴就是一字节(byte),在字符流中,水滴就是一字符(char). Java流的分类方法大致分为以下几种: 1.按流向划分,分为输入流.输出流 请注意,这里的流向是以程序的运行时内存为参照的. 输入流类名中包含关键字InputStream或Reader,输出流类名中包含关键字Out