目录

  1. 1. 前言
  2. 2. 流
    1. 2.1. 字节流
    2. 2.2. 对象流
    3. 2.3. 转换流
  3. 3. BufferedReader读取控制台输入
  4. 4. 字节流读写文件
    1. 4.1. FileInputStream
    2. 4.2. FileOutputStream
    3. 4.3. BufferedInputStream
    4. 4.4. BufferedOutputStream
↑

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

Java IO

2023/9/27 DevOps Java
  |     |   总文章阅读量:次

前言

一直觉得java的payload里面有一块看不懂的地方,原来是我没学java io(x

参考Boogipop的博客

菜鸟教程


流

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

  • 字节流

    以字节为单位,可以读写所有数据

  • 字符流

    以字符为单位,只可以读写文本数据,父类为Reader和Writer

如果按功能划分:

  • 节点流

    具有实际传输数据的读写功能

  • 过滤流

    在节点流基础之上增加功能

字节流

字节流的父类:

  • InputStream:字节输入流
  • OutputStream:字节输出流

对象流

对象流分为ObjectOutputStream和ObjectInputStream

其中ObjectOutputStream.writeObj()方法称为序列化,ObjectInputStream.readObj()方法称为反序列化


转换流

InputStreamReader和OutputStreamWriter

  • 可将字节流变为转换流
  • 可设置字符的编码方式

BufferedReader读取控制台输入

基本语法

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

BufferedReader 对象创建后,我们便可以使用 read()方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串

  • 从 BufferedReader 对象读取一个字符要使用 read() 方法

    demo:

    //使用 BufferedReader 在控制台读取字符
     
    import java.io.*;
     
    public class BRRead {
        public static void main(String[] args) throws IOException {
            char c;
            // 使用 System.in 创建 BufferedReader
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("输入字符, 按下 'q' 键退出。");
            // 读取字符
            do {
                c = (char) br.read();
                System.out.print(c);
            } while (c != 'q');
        }
    }

    image-20230927192315429

  • 从标准输入读取一个字符串需要使用 BufferedReader 的 readLine() 方法

    demo:

    //使用 BufferedReader 在控制台读取字符串
    import java.io.*;
     
    public class BRReadLines {
        public static void main(String[] args) throws IOException {
            // 使用 System.in 创建 BufferedReader
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String str;
            System.out.println("Enter lines of text.");
            System.out.println("Enter 'end' to quit.");
            do {
                str = br.readLine();
                System.out.println(str);
            } while (!str.equals("end"));
        }
    }

    image-20230927194422945

JDK 5 后的版本我们也可以使用 Java Scanner 类来获取控制台的输入

next()函数

import java.util.Scanner; 
 
public class ScannerDemo {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 从键盘接收数据
 
        // next方式接收字符串
        System.out.println("next方式接收:");
        // 判断是否还有输入
        if (scan.hasNext()) {
            String str1 = scan.next();
            System.out.println("输入的数据为:" + str1);
        }
        scan.close();
    }
}

nextline()函数

import java.util.Scanner;
 
public class ScannerDemo {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 从键盘接收数据
 
        // nextLine方式接收字符串
        System.out.println("nextLine方式接收:");
        // 判断是否还有输入
        if (scan.hasNextLine()) {
            String str2 = scan.nextLine();
            System.out.println("输入的数据为:" + str2);
        }
        scan.close();
    }
}

区别:

next()

  • 1、一定要读取到有效字符后才可以结束输入。
  • 2、对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
  • 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  • next() 不能得到带有空格的字符串。

nextLine()

  • 1、以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
  • 2、可以获得空白。

字节流读写文件

FileInputStream

该流用于从文件读取数据

InputStream f = new FileInputStream("C:/java/hello");

FileOutputStream

该类用来创建一个文件并向文件中写数据

OutputStream f = new FileOutputStream("C:/java/hello")

BufferedInputStream

  • 提高IO效率,减少访问磁盘次数
  • 数据储存在缓冲区中,flush是将缓冲区的内容写入文件

顾名思义也就是给你设置一个缓冲区,让你读取文件的时候把内容先读取到缓冲区中,实际上也就是上述Fileinputstream例子中说的byte数组

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class BI {
    public static void main(String[] args) throws IOException {
          FileInputStream in=new FileInputStream("test.txt");
          BufferedInputStream bif=new BufferedInputStream(in);
          int data=0;
          while((data=bif.read())!=-1){
               System.out.print((char)data);
          }
          bif.close(); //会自动关闭in流
     }
}

image-20230927204211344


BufferedOutputStream