Java IO流

来源:互联网 发布:mac如何查看qq群文件 编辑:程序博客网 时间:2024/06/16 10:07

笔记

一、基本知识

带缓冲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流


  1. 字节流:InputStream OutputStream系列
    字符流:Reader Writer系列

  2. InputStreamReader(InputStream)采用默认编码表,将字节流按照特定的编码方式读取
  3. 测试
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 . 缓冲区(这里指的是用户进程缓冲区不是内核缓冲区)减少了对操作系统读写函数的调用,所以减少了内核态与用户态的切换

0 0