Java IO流

1 篇文章 0 订阅

笔记

一、基本知识

带缓冲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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值