• JavaWeb输入输出流


    目录

    关于内容的读写

    关于读InputStream 

    End Of Stream(EOS)

    处理文本数据(字符数据)

    文件内容中填充中文的读操作

    利用 Scanner 进行字符读取 

    关于写OutputStream

    Writer抽象类OutputStreamWriter 实现类

    利用 PrintWriter 找到我们熟悉的方法

    小结


    关于内容的读写

    关于读InputStream 

    1. 直接读取(以二进制数据的方式读取,表现在代码中 byte为单位)

    2. 文本读取

    1. java.io.InputStream        输入流

    2. 本身是一个抽象类,真正使用过程中要依赖这个抽象的具体实现子类
        FilelnputStream关于文件的输入流
    3. 抽象模型

    4.要记得关闭
    is.close()


    1. import java.io.FileInputStream;
    2. import java.io.InputStream;
    3. import java.util.Arrays;
    4. public class Demo4 {
    5. public static void main(String[] args) throws Exception {
    6. InputStream is = new FileInputStream("./hello.txt");
    7. // FileInputStream 赋值给 InputStream,是因为有继承关系
    8. // FileInputStream是InputStream的下级类
    9. // 准备水桶
    10. // 1024 代表能接 1024 滴(字节)水,我们准备好桶的容量
    11. byte[] buf = new byte[1024];
    12. // n是真正接到多少(字节)的水
    13. // n >= 0&& n < 1024
    14. int n = is.read(buf); //12
    15. System.out.println(n);
    16. // 真正的数据放在 buf 从 [0, 12)
    17. byte[] bytes = Arrays.copyOf(buf, n);
    18. for (byte b : bytes) {
    19. System.out.printf("%02x\n", b);
    20. }
    21. is.close();
    22. }
    23. }

    windows 上的换行默认是“\r\n"也写作CRLF

    如何利用InputStream进行二进制数据的直接读取

    1)一个字节

    2)一次读一批

    理解EOS (-1)

    End Of Stream(EOS)

    除了要接水之外,我们还需要一个明确的信号(说明肯定不会有新的数据了)

    End Of Stream(EOS)
    如果这次接了0滴水
    A.是暂时现在没水了?——0

    B.还是以后永远没水了?—— -1

    一次读一滴

    1. import java.io.FileInputStream;
    2. import java.io.InputStream;
    3. public class Demo5 {
    4. public static void main(String[] args) throws Exception {
    5. InputStream is = new FileInputStream("./hello.txt");
    6. while (true) {
    7. int data = is.read();
    8. if (data == -1) {
    9. // 所有数据都被读完了
    10. break;
    11. }
    12. // 否则,data 就是我们取到的数据
    13. byte b = (byte) data;
    14. System.out.printf("%02x\n", b);
    15. }
    16. is.close();
    17. }
    18. }

    一次读一桶

    1. import java.io.FileInputStream;
    2. import java.io.InputStream;
    3. public class Demo6 {
    4. public static void main(String[] args) throws Exception {
    5. InputStream is = new FileInputStream("./hello.txt");
    6. byte[] buf = new byte[5];
    7. while (true) {
    8. int n = is.read(buf);
    9. // n == 0 只是本次没数据,以后还有
    10. // n == -1 本次没数据,以后也没数据了
    11. if (n == -1) {
    12. // 代表数据全部读完
    13. break;
    14. }
    15. for (int i = 0; i < buf.length; i++) {
    16. byte b = buf[i];
    17. System.out.printf("%02x\n", b);
    18. }
    19. }
    20. is.close();
    21. }
    22. }

    处理文本数据(字符数据)

    处理文本数据(字符数据)
    ASCII、Unicode、UTF-8、GBK (GB18030、GB2312)
    字符集(char set)
    字符编码规则(char encoding)
    计算机中的数据<->数字(有范围的整数)
            图像、声音、文字->数字


    如果每个人都定义自己的字符集,实际上没有任何的意义。
    所以,总是由标准委员会来规定好一个字符集,大家一起遵守!
    所以才有各种各样的标准字符集的出现!

    文件内容中填充中文的读操作

    1. public class Demo8 {
    2. public static void main(String[] args) throws Exception {
    3. try (InputStream is = new FileInputStream("./test.txt")) {
    4. byte[] bytes = new byte[1024];
    5. int n = is.read(bytes);
    6. String s = new String(bytes, 0, n, "UTF-8");
    7. System.out.println(s);
    8. }
    9. }
    10. }

    利用 Scanner 进行字符读取 

    Scanner scanner = new Scanner(System.in);

    1. import java.io.FileInputStream;
    2. import java.io.InputStream;
    3. import java.util.Scanner;
    4. public class Demo8 {
    5. public static void main(String[] args) throws Exception {
    6. try (InputStream is = new FileInputStream("./test.txt")) {
    7. try (Scanner scanner = new Scanner(is, "UTF-8")) {
    8. while (scanner.hasNextLine()) {
    9. String line = scanner.nextLine();
    10. System.out.println("|" + line + "|");
    11. }
    12. }
    13. }
    14. }
    15. }

    关于写OutputStream

    内存的写速度远远快于硬盘的写速度。
    所以,为了平衡这个速度之差,一般通过“缓冲区buffer”来处理

    之前文件不存在,直接写入

    1. import java.io.FileOutputStream;
    2. import java.io.OutputStream;
    3. public class Demo10 {
    4. public static void main(String[] args) throws Exception {
    5. // OutputStream -> FileOutputStream
    6. // 所以很少用 file.createNewFile()
    7. // 如果文件之前不存在,则会进行创建(创建可能失败: 1. 权限、2. 路径上的目录还不存在)
    8. // 如果文件之前存在,会清空之前的文件内容,重新写入
    9. try (OutputStream os = new FileOutputStream("./out.txt")) {
    10. // 空格// 0xe6 0x88 0x91 是 "我" 的 UTF-8 编码的字节序列
    11. os.write(0xe6);
    12. os.write(0x88);
    13. os.write(0x91);
    14. // 确保把缓冲区内可能遗留的数据全部写入 Output 设备中
    15. os.flush();
    16. }
    17. }
    18. }


    之前文件存在,清空内容,重新写入

    1. import java.io.FileOutputStream;
    2. import java.io.OutputStream;
    3. public class Demo10 {
    4. public static void main(String[] args) throws Exception {
    5. // OutputStream -> FileOutputStream
    6. // 所以很少用 file.createNewFile()
    7. // 如果文件之前不存在,则会进行创建(创建可能失败: 1. 权限、2. 路径上的目录还不存在)
    8. // 如果文件之前存在,会清空之前的文件内容,重新写入
    9. try (OutputStream os = new FileOutputStream("./out.txt")) {
    10. // 空格// 0xe6 0x88 0x91 是 "我" 的 UTF-8 编码的字节序列
    11. // os.write(0xe6);
    12. // os.write(0x88);
    13. // os.write(0x91);
    14. os.write(0x20);
    15. os.write(0x0d); // '\r'
    16. os.write(0x0a); // '\n'
    17. os.write(0x65);
    18. os.write(0x65);
    19. os.write(0x65);
    20. // 确保把缓冲区内可能遗留的数据全部写入 Output 设备中
    21. os.flush();
    22. }
    23. }
    24. }


    连续写入

    1. import java.io.FileOutputStream;
    2. import java.io.OutputStream;
    3. public class Demo11 {
    4. public static void main(String[] args) throws Exception {
    5. try(OutputStream os = new FileOutputStream("./out.txt")) {
    6. byte[] buf = {0x65,0x65,0x20,0x65,0x0d,0x0a,(byte) 0xe6,(byte)0x88,(byte)0x91};
    7. // 整个 buf 的数据全部写入
    8. os.write(buf);
    9. // os.write(buf,2,4);
    10. os.flush();
    11. }
    12. }
    13. }

    Writer抽象类OutputStreamWriter 实现类

    1. import java.io.*;
    2. public class Demo12 {
    3. public static void main(String[] args) throws Exception {
    4. try (OutputStream os = new FileOutputStream("./word.txt")) {
    5. try (Writer writer = new OutputStreamWriter(os, "UTF-8")) {
    6. writer.write("你好\r\n");
    7. writer.write("哈哈");
    8. writer.flush();
    9. }
    10. }
    11. }
    12. }

    利用 PrintWriter 找到我们熟悉的方法

    PrintWriter
            printIn(...)

            print(...)

            printf(fmt, ...)

    1. import java.io.*;
    2. public class Demo12 {
    3. public static void main(String[] args) throws Exception {
    4. try (OutputStream os = new FileOutputStream("./printWriter.txt")) {
    5. try (Writer writer = new OutputStreamWriter(os, "UTF-8")) {
    6. try (PrintWriter printWriter = new PrintWriter(writer)) {
    7. printWriter.println(1+1);
    8. printWriter.print(3);
    9. printWriter.printf("%s+%d","我",10);
    10. printWriter.flush();
    11. }
    12. }
    13. }
    14. }
    15. }

    小结

    InputStream输入流,背后就是输入设备(模拟的输入设备)

    1.read() 、read(byte[])
    2.EOS(-1)
    3.Scanner(is, "UTF-8");


    OutputStream输出流,背后就是输出设备(模拟的输出设备)

    1. write(int)、write(byte[])
    2. flush()缓冲区(buffer)平衡写入次数
    3.OutputStreamWriter(做字符集编码处理) + PrintWriter(使用我们熟悉的print/println/printf)

  • 相关阅读:
    「开源系统」mybatis-plus代码生成工具(自己基于官方的封装的,打包成了maven插件的方式)
    Python第二语言(三、Python函数def)
    Redis学习(1)
    基于python的23种设计模式
    ATtiny88初体验(二):呼吸灯
    Android Termux安装MySQL,通过内网穿透实现公网远程访问
    Python3.x安装Pandas教程
    AIGC AI绘画 设计Logo指令大全
    Linux下通过bonding技术实现网络负载均衡
    1018 锤子剪刀布
  • 原文地址:https://blog.csdn.net/XHT117/article/details/125528256