前言
一直觉得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流
}
}