目录

  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 Basic Java
  |     |   总文章阅读量:

前言

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

参考Boogipop的博客

菜鸟教程


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

  • 字节流

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

  • 字符流

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

如果按功能划分:

  • 节点流

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

  • 过滤流

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

字节流

字节流的父类:

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

对象流

对象流分为ObjectOutputStreamObjectInputStream

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


转换流

InputStreamReaderOutputStreamWriter

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

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