IO

Java IO 流使用了一种装饰器设计模式,它将 IO 流分成底层节点流和上层处理流,其中节点流用于和物理节点直接关联,程序可以把不同物理节点流包装成统一的处理流,从而允许程序使用统一的输入、输出代码来读取不同物理节点的资源。

流的分类

输入流和输出流

输入、输出涉及一个方向的问题,这里的输入、输出都是从程序运行所在的内存的角度来划分的。

  • 输入流:程序只能从输入流中读取数据

  • 输出流:程序只能向输出流中写入数据

输入流主要由 InputStream 和 Reader 作为基类,输出流主要由 OutputStream 和 Writer 作为基类。它们都是抽象基类。

字节流和字符流

字节流主要由 InputStream 和 OutputStream 作为基类,字符流主要由 Reader 和 Writer 作为基类。

节点流和处理流

使用节点流进行输入、输出时,程序直接连接到实际的数据源,和实际的输入、输出节点连接。

处理流用于对一个已经存在的流进行连接或封装,通过封装后的流实现数据读写功能。

流的概念模型

输入流模型图

输入流使用隐式的记录指针来表示当前程序从哪个“水滴”开始读取,每当程序读取出一个或多个“水滴”后,指针自动向后移动。当然也可以控制指针的移动。

输出流模型图

当执行输出时,程序依次把“水滴”放入到输出流的水管中。输出流同样使用隐式的指针来标志当前水滴即将放入的位置,每当程序向输出流写入一个“水滴”后,指针自动向后移动。

使用节点流

字符输入流

import java.io.FileReader;
import java.io.IOException;

public class FileReaderTest {
    public static void main(String[] args) {
        try (
                FileReader fr = new FileReader("FileReaderTest.java")
        ) {
            char[] cbuf = new char[32];
            int hasRead = 0;
            // 循环从输入流中取出数据,直到返回 -1,表明输入流的结束点
            while ((hasRead = fr.read(cbuf)) > 0) {
                // 将字符数组转换成字符串输出
                System.out.println(new String(cbuf, 0, hasRead));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

字符输出流

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamTest {
    public static void main(String[] args) throws IOException {
        try (
                FileInputStream fis = new FileInputStream("FileOutputStreamTest.java");
                FileOutputStream fos = new FileOutputStream("newFile.txt")
                )
        {
            byte[] bbuf = new byte[32];
            int hasRead = 0;
            // 循环从输入流中取出数据,直到返回 -1,表明输入流的结束点
            while ((hasRead = fis.read(bbuf)) > 0) {
                // 每读取一次,即写入文件输出流,读了多少,就写多少
                fos.write(bbuf, 0, hasRead);
            }
        }
    }
}

使用处理流

处理流包装节点流,程序通过处理流执行输入输出功能,让节点流与底层设备直接交互。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

public class PrintStreamTest {
    public static void main(String[] args) throws IOException {
        try (
                FileOutputStream fos = new FileOutputStream("test.txt");
                PrintStream ps = new PrintStream(fos)
                )
        {
            ps.println("普通字符串");
            ps.println(new PrintStreamTest());
        }
    }
}

欢迎关注我的公众号

Java 基础篇之IO的更多相关文章

  1. 图学java基础篇之IO

    java io体系 如图可以看出,java的io按照包来划分的话可以分为三大块:io.nio.aio,但是从使用角度来看,这三块其实揉杂在一起的,下边我们先来概述下这三块: io:主要包含字符流和字节 ...

  2. java基础篇---I/O技术

    java基础篇---I/O技术   对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...

  3. java基础篇---HTTP协议

    java基础篇---HTTP协议   HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...

  4. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  5. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

  6. Java基础篇(JVM)——类加载机制

    这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...

  7. 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇

    Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...

  8. Java基础篇 - 强引用、弱引用、软引用和虚引用

    Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...

  9. java基础篇 之 构造器内部的多态行为

    java基础篇 之 构造器内部的多态行为 ​ 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...

随机推荐

  1. struts2编写表单提交简单的(2)

    实体 package com.oak.entity; public class User {private int id;private String username;private String ...

  2. 一文学会redis从零到入门

    本文参照视屏学习整理:https://www.bilibili.com/video/av16841549/?p=9 相关软件.资料: 基本条件:有虚拟机或相关linux系统,熟悉基本linux操作 本 ...

  3. javascript内置对象:Date

    JavaScript内置函数:Date时间<script>    var today=new Date();    weeks=["日","一",& ...

  4. Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...

  5. 2018CCPC桂林站JStone Game

    题目描述 Alice and Bob are always playing game! The game today is about taking out stone from the stone ...

  6. Tomcat怎么关闭日志输出

    tomcat中禁用catalina.out的输出,又可能很大. 1.直接修改catalina.sh文件的输出语句. 在文件中找到以下内容. if [ -z "$CATALINA_OUT&qu ...

  7. ETL测试场景和测试用例设计

    前段时间做了些数据测试相关的工作,找了些相关方面的资料,也跟一些一线厂的同学聊了下数据测试方面的东西,然后在团队内部形成了一个初级的数据测试的规范流程以及测试需要进行的场景设计和测试用例设计的方案. ...

  8. Python数据抓取(2) —简单网络爬虫的撰写

    (一)使用Requests存储网页 Requests 是什么?网络资源(URLs)抓取套件 优点? 改善urllib2的缺点,让使用者以最简单的方式获取网络资源 可以使用REST操作(POST,PUT ...

  9. python控制窗口移动(轨迹为圆)

    需先打开一个无标题记事本, import win32con import win32gui import time import math notepad = win32gui.FindWindow( ...

  10. Linux查看进程的启动路径——pwdx

    想要找到transfer的启动路径. 一般是ps -ef | grep keyward 但是这个刚好是没有用绝对路径执行. 再用pwdx  pid获得