学习Java第十六天:Java中的输入流和输出流

  1. 输入输出流

    输入输出流 --- 读写文件

    输入---读取文件中数据到自己的程序中接受处理

    输出---将自己的程序中处理好的数据写入文件中

  1. 流的分类

    按照数据的移动轨迹将流分为:输入流,输出路

    按照每一次读/写数据量的大小将流分为:字节流,字符流

    字节流:每一次可以读写一个字节的数据量,一个字节就是8位2进制(图片,视频,mp3...)

    字符流:每一次可以读写一个字符的数据量,一个字符就是16位2进制,只能处理文本类型的数据。

    详细划分:字节输入流,字节输出流 | 字符输入流,字符输出流

  1. 字节流相关类的使用

    字节输出流 --- OutputStream --- 抽象类 --- 不能new --- 子类

    1. FileOutputStream类

      构造方法:

      FileOutputStream(File file) --- 通过File对象创建一个不可追加的字节输出流。

      File file = new File("D:" + File.separator + "20220202" + "test.txt")
      FileOutputStream fos = new FileOutputStream(file);

      FileOutputStream(File file,boolean append) --- 通过File对象创建一个是否追加的字节输出流。

      File file = new File("D:" + File.separator + "20220202" + "test.txt")
      FileOutputStream fos = new FileOutputStream(file,true);

      FileOutputStream(String name) --- 通过String对象创建一个不可追加的字节输出流。

      FileOutputStream fos = new FileOutputStream("D:" + File.separator + "20220202" + "test.txt");

      FileOutputStream(String name,boolean append) --- 通过String对象创建一个是否追加的字节输出流。

      String str = "D:" + File.separator + "20220202" + "test.txt";
      FileOutputStream fos = new FileOutputStream(str,true);
      public class TestFile {
          public static void main(String[] args) throws Exception{
              //输出
              File file =new File("E:" + File.separator + "20220202" +File.separator +  "test.txt");
              OutputStream fos = new FileOutputStream(file);
              String info = "Hello,world1";
              byte[] bytes = info.getBytes();
              fos.write(bytes,0,5);
              fos.close();
              System.out.println("输出成功");
      }

      注意:append参数如果是true就是追加(不覆盖原有的),创建输入输出流对象的时候,会自动创建出实体文件。

      常用方法

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

      void write(byte[] b,int off,int len)将len字节从位于偏移量offf的指定字节数组写入此文件输出流。

      void write(int b)将指定的字节写入此文件输出流。

      void close()关闭此文件输出流并释放与此流相关联的任务系统资源。

    2. FileInputStream类

      构造方法

      FileInputStream(File file)通过File对象创建一个字节输入流

      FileImputStream(String name)通过String对象创建一个字节输入流

      常用方法

      int read() --- 从该输入流读取一个字节的数据。

      返回值:读取到具体字节数据的int型,如果到达文件末尾返回-1.

      int read(byte[] b)从该输入流读取最多b.length个字节的数据为字节数组。

      返回值:读取的总字节数,如果到达文件末尾返回-1.

      void close()关闭此文件输入流并释放与流相关联的任务系统资源。

      public class TestFile {
          public static void main(String[] args) throws Exception{
              //输入流
              File file = new File("E:"+ File.separator + "20220202"+ File.separator + "test.txt");
              FileInputStream fis = new FileInputStream(file);
              byte[] bytes = new byte[(int)file.length()];
              int temp = 0;
              int index = 0;
              while((temp = fis.read()) != -1){
                  bytes[index] = (byte) temp;
                  index ++;
              }
              String str= new String(bytes,0,index);
              System.out.println(str);
              fis.close();
          }
      }

    3. DataOutputStream类

      构造方法

      DataOutputStream(OutputStream out)创建一个新的数据输出流,将数据写入指定的底层输出流。

      常用方法

      void writeBoolean(boolean v)---将boolean写入底层输出流作为1字节值。

      void writeByte(int v)---将byte作为1字节值写入底层输出流。

      void writeChar(int v)---将char写入底层输出流作为2字节值,高字节优先。

      void writeDouble(double v)---双参数传递给转换long使用doubleToLongBits方法Double,然后写入改long值基础输出流作为8字节的数量,高字节。

      void writeFioat(float v)---浮点参数的转换int使用floatToIntBits方法在类Float,然后写入改int值基础输出流作为一个4字节的数量,高字节。

      void writeInt(int v)---将底层输出流写入int作为 四字节,高位字节。

      void writeLong(long v)---将long写入底层输出流,为8字节,高字节为首。

      void writeShort(int v)---将short写入底层输出流作为两个字节,高字节优先。

      void writeUTF(String str)---使用modified UTF-8编码以机器无关的方式将字符串写入基础输出流。

      void flush()---刷新此数据输出流。

      void close()---关闭此输出流并释放与此流相关联的任务系统资源。

      优点:可以直接写出基本数据类型的数据和String,且不需要转换成字节数组

      缺点:保存到文件中的数据是乱码。

    4. DataInputStream类

      构造方法

      DataInputStream(InputStream in)创建使用指定的底层InputStream的DataInputStream

      常用方法

      同上

  2. 字符流相关的操作类(处理文本数据)

    字符输出流 --- Writer类 --- 抽象类 --- 不能new --- 子类

    1. FileWriter类

      构造方法

      FileWriter(File file)给一个File对象构造一个FileWriter对象。

      FileWriter(File file,boolean append)给一个File对象构造一个是否允许追加FileWriter对象。

      FileWriter(String fileName)给一个String对象构造一个FileWriter对象。

      FileWriter(String fileName,boolean append)给一个String对象构造一个是否允许追加FileWriter对象。

      常用方法

      void write(char[] cbuf)写入一个字符数组。

      void write(char[] cbuf,int off,int len)写入字符数组的一部分。

      void write(int c)写一个字符。

      void write(String str)写一个字符串。

      void write(String str,int off,int len)写一个字符串的一部分。

      void close()关闭流,先刷新。

      void flush()刷新流。

    public class FileWriterTest {
        public static void main(String[] args) throws IOException {
            String str = "E:" + File.separator + "20220202" + File.separator  + "test.txt";
            FileWriter fileWriter = new FileWriter(str);
            String info = "你好,世界";
            char[] chars = info.toCharArray();
            fileWriter.write(chars);
            fileWriter.flush();
            fileWriter.close();
            System.out.println("写入成功");
        }
    1. 字符输入流 --- Reader类 --- 抽象类 --- 不能new --- 子类

      FileReader类

      构造方法

      FileReader(File file)给一个File对象构造一个FileReader对象。

      FileReader(String fileName)给一个String对象构造一个FileReader对象。

      常用方法

      int read()---读一个字符。返回值是读取的真实字符数据的整数值,如果已经大道流的末尾,则为-1。

      int read(char[] cbuf)---将字符读入数组。返回总字符数,如果到达文件末尾返回-1;

      void close()---关闭流并释放与之相关联的任务系统资源。

    public class FileWriterTest {
        public static void main(String[] args) throws IOException {
            File file = new File("E:" + File.separator + "20220202" + File.separator + "test.txt");
            FileReader fileReader = new FileReader(file);
            char[] chars = new char[(int)file.length()];
            int temp = 0;
            int index = 0;
            while((temp =fileReader.read()) != -1){
            chars[index] = (char)temp;
            index ++;
            }
            String result = new String(chars, 0, index);
            System.out.println(result);
        }
    }

  3. BufferedWriter类

    构造方法

    BufferedWriter(Writer out)---通过字符输出流的对象创建BufferedWriter

    常用方法

    void newLine()---写一行行分隔符。

    void write(char[] cbuf,int off,int len)---写入字符数组的一部分。

    void write(int c)---写一个字符。

    void write(String s,int off,int len)---写一个字符串的一部分。

    void close()--关闭流,先刷新。

    void flush()--刷新流。

  4. BufferedReader类

    构造方法

    BufferedReader(Reader in)通过字符输入流对象创建一个BufferedReader

    常用方法

    int read()---读一个字符,返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1.

    int read(char[] cbuf)---将字符读入数组,返回总字符数,如果到达文件末尾返回-1.

    void close()---关闭流并释放与之相关联的任何系统资源。

    String readLine()---读一行文字。

    BufferedReader ---------Scanner

    readLine() nextLine()

    从文件中读取 从键盘输入中读取

    问:我们能不能通过BuferedReader读取键盘输入的数据?Scanner的nextLine()方法为什么可以读取键盘输入?

    答:因为Scanner对象在创建的时候使用过了System.in,System.in默认就是键盘输入,只要在创建BufferedReader对象的时候,使用System.in就可以完成键盘输入,BufferedReader(Reader in)参数是Reader字符输入流,System.in是InputStream类型字节输入流。

    解决问的关键就是将InPutStream类型字节输入流转换成Reader字符输入流。下面介绍:

  5. InputStreamReader类(字节输入流转换成字符输入流)

    构造方法

    InputStreamReader(InputStream in)---字节输入流转换成字符流(属于字符流的字符输入流)

    public class Buffered {
        public static void main(String[] args) throws IOException {
    ​
            InputStreamReader inputStreamReader = new InputStreamReader(System.in);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            System.out.println("从键盘输入一些东西吧");
            String s = bufferedReader.readLine();
            System.out.println(s);
        }
    }

  6. OutputStreamWriter类(字节输出流转换成字符输出流)

    构造方法

    OutputStreamWriter(OutputStream out)---将字节输出流转换成字符输出流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网农民工001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值