Javase | IO流

目录:

    • 1.输入 (Intput/Read)
    • 2.输出 (Output/Write)
    • 3.IO
    • 4.IO流
    • 5.IO流的分类:
      • 5.1 分类总述
      • 5.2 按照 “流的方向” 进行分类
      • 5.3 按照 “读取数据的方式” 进行分类
    • 6.IO包下要重点掌握的流:
      • 6.1 文件专属 (流)
      • 6.2 转换流 ( 将字节流转换为字符流 )
      • 6.3 缓冲流专属
      • 6.4 数据流专属
      • 6.5 打印输出流
      • 6.6 对象流专属
    • 7.字节流:
      • 7.1 文件字节输入流 (FileInputStream)
        • 7.1.1 read( )方法
        • 7.1.2 read( byte[ ] b )方法
        • 7.1.3 available( )方法
        • 7.1.4 skip(long n)方法
      • 7.2 文件字节输出流 (FileOutputStream)
        • 7.2.1 write(byte b)方法
        • 7.2.2 write(byte b , int off ,int len) 方法
    • 8.字符流
      • 8.1 文件字符输入流 :FileReader
        • 8.1.1 int read( ) 方法
        • 8.1.2 int read( char c ) 方法
      • 8.2 文件字符输出流:FileWriter
        • 8.2.1 void write( )方法
    • 9.文件复制:
      • 9.1 用文件字节输入流 + 文件字节输出流
      • 9.2 用文件字符输入流 + 文件字符输出流
    • 10.缓冲流:
      • 10.1 缓冲输入流 (BufferedReader)
        • 10.1.1 String readLine( )方法
      • 10.2 缓冲输出流 (BufferedWriter)
    • 11.节点流
    • 12.包装流/处理流
    • 13.转换流
    • 14.数据流
      • 14.1 字节数据输出流 (DataOutptStream)
      • 14.2 字节数据输入流 (DataInptStream)
    • 15.打印流
      • 15.1 打印输出流
      • 15.2 用“打印输出流” 编写 “日志工具”

1.输入 (Intput/Read)

  • 硬盘 中的文件放到 内存 中,这个过程叫输入 (Intput) / (Read)。

  • 硬盘中的文件放到内存中,可重新表述为:

    ①把硬盘中的文件 输入(Intput) 到内存中。

    ②把硬盘中的文件 (Read) 进内存中。

  • 内存中文件在关机后会丢失
  • 硬盘中文件在关机后仍存在

2.输出 (Output/Write)

  • 内存中的文件放到硬盘中,这个过程叫输出 (Output) / (Write)。

  • 内存中的文件放到硬盘中,可表述为:

    ①把内存中的文件 输出 (Output) 到硬盘中。

    ②把内存中的文件 (Write)到硬盘中。

在这里插入图片描述

  • 不管是输入还是输出参照物都是内存
  • 从内存出来 (到硬盘中),叫输出
  • 进内存中 (从硬盘进到内存中),叫输入

3.IO

I: 输入 (Intput)

O : 输出 (Output)

通过 IO (输入输出)可以完成硬盘文件

4.IO流

读和写的过程中,会产生 数据的流动,叫 IO流 (Input/Output Stream) 。

5.IO流的分类:

5.1 分类总述

  • Java IO四大家族

  • 四大家族的首领为:

    • java.io.**InputStream **(字节输入流)
    • java.io.OutputStream(字节输出流)
    • java.io.Reader(字符输入流)
    • Java.io.Writer (字符输出流)
  • 四大家族的首领都是抽象类 ( abstract class )

  • 在java中:

    以类名 “Stream结尾的都是字节流。 以 “Reader / Writer结尾的都是字符流

    如:
    java.io.BufferedReader字符流 ,其是java.io.Reader子类

    java.io.FileInputStream字节流,其是java.io.InputStream子类

  • 所有流实现了java.io.Closeable接口,都是可关闭的,都有close()方法,流毕竟是一个管道,是内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费 (占用) 很多资源。用完流一定要关闭。
  • 所有的输出流都实现了java.io.Flushable接口,都是可刷新的,都有flush()方法。输出流在最终输出之后,一定要记得flush()刷新一下。这个刷新表示通道/通道当中剩余的数据强行输出完 (清空管道!),刷新的作用就是清空管道。
    如果没有flush()可能导致数据丢失。

5.2 按照 “流的方向” 进行分类

  • 按照**流的方向**进行分类分为:
    java.io.InputStream : 字节输入流
    java.io.OutputStream : 字节输出流

  • 字节流输入流 (InputStream) 是 读取字节数据输入流

  • 字节流输出流 (InputStream) 是 写入字节数据输出流

  • 字节流按照字节的方式读取数据,一次读取一个字节byte ( 即一次读取8个二进制位),字节流是万能的
    什么类型的文件都可以读取。包括文本文件、图片、声音文件、视频文件等。

  • 例子如:

    假设文件file.txt中有以下字符组合 ,采用字节读的话就是:

    a中国bc张三fe

    第一次读:读一个字节,读到 ‘a’

    第二次读:读一个字节,读 ‘中’的一半

    第三次读:读一个字节,读 ‘中’的另一半

    第四次读:读一个字节,读 ‘国’的一半

    第五次读:读一个字节,读 ‘国’的另一半

    第六次读:读一个字节,读 ‘b’

5.3 按照 “读取数据的方式” 进行分类

  • 按照 读取数据的方式 进行分类:

  • java.io.Reader: 字符输入流
    java.io.Writer: 字符输出流

    例子如:

    假设文件file.txt中有以下字符组合 ,采用字符流读的话就是:
    a中国bc张三fe

    第一次读:读一个字节,读到 ‘a’

    第二次读:读一个字节,读 ‘中’的一半

    第三次读:读一个字节,读 ‘中’的另一半

    第四次读:读一个字节,读 ‘国’的一半

    第五次读:读一个字节,读 ‘国’的另一半

    第六次读:读一个字节,读 ‘b’

注意:

  • 在windows系统中,一个英文字符‘a’占一个字节,一个中文字符‘中’占两个字节。
  • 但在Java,一个英文字符‘a’占二个字节,一个中文字符‘中’占两个字节。(因为‘a’ 字符、‘中’字符 都是char类型,char类型占两个字节)。
  • 上面的file.txt文件是windows操作系统上的普通文件,文件中‘a’占一个字节 ,‘中’占两个字节。
  • 如果我们用java打开这个file.txt文件,如果用字节流读取,一个字节一个字节 (8个二进制位) 那样读取会识别不了,但如果用字符流进行读取,就可以识别(能一个字符一个字符的进行读取)。

6.IO包下要重点掌握的流:

6.1 文件专属 (流)

  • java.io.FileInputStream文件字节输入流 (重点掌握)
  • java.io.FileOutputStream文件字节输出流 (重点掌握)
  • java.io.FileReader文件字符输入流
  • java.io.FileWriter文件字符输出流

6.2 转换流 ( 将字节流转换为字符流 )

java.io.InputStreamReader : 将“字节输入流” 转换为 “字符输入流

java.io.OutputStreamWriter : 将“字节输出流” 转换为 “字符输出流

6.3 缓冲流专属

java.io.BufferedReader

java.io.BufferedWriter

java.io.BufferedInputStream

java.io.BufferedoutputStream

6.4 数据流专属

java.io.DataInptStream : 字节数据输入流

java.io.DataOutputStream字节数据输出流

6.5 打印输出流

java.io.printWriter

java.io.printStream : (重点掌握)

6.6 对象流专属

java.io.ObjectInputStream (重点掌握)

java.io.ObjectOutputStream (重点掌握)

7.字节流:

7.1 文件字节输入流 (FileInputStream)

7.1.1 read( )方法

  • 从输入流中读取一个字节的数据。
  • 文件字节输入流是万能的,任何类型的 文件 都可以用这个流来读,以 字节 的方式完成 的操作。

例子如:

public class FileInputStreamTest01 {   //文件输入流public static void main(String[] args) throws IOException {//创建文件字节输入流对象FileInputStream fis = null;try {fis = new FileInputStream("D:\\file.txt");int readData;char DataInfo;//读入一个字节的数据(的Unicode值),如果到达文件末尾返回-1while ((readData = fis.read()) != -1) {DataInfo = (char) readData; //将unicode值转换为具体的字符System.out.println(DataInfo);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally { //在finally语句中确保流的关闭if (fis != null) { //关闭流的前提是: 流不是空 ,流是null是没必要关闭//关闭输入流fis.close();}}}
}
public class FileInputStreamTest02 {   //文件输入流public static void main(String[] args) throws IOException {FileInputStream fis = null;try {//创建文件字节输入流fis = new FileInputStream("D:\\file.txt");while (true) {int readData =  fis.read();if (readData == -1) {break;}char DataInfo = (char) readData;System.out.println(DataInfo);}//改造上面的while语句int readData =  0;while ((readData = fis.read()) != -1) {}} catch (FileNotFoundException e) {e.printStackTrace();}finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}
}

7.1.2 read( byte[ ] b )方法

  • 从该输入流中读取最多b.length个字节的数据作为字节数组。

  • 上面的.read( )方法 一次读取一个字节byte,这样内存和硬盘交互太频繁了,基本上时间/资源耗费在交互上,能不能一次读取多个字节呢?

    可以,用 read( byte[ ] b ) 方法从输入流中读取b.length个字节数据,且返回一个byte数组 (字节数组 )。

    例子如:

//文件字节输入流的 read(byte[] b)方法 : 获得指定长度的字节,存储到字节数组中
public class FileInputStream04 {public static void main(String[] args) {try (//创建文件字节输入流对象FileInputStream fis = new FileInputStream("D:\\file.txt")) { //里面有 abcdef//创建存储字节数组,用以存储读取的数据byte[] bytes = new byte[5];int bytesReadNum = 0;/*** 从字节数组中逐个输出字节数据*///返回值为读到的字节数,如果到字节末尾返回值为-1while ((bytesReadNum=fis.read(bytes))!= -1) {// 处理读取到的字节数据 (将每个字节数据都转换为char类型数据)for (int i = 0; i < bytesReadNum; i++) { //逐个输出字节数据System.out.print((char) bytes[i]);  //不换行输出 : abcdef}}} catch (IOException e) {e.printStackTrace();}}
}
//文件字节输入流的 read(byte[] b)方法 : 获得指定长度的字节,存储到字节数组中
public class FileInputStream04 {public static void main(String[] args) {try (//创建文件字节输入流对象
FileInputStream fis = new FileInputStream("D:\\file.txt")) { //里面有 abcdef//创建存储字节数组,用以存储读取的数据byte[] bytes = new byte[5];int bytesReadNum = 0;/*** 将获得的字节数组转换为“字符串”且输出*///返回值为读到的字节数,如果到字节末尾返回值为-1//输出内容为: 第一行: abcde  第二行: fgwhile ((bytesReadNum=fis.read(bytes))!= -1) {  System.out.println(new String(bytes,0,bytesReadNum)); //将字节数组转换为字符串}} catch (IOException e) {e.printStackTrace();}}
}

文件字节输入流的最终工作规范版本:

public class FileInputStream05 { //文件字节输入流-最终版(工作规范版)public static void main(String[] args) {FileInputStream fis = null;try {fis = new FileInputStream("D:\\file.txt");//准备一个byte数组byte[] bytes = new byte[5];while (true) {int readCount = fis.read(bytes);if (readCount==-1) {break;}//如果文件还未到末尾,同时输出上面获得的(字节数组转换成的)字符串//读到多少个就输出多少个,没有读到就是-1System.out.println(new String(bytes,0,readCount));}//     while ((bytesReadNum=fis.read(bytes))!= -1) {
//     System.out.println(new String(bytes,0,bytesReadNum)); //将字节数组转换为字符串
//  }} catch (FileNotFoundException e) {} catch (IOException e) {e.printStackTrace();} finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
}
  • 注意点:

    IDEA中默认的当前路径是Project的根 / 根路径。

7.1.3 available( )方法

  • 返回从输入流中可以读取 / 跳过的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞。

    例子如:

    public class FileInputStream06 {public static void main(String[] args) {FileInputStream fis = null;try {fis = new FileInputStream("D:\\file.txt"); // 其中的内容为: abcdefg (7个字符/7个字节)//读一个字节int Byte = fis.read();//从该输入流中可以读取/跳过的字节数int availableCount = fis.available();System.out.println("剩下多少个字节没读: "+availableCount); // 6} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
    }
    

7.1.4 skip(long n)方法

  • 跳过并从输入流中丢弃n个字节的数据。

    例子如:

    public class FileInputStream07 {public static void main(String[] args) { // skip()方法: 跳过几个字节不读FileInputStream fis = null;try {fis = new FileInputStream("D:\\file.txt"); // 其中的内容为: abcdefg (7个字符/7个字节)//用skip(long on)方法跳过指定的字节数fis.skip(3);//读一个字节int byte_num = fis.read();System.out.println((char) byte_num); // d (前面已跳过了三个字节)} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
    }
    

7.2 文件字节输出流 (FileOutputStream)

7.2.1 write(byte b)方法

  • 将b.length字节从指定的字节数组写入文件输出流。 (将字节数据写入到文件中)

    例子1如:在文件开始写入数据覆盖

    //在文件开始处写入数据(覆盖)
    public class FileOutputStreamTest01 { //文件字节输出流public static void main(String[] args) {try {//假设文件中有:: 123FileOutputStream fos = new FileOutputStream("D:\\file.txt"); //覆盖//创建一个byte数组byte[] bytes = {97,98,99,100,101};//用文件字节输入流进行存储fos.write(bytes); //写 abcde 到文件(硬盘)中,文件最后有: abcde} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
    }
    

    例子2如:在文件末尾写入数据追加

    public class FileOutputStreamTest01 { //文件字节输出流public static void main(String[] args) {try {//假设文件中有:: 123FileOutputStream fos = new FileOutputStream("D:\\file.txt",true); //追加//创建一个byte数组byte[] bytes = {97,98,99,100,101};String str = "世界你好!";byte[] byte_Info =str.getBytes();//用文件字节输入流进行存储fos.write(bytes); //写 abcde 到文件(硬盘)中,文件中最后有:  123abcdefos.write(byte_Info);//最后文件中的信息为: 123abcde世界你好!} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
    }
    

7.2.2 write(byte b , int off ,int len) 方法

  • 将len字节从位偏移量off的指定数组写入此文件的输出流。(将指定范围的字节写入到文件中)

    例子如:

    public class FileOutputStream02 {public static void main(String[] args) {try {FileOutputStream fos = new FileOutputStream("D:\\file.txt");//创建一个byte数组byte[] bytes = {97,98,99,100,101}; //数字分别代表: a b c d e/*用文件字节输入流进行存储将len字节从位偏移量off的指定数组写入此文件的输出流。(将指定范围的字节写入到文件中)*/fos.write(bytes,0,3); //写 abc 到文件(硬盘)中} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
    }
    

8.字符流

8.1 文件字符输入流 :FileReader

  • 文件字符输入流,只能读取普通文本,读取文本内容时,比较方便、快捷。(读取文件中的字符
  • 文件字符输入流读取文件中的字符,一个字符一个字符地读取

8.1.1 int read( ) 方法

  • 读取单个字符。返回值为 int类型数据 (代表该字符的 unicode码 ) ,如果达到文件末尾,则返回-1

    例子如:

    public class FileReader01 { //文件字符输入流 : 一个一个字符的读取public static void main(String[] args) {try {//创建文件字符输入流FileReader fr = new FileReader("D:\\file_reader.txt");int readCount = 0;//如果到达文件末尾则返回值为-1,否则返回值为字符的unicode值 (int)while ((readCount = fr.read()) != -1) { System.out.print((char)readCount);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
    }
    

8.1.2 int read( char c ) 方法

  • 返回多个字符,且将字符存入到字符数组中。返回为读取到的字符个数,如果达到文件末尾,则返回-1。

    例子如:

    public class FileReader01 {public static void main(String[] args) {FileReader fr =null;try {//创建文件字符输入流fr = new FileReader("D:\\file_reader.txt");char[] chars = new char[5];int readcount = 0;while ((readcount = fr.read(chars)) != -1) {//将获得的字符数组 转换为 字符串//读取到多少个,则输出多少个System.out.print(new String(chars,0,readcount)); }} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (fr != null) {try {fr.close();} catch (IOException e) {e.printStackTrace();}}}}
    }
    

8.2 文件字符输出流:FileWriter

8.2.1 void write( )方法

  • 向文件中写入字符数据。

    例子如:

    public class FileWriter01 {public static void main(String[] args) {try {FileWriter fw = new FileWriter("D:\\file.txt");//100, 101, 102 ,103  分别代表字符 d e f gchar[] chars = {'中', '国'};fw.write("世界你好!");fw.write(100);fw.write(chars);fw.write(chars,0,2);fw.flush(); //刷新该输出流} catch (IOException e) {e.printStackTrace();}}
    }

9.文件复制:

9.1 用文件字节输入流 + 文件字节输出流

  • 使用FileInputStream + FileOutputStream完成文件的拷贝。(一边读一边拷贝)

  • 文件字节输入流是万能的,什么类型的文件都能读取

    例子如:

    public class FileCopy {  //文件复制public static void main(String[] args)  {FileInputStream fis =null;FileOutputStream fos =null;//创建文件输入流 和 文件输出流 ,以此来进行文件复制try {fis = new FileInputStream("D:\\file1.txt"); // file1.txt中内容为: 世界你好!fos =new FileOutputStream("D:\\file2.txt");byte[] byte_Info = new byte[1024]; //存储在文件中获得的信息//从硬盘(文件)中读取文件进内存int readCount = 0;while ((readCount = fis.read(byte_Info)) != -1) {//存储获得信息进新的文件中fos.write(byte_Info); //此时 file2.txt中内容为: 世界你好!}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
    }
    

9.2 用文件字符输入流 + 文件字符输出流

  • 使用FileReader + FileWriter完成文件的拷贝。(一边读一边拷贝)

  • 使用文件字符输入流 和 文件字符输出流,只能拷贝“普通文本”文件
    (能用记事本编译的都是“普通文本”文件,不一定都是.txt文件)

    例子如:

    public class FileCopy2 { //使用字符输入流 和 字符输出流 进行文件复制public static void main(String[] args) throws IOException {FileReader fr = null;FileWriter fw = null;try {fr = new FileReader("D:\\file1.txt");fw = new FileWriter("D:\\file2.txt");char[] chars =new char[5];int readCount = 0;while ((readCount = fr.read(chars)) != -1) {//一遍读取一遍写入新的文件fw.write(chars,0,readCount);}//刷新fw.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (fr != null) {fr.close();}if (fw != null) {fw.close();}}}
    }
    

10.缓冲流:

10.1 缓冲输入流 (BufferedReader)

BufferedReader :带有缓冲区字符输入流。使用这个流不需要自定义char数组、byte数组,自带缓冲

10.1.1 String readLine( )方法

  • 读取一个文本行。通过下列字符之一即可认为某行已终止:换行 (‘\n’)、回车 (‘\r’) 或回车后直接跟着换行。

  • 如果已到达流末尾,返回值为null

  • readLine( )方法 读取一个文本行,但 不包括换行符

    例子如:

    public class BufferedReader01 { // 带有缓冲区的字符输入流public static void main(String[] args) throws IOException {/**file.txt文件的内容为: (两行数据) :世界你好!中国中国1231234helloWorld*/FileReader fr = new FileReader("D:\\file.txt"); //此时其为: 节点流BufferedReader br = new BufferedReader(fr);  //此时其为: 包装流String s = null;//读取一行数据,遇到"换行符"或"回车符" 会自定结束读取; 如果已到达流末尾,返回值为nullwhile ((s = br.readLine()) != null) {/*** 第一次循环输出: 世界你好!中国中国* 第二次循环输出: 1231234helloWorld*/System.out.println(s);}//关闭流br.close();}
    }

10.2 缓冲输出流 (BufferedWriter)

  • BufferedReader :带有缓冲区字符输出流。使用这个流不需要自定义char数组、byte数组,自带缓冲

    例子如:

    public class BufferedWriter01 { //缓冲字符流public static void main(String[] args) {//带有缓冲区的字符输出流try {BufferedWriter out = new BufferedWriter(new FileWriter("D:\\file.txt"));//开始写(将数据写入到文件中)out.write("helloWorld");out.write("\n");out.write("12345");//刷新out.flush();//关闭最外层out.close();} catch (IOException e) {e.printStackTrace();}}
    }
    

11.节点流

  • 当一个流的构造方法中需要一个流的时候,这个(作为参数)被传进来的流叫:节点流

  • 外部负责包装的流叫:包装流 / 处理流

  • 对应包装流来说,只需要关闭最外层就行,里面的节点流会自动关闭

    例子如:

    // 代码中包括了: 包装流、节点流
    public class BufferedReader01 {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("D:\\file.txt"); //FileReader :节点流BufferedReader br = new BufferedReader(fr);  //BufferedReader: 包装流String s = null;while ((s = br.readLine()) != null) {System.out.println(s);}//关闭流br.close();}
    }
    

12.包装流/处理流

  • 当一个流的构造方法中需要一个流的时候,这个(作为参数)被传进来的流叫:节点流

  • 外部负责包装的流叫:包装流 / 处理流

  • 对应包装流来说,只需要关闭最外层就行,里面的节点流会自动关闭

    例子如:

    // 代码中包括了: 包装流、节点流
    public class BufferedReader01 {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("D:\\file.txt"); //FileReader :节点流BufferedReader br = new BufferedReader(fr);  //BufferedReader: 包装流String s = null;while ((s = br.readLine()) != null) {System.out.println(s);}//关闭流br.close();}
    }
    

13.转换流

  • 转换流 :将字节流转换字符流

  • InputStreamReader : 将字节输入流 转换字符输入流

  • OutputStreamWriter :将字节输出流 转换字符输出流

    例子如:

    public class InputStreamReader01 { //public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("D:\\file.txt");//使用转换流 : 将“字节流”转换为“字符流”InputStreamReader reader = new InputStreamReader(fis);/**BufferedReader()构造方法: 参数为: Reader类对象但上面只有FileInputStream对象,可用“缓冲流”: 将“字节流”转换为“字符流”*/BufferedReader br = new BufferedReader(reader);String s = null;while ((s = br.readLine()) != null) {System.out.println(s);}//关闭流br.close();}
    }
    
    public class InputStreamReader01 {public static void main(String[] args) throws IOException {//合并BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\file.txt")));String s = null;while ((s = br.readLine()) != null) {System.out.println(s);}//关闭流br.close();}
    }
    

14.数据流

14.1 字节数据输出流 (DataOutptStream)

  • 输出数据专属的流。这个流可以将数据连同数据类型一并 写入文件
    (这个文件不是普通的文本文件,其不能用记事本打开,用记事本打开会乱码)

  • 写的文件,只能用DataInputStream ( 数据字节输入流 )去。并且的时候需要提前知道写入的顺序。的顺序和的顺序一致,才可以正常取出数据

    例子如:

    public class DataOutputStream01 { //字节数据输出流public static void main(String[] args) {try {//创建数据专属的字节输出流DataOutputStream dos =new DataOutputStream(new    	 FileOutputStream("D:\\file.txt"));byte b =100;short s =200;int i =300;float f =3.0F;long l =400;double d =3.14;boolean istrue =false;char c = 'a';//把 “数据” 连同 “数据类型” 一并写入文件当中。dos.writeByte(b);dos.writeShort(s);dos.writeInt(i);dos.writeLong(l);dos.writeFloat(f);dos.writeBoolean(istrue);dos.writeChar(c);//刷新dos.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
    }
    

14.2 字节数据输入流 (DataInptStream)

  • 用数据流写入的文件只能用DataInputStream (数据字节输入流)去。并且的时候需要提前知道写入的顺序。的顺序和的顺序一致,才可以正常取出数据

    例子如:

    public class DataInputStream01 {  //字节数据输入流public static void main(String[] args) {try {//创建字节数据输入流DataInputStream dis = new DataInputStream(new FileInputStream("D:\\file.txt"));byte b=dis.readByte();short s=dis.readShort();int i = dis.readInt();long l = dis.readLong();float f = dis.readFloat();double d = dis.readDouble();boolean istrue = dis.readBoolean();char c = dis.readChar();//打印通过“字节数据输入流”得到的数据System.out.println(b);System.out.println(s);System.out.println(i);System.out.println(l);System.out.println(f);System.out.println(d);System.out.println(istrue);System.out.println(c);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
    }
    

15.打印流

15.1 打印输出流

  • 打印输出流 (printStream) : 默认输出到控制台, 标准输出流不需要手动close( )关闭 。

  • 可修改输出方向将输出方向指向具体的文件,此时不再将信息输出到控制台。(这是日志框架的实现原理)

    例子如:

    // PrintStream : 打印输出流,默认输出到控制台
    public class PrintStream01  {public static void main(String[] args) throws FileNotFoundException {/*** PrintStream : 打印输出流,默认输出到控制台* (默认的输出方向为: 控制台)*///联合起来写System.out.println("Hello,World");//分开写//System.out的返回值为 : 打印输出流PrintStream ps = System.out;ps.println("hello,zhangsan");ps.println("hello,lisi");ps.println("hello,wangwu");/*** 修改打印输出流的 “输出方向”** 修改输出方法为: D盘下的log文件,打印数据到该文件上*///打印输出流不再指向控制台,指向“log”文件PrintStream ps2 = new PrintStream(new FileOutputStream("D:\\log"));//修改输出方向,将输出方向修改到“log”文件System.setOut(ps2); //打印输出流,不需要手动close()关闭}
    }
    

15.2 用“打印输出流” 编写 “日志工具”

  • 通过 修改输出方向将输出方向指向具体的文件,来编写“日志工具”,收集日志信息。

    例子如:

    /*** 日志工具*/
    public class Logger {/***  记录日志的方法*/public static void log(String msg) {try {//创建“打印输出流” : 指向一个日志文件PrintStream out = new PrintStream(new 	 	          				        FileOutputStream("log.txt"));//修改默认输出方法System.setOut(out);//获得当前时间Date nowTime = new Date();//格式化时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");String strTime = sdf.format(nowTime);System.out.println(strTime+": "+msg);} catch (FileNotFoundException e) {e.printStackTrace();}}
    }
    

    日志工具类的测试类 例子:

    public class LogTest {public static void main(String[] args) {//测试工具类是否好用Logger.log("hello!");Logger.log("调用了System类的gc()方法,建议启动垃圾回收");// ...}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/116239.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复杂性分析与算法设计:解锁计算机科学的奥秘

文章目录 算法复杂性分析的基本概念时间复杂度空间复杂度 常见的算法设计策略1. 分治法2. 贪心法3. 动态规划 算法设计的实际应用1. 网络路由2. 图像处理3. 人工智能 算法的选择和性能分析结论 &#x1f389;欢迎来到数据结构学习专栏~复杂性分析与算法设计&#xff1a;解锁计算…

Rust 学习笔记(持续更新中…)

一、 编译和运行是单独的两步 运行 Rust 程序之前必须先编译&#xff0c;命令为&#xff1a;rustc 源文件名 - rustc main.rs编译成功之后&#xff0c;会生成一个二进制文件 - 在 Windows 上还会生产一个 .pdb 文件 &#xff0c;里面包含调试信息Rust 是 ahead-of-time 编译的…

1688API技术解析,实现关键词搜索淘宝商品(商品详情接口等)批量获取,可高并发

要使用1688API接口采集商品详情&#xff0c;可以按照以下步骤进行&#xff1a; 获取API接口权限&#xff1a;申请1688的app key和app secret&#xff0c;并获取access_token。 编写API请求代码&#xff1a;使用Python等编程语言&#xff0c;编写API请求代码。以下是一个Python…

python爬虫—requests

一、安装 pip install requests 二、基本使用 1、基本使用 类型 &#xff1a; models.Response r.text : 获取网站源码 r.encoding &#xff1a;访问或定制编码方式 r.url &#xff1a;获取请求的 url r.content &#xff1a;响应的字节类型 r.status_code &#xff1a;响应…

【unity插件】使用BehaviorDesigner插件制作BOSS的AI行为树

文章目录 前言素材插件一、基础使用二、敌人物理攻击三、敌人面向玩家四、敌人法术攻击五、随机进行攻击六、敌人不同的阶段推荐学习视频源码完结 前言 Behavior Designer是一个行为树插件&#xff0c;是一款为了让策划&#xff0c;程序员&#xff0c;美术人员方便使用的可视化…

IDEA 设置提示信息

IDEA 设置提示信息 File->Settings->Editor->Code Completion 取消勾选 Math case

python3.11教程1:python基础语法、程序控制、函数

文章目录 一、Python简介1.1 为什么学习python1.2 python安装与配置1.3 python解释器1.4 命令行参数1.4.1 sys.argv变量1.4.2 -c和-m选项 1.5 解释器的运行环境1.5.1 编码格式1.5.2 编码声明 二、Python基础语法2.1 行结构2.2 变量&#xff08;标识符&#xff09;2.3 字节串2.4…

【实训项目】传道学习助手APP设计

1.设计摘要 跨入21世纪以来,伴随着时代的飞速发展&#xff0c;国民对教育的重视度也有了进一步的提升。我们不难发现虽然很多学习内容有学习资料或者答案&#xff0c;但是这些内容并不能达到让所有求学的人对所需知识进行完全地理解与掌握。所以我们需要进行提问与求助。那么一…

实现不同局域网间的文件共享和端口映射,使用Python自带的HTTP服务

文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用…

仿`gRPC`功能实现像调用本地方法一样调用其他服务器方法

文章目录 仿gRPC功能实现像调用本地方法一样调用其他服务器方法 简介单体架构微服务架构RPCgPRC gRPC交互逻辑服务端逻辑客户端逻辑示例图 原生实现仿gRPC框架编写客户端方法编写服务端方法综合演示 仿 gRPC功能实现像调用本地方法一样调用其他服务器方法 简介 在介绍gRPC简介…

CDL基础原理

一、CDL简介 CDL&#xff08;全称Change Data Loader&#xff09;是一个基于Kafka Connect框架的实时数据集成服务。 CDL服务能够从各种OLTP数据库中捕获数据库的Data Change事件&#xff0c;并推送到kafka&#xff0c;再由sink connector推送到大数据生态系统中。 CDL目前支…

【位运算】leetcode面试题:消失的两个数字

一.题目描述 消失的两个数字 二.思路分析 本题难度标签是困难&#xff0c;但实际上有了只出现一次的数字iii这道题的铺垫&#xff0c;本题的思路还是很容易想到的。 温馨提示&#xff1a;阅读本文前可以先查看我的【位运算】专栏的第一篇文章&#xff0c;其中包含位运算这类…

如何使用CSS实现一个响应式图片幻灯片(Responsive Image Slider)效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 响应式图片幻灯片⭐ HTML结构⭐ CSS样式⭐ JavaScript交互⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个…

视频垂直镜像播放,为您的影片带来新鲜感

大家好&#xff01;在制作视频时&#xff0c;我们常常希望能够给观众带来一些新鲜感和独特的视觉效果。而垂直镜像播放是一个能够让您的影片与众不同的技巧。然而&#xff0c;传统的视频剪辑软件往往无法直接实现视频的垂直镜像播放&#xff0c;给我们带来了一些困扰。现在&…

【算法竞赛宝典】语言之争

【算法竞赛宝典】语言之争 题目描述代码展示 题目描述 代码展示 //语言之争 #include<fstream> #include<string>using namespace std;ifstream cin("language.in"); ofstream cout("language.out");string a; int n;int main() {int i;bool …

短信验证码服务

使用的是 阿里云 阿里云官网 1.找到 左上角侧边栏 -云通信 -短信服务 2.在快速学习测试处 &#xff0c;按照步骤完成快速学习&#xff0c;绑定要测试的手机号&#xff0c;选专用 【测试模板】&#xff0c;自定义模板需要人工审核&#xff0c;要一个工作日 3.右上角 获取 Acces…

动手学深度学习(四)多层感知机

经过了多层感知机后&#xff0c;相当于将原始的特征转化成了新的特征&#xff0c;或者说提炼出更合适的特征&#xff0c;这就是隐藏层的作用。 from&#xff1a;清晰理解多层感知机和反向传播 - 知乎 一、多层感知机的从零开始实现 import torch from torch import nn from d2…

微信小程序左上角home图标的解决方法之一 层级混乱导致的home图标显示的问题 自定义左上角左侧图标的返回路径

这个项目的编辑页在tabbar上 导致跳到tabbar得使用wx.switchTab 保存后返回原来的页面就出现了左上角的home图标 本来想通过自定义home图标的跳转路径来解决这个问题 没想到居然找不到相关内容 有清楚的朋友麻烦给我留个言不胜感激 那我写一下我的骚操作 app.js globalData: {…

Kafka3.0.0版本——手动调整分区副本示例

目录 一、服务器信息二、启动zookeeper和kafka集群2.1、先启动zookeeper集群2.2、再启动kafka集群 三、手动调整分区副本3.1、手动调整分区副本的前提条件3.2、手动调整分区副本的示例需求3.3、手动调整分区副本的示例 一、服务器信息 四台服务器 原始服务器名称原始服务器ip节…

CSS 实现平面圆点绕椭圆动画

前言 &#x1f44f;CSS实现平面圆点绕椭圆动画,速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现原理 transform-style&#xff1a;CSS 属性 transform-style 设置元素的子元素是位于 3D 空间中还是平面中。如果选择平面&#xf…