一、概述

I/O,Input/Output输入输出。输入机制比如读取文件数据、用户键盘输入等,输出,比如将数据输出到磁盘等。

Java的IO是以流(Stream)为基础的。

流的叫法十分形象,你可以想象数据在被读取或写入时动态的状态。

如果把输入(出)设备当成一个管道,那么流就是这个管道中的information信息或数据。

二、体系

IO体系结构大致如上图所示,流式部分是基础也是重点。

三、分类

java中存在各式各样的流,按照不同的分类角度,先做个大致的了解。

依据 内容
流向 输入流、输出流
数据单元 字节流、字符流
角色 节点流、处理流

1、流向

输入流:只读不写

输出流:只写不读

从程序运行所在内存的角度来理解“方向”:

1)输出

2)输入

2、数据单元

字节、字符流的用法几乎完全一样,最大的区别就在于前者操作的是8位的字节,而后者是16位的字符。

字节流的基类是InputStream、OutputStream,字符流是Reader和Writer。

下面通过InputStream和Reader看一下,操作十分类似,核心方法read()也只是参数类型不同,一个byte,一个char。同样输出流也是如此。

public abstract class InputStream implements Closeable {
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
......
} public abstract class Reader implements Readable, Closeable {
public int read(char cbuf[]) throws IOException {
return read(cbuf, 0, cbuf.length);
}
}

字符/节的输出

前面提到InputStream、Reader等都是抽象基类,因此例子中使用的实现类FileReader或FileInputStream。

public static void main(String[] args) {
try { //字符流
FileReader fis=new FileReader("G:/TGB/Demo/TaotaoResult.java");
char[] biff=new char[32]; //字节流
/*FileInputStream fis=new FileInputStream("G:/TGB/Demo/TaotaoResult.java");*/
/*byte[] biff=new byte[1024];*/ int hasRead=0; //重复读取
while((hasRead=fis.read(biff))>0){
System.out.println(new String(biff,0,hasRead));
}
//关闭文件流
fis.close();
} catch (IOException e) { e.printStackTrace();
}
}

执行后,在Console中输出“G:/TGB/Demo/TaotaoResult.java”中的代码内容。

字符/节的输入

与输出相比,输入就比较容易了,不会涉及大量的循环读取。

FileWriter fw;
try {
fw = new FileWriter("G:/TGB/Demo/1.txt");
fw.write("你好");
fw.write("hi");
fw.write("hello");
} catch (IOException e) { e.printStackTrace();
}

运行程序后,会在制定路径下生成1.txt文件,内容即给定的信息。

3、角色

节点流是与特定节点(如内存、设备等)读写数据,又称低级流。相应的,处理流是对一个已经存在的流进行连接或封装,高级流。

处理流包装节点流是一种装饰模式的体现,更封装更加方便,因此也称为包装流。

以InputStreamReader为例,来介绍处理流的使用。

public static void main(String[] args) {
try {
//将System.in转换成Reader
InputStreamReader reader=new InputStreamReader(System.in);
//包装成BufferedReader,缓冲
BufferedReader br=new BufferedReader(reader);
String line=null;
//只有输入exit时,程序退出
while((line=br.readLine())!=null){
if(line.equals("exit")){
System.exit(1);;
}
System.out.println("输出:"+line);
}
} catch (Exception e) { }
}

System.in是java的标准输入流,即键盘输入。他是InputStream的实例,不方便使用。首先InputStreamReader将输入的文本内容转换为字符输入流,还可以包装一层缓冲,利于读取。

小结

本篇博客介绍了Java IO的基本概念和操作,下篇博客继续介绍IO中的重要内容:序列化和NIO。

Java基础——IO的更多相关文章

  1. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  2. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)

    Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...

  3. Java基础-IO流对象之随机访问文件(RandomAccessFile)

    Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...

  4. Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)

    Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...

  5. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  6. Java基础-IO流对象之打印流(PrintStream与PrintWriter)

    Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...

  7. Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)

    Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...

  8. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

  9. Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)

    Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...

  10. Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)

    Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...

随机推荐

  1. c# Hash一致算法负载均衡(KetamaHash)项目升级

    其实就是我最近写的一个项目,采用Hash一致满足负载均衡.Hash一致环带虚拟节点. 在前面的博文中说明了我采用的方法,MurmurHash+红黑树(底层其实是sortedlist).经过多次测试结合 ...

  2. Redis高可用复制集群实现

    redis简单介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis 与其他 key - value 缓存产品有以下三个特点: 支持数据的持久化,可以将 ...

  3. 14.2 multiprocessing--多线程

    本模块提供了多进程进行共同协同工作的功能.由于Python存在GIL锁,对于多线程来说,这只是部分代码可以使用多CPU的优势,对于想全部使用多CPU的性能,让每一个任务都充分地使用CPU,那么使用多进 ...

  4. javascript中几种this指向问题

    javascript中几种this指向问题   首先必须要说的是,this 永远指向函数运行时所在的对象,而不是函数被创建时所在的对象. (1).作为函数名调用   函数作为全局对象调用,this指向 ...

  5. js-scroll判断页面是向上滚动还是向下滚动

    原理:那当前的scrollTop和之前的scrollTop对比 如果变大了,表示向下滚动(scrollTop值变大): 如果变小了,表示向上滚动(scrollTop值变小). 方法一:js代码: $( ...

  6. I/O流、序列化

    1)流序列化对象ObjectOutputStream调用writerObject写出序列化对象,ObjectInputStream调用readObject读取序列化对象,序列化的对象必须要实现Seri ...

  7. struts2学习

    struts2是一种基于mvc模式的轻量级web框架,它本质上相当于一个servlet,在mvc设计模式中,struts2作为控制器(Controller)来建立模型与视图的数据交互,struts2采 ...

  8. 【转】mybatis调用mssql有输入输出参数那种..

    吐槽下,百度的搜索能力真心垃圾(有可能是我没想好关键词的缘故吧..)... 谷歌中国程序员呼唤你... 这面这边文章是别人的,感觉不错,转过来. http://lohasle.iteye.com/bl ...

  9. python2.7入门---file(文件)&OS 文件&目录方法

        首先file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 序号 方法及描述 1 file.close() 关闭文件.关闭后文件不能再进行读写操作. 2 file.f ...

  10. responsive grid

    http://csswizardry.com/csswizardry-grids/ http://unsemantic.com/demo-responsive http://getbootstrap. ...