笔记
一、基本知识
带缓冲IO和不带缓冲IO以及直接IO:
一般所说的带缓冲IO指标准IO,不带缓冲的IO与标准IO对应,更明确的说法似乎叫normal IO。标准IO和normal IO所指的“缓冲”位于用户进程,不论标准IO还是normal IO其内核都是有缓冲的,只有直接IO内核才没有缓冲区。
从IO中读取流程分别如下:
标准IO:IO设备->内核缓冲区->用户进程缓冲区->从用户进程缓冲区读取
normal IO:IO设备->内核缓冲区->读取
直接IO:IO设备->读取
内核缓冲区作用:系统可预读取IO设备
用户进程缓冲区:减少内核态与用户进程态的切换
二、java IO流
-
字节流:InputStream OutputStream系列
字符流:Reader Writer系列 -
InputStreamReader(InputStream)采用默认编码表,将字节流按照特定的编码方式读取 - 测试
package io流;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
public class IoStudy {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
InputStream in = new BufferedInputStream(System.in,100);
int a = in.read();
System.out.println(a);
}
}
测试控制台输入a,abc,输出都是97
输入1,12,输出都是49
查看jdk可以知道BufferedInputStream.read()读入缓冲区下一个字节
4.
控制台输入整数、字符串、数组
下面这种写法是不能正确获得控制台的int数据的。觉得因为即使在控制台输入int型数据,但控制台并不能知道输入的是什么类型数据,所以控制台输入的数据按照默认的方式(目测把控制台的输入都当作了文本)按照二进制保存在缓存区里,在缓冲区里的二进制数据就不与希望的int数据对应,而是与int对应的ASCII码值,想要获得控制台输入的int数据比较麻烦。
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(in);
int a = (int)br.read();
System.out.println(a);
}
下面这种方法比较方便:
Scanner sc = new Scanner(System.in);
System.out.println("Please Enter Name:");
String name = sc.nextLine(); //读取字符串型输入
System.out.println("Please Enter Age:");
int age = sc.nextInt(); //读取整型输入
System.out.println("Please Enter Salary:");
float salary = sc.nextFloat(); //读取float型输入
System.out.println("Name:" + name +" " + "Age:"+age + " "+"Salary:"+salary);
5.
文件、管道
读取管道流的相关API有
- 字符方式读写:
PipedWriter out = new PipedWriter();
char[] in = "in".toCharArray();
out.write(in[0]);
另个进程或线程里获得out后直接
(char)out.read();
- 字节流读写管道
PipedOutputStream out = new PipedOutputStream();
6 . 缓冲区(这里指的是用户进程缓冲区不是内核缓冲区)减少了对操作系统读写函数的调用,所以减少了内核态与用户态的切换