3.3. 缓冲流、转换流

一. BufferedRead(带有缓冲的字符输入流)

  • 带有缓冲区的字符输入流


  • 使用这些流的时候不需要自定义 char 数组,或者说不需要自定义 byte 数组,自带缓冲


1. 节点流和包装流

  • 当一个流的构造方法中需要一个流的时候,这个被传进来的流叫做:节点流


  • 外部负责包装的这个流,叫做:包装流,还有一个名字叫做:处理流


2. readline :读一行字符

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReadertest1 {
    public static void main(String[] args) throws IOException {

        //对于这个程序来说:FileReader就是一个节点流,BufferedReader就是一个包装流/处理流。
        FileReader reader = new FileReader("src/Copy01.java");
        BufferedReader br = new BufferedReader(reader);

        //读一行
        String firstLine = br.readLine();
        System.out.println(firstLine);

        String secondLine = br.readLine();
        System.out.println(secondLine);

        String thirdLine = br.readLine();
        System.out.println(thirdLine);

        String s = null;
        while((s = br.readLine()) != null){
            System.out.println(s);
        }

        //关闭流
        //对于包装流来说,只需要关闭最外层流就行,里面的节点流会自动关闭。
        br.close();
    }
}
image.png|500

二. 转换流(InputStreamReader与OutputStreamWriter)

这里只演示 InputStreamWriter 的转换流:OutputStreamWriterBufferedWrite 中演示

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;

public class BufferedReaderTest2 {
    public static void main(String[] args) throws Exception {
/*        //字节流
        FileInputStream in = new FileInputStream("");

        //通过转换流转换
        //in是节点流,reader是包装流
        InputStreamReader reader = new InputStreamReader(in);

        //这个构造方法只能传一个字符流,不能传字节流
        //reader是节点流,br是包装流
        BufferedReader br = new BufferedReader(reader);*/

        //合并
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("src/Copy01.java")));

        String line = null;
        while ((line = br.readLine()) != null){
            System.out.println(line);
        }

        //关闭最外层
        br.close();
    }
}

三. BufferedWrite:(带有缓冲的字符输出流)

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class BufferedWriteTest {
    public static void main(String[] args) throws IOException {
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("temp")));

        out.write("hello world");
        out.write("\n");
        out.write("hello kitty");
        out.flush();
        out.close();
    }
}
image.png|356

四. 数据流

1. DataOutputStream(数据字节输出流)

java.io.DataOutputStream数据专属的流

这个流可以将数据连同数据的类型一同写入文件。

注意:这个文件不是普通文本文档。(这个文档用记事本打不开)

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataOutputStreamTest {
    public static void main(String[] args) throws IOException {
        //创建数据专属的字节输出流
        DataOutputStream dos = new DataOutputStream(new FileOutputStream("data"));

        //写数据
        byte b = 100;
        short s = 200;
        int i = 300;
        long l = 400L;
        float f = 3.0F;
        double d =3.14;
        boolean sex = false;
        char c = 'a';

        //写
        dos.writeByte(b);
        dos.writeShort(s);
        dos.writeInt(i);
        dos.writeLong(l);
        dos.writeFloat(f);
        dos.writeDouble(d);
        dos.writeBoolean(sex);
        dos.writeChar(c);

        //刷新
        dos.flush();
        //关闭流
        dos.close();

    }
}

2. DataIuputStream(数据字节输入流)

DataOutputStream写的文件,只能使用DataIuputStream去读。并且读的时候你需要提前知道写入的顺序。
读的顺序需要和写的顺序一致,才可以正常取出数据。

import java.io.FileInputStream;
import java.io.DataInputStream;

public class DataInputStreamTest {
    public static void main(String[] args) throws Exception{
        DataInputStream dis = new DataInputStream(new FileInputStream("data"));

        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 sex = dis.readBoolean();
        char c = dis.readChar();

        System.out.println(b);
        System.out.println(s);
        System.out.println(i + 1000);
        System.out.println(l);
        System.out.println(f);
        System.out.println(d);
        System.out.println(sex);
        System.out.println(c);
    }
}

运行结果:

image.png|500

五. 标准输出流(PrintStream和PrintWriter)

标准输出流不需要手动close()关闭

import java.io.FileOutputStream;
import java.io.PrintStream;

public class PrintStreamTest1 {
    public static void main(String[] args) throws Exception {
        //联合起来写
        System.out.println("hello World!");

        //分开写
        PrintStream ps = System.out;
        ps.println("hello zhangsan");
        ps.println("hello lisi");
        ps.println("hello wangwu");

        //标准输出流不需要手动close()关闭
        //可以改变标准输出流的输出方式吗? 可以

        //标准输出流不再指向控制台,指向“log”文件
        PrintStream printStream = new PrintStream(new FileOutputStream("log"));
        //修改输出方向,将输出方向修改到“log”文件。
        System.setOut(printStream);
        //再输出
        System.out.println("hello world");
        System.out.println("hello kitty");
        System.out.println("hello zhangsan");
    }
}
image.png|500

image.png|500

六. 日志工具

日志工具logger类:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;

public class logger {
    /*
    日志工具
     */
    public static void log(String msg){
        try {
            //指向一个日志文件
            PrintStream out = new PrintStream(new FileOutputStream("log.txt",true));
            //改变输出方向
            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 logerTest {
    public static void main(String[] args) {
        //测试日志工具
        logger.log("我非常喜欢这个记录日志的工具哦!");
    }
}

第二次运行

public class logerTest {
    public static void main(String[] args) {
        //测试日志工具
        logger.log("第二次哦");
        logger.log("调用了System类的gc方法,建议启动垃圾回收");
        logger.log("调用了UserService的doSome方法");
        logger.log("用户尝试进行登录,验证失败");
        logger.log("我非常喜欢这个记录日志的工具哦!");
    }
}
image.png|500

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇