前言
一直觉得java的payload里面有一块看不懂的地方,原来是我没学java io(x
流
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
字节流
以字节为单位,可以读写所有数据
字符流
以字符为单位,只可以读写文本数据,父类为
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'); } }
从标准输入读取一个字符串需要使用 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")); } }
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流
     }
}
