首页 > 编程 > Java > 正文

Java IO流

2019-11-08 02:49:16
字体:
来源:转载
供稿:网友

笔记

一、基本知识

带缓冲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 . 缓冲区(这里指的是用户进程缓冲区不是内核缓冲区)减少了对操作系统读写函数的调用,所以减少了内核态与用户态的切换


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表