Java基础——IO
一、概述
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的更多相关文章
- Java基础IO流(二)字节流小案例
JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...
- Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)
Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...
- Java基础-IO流对象之随机访问文件(RandomAccessFile)
Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...
- Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)
Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- Java基础-IO流对象之打印流(PrintStream与PrintWriter)
Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...
- Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...
- java基础-IO流对象之Properties集合
java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...
- Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...
- Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)
Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...
随机推荐
- session和cookie的介绍
1.将cookie,session之前,还是先说说http协议 http协议是基于TCP/UDP之上的应用层一个标准 请求,响应的模式.是你必须先请求到一个服务端之后,服务端才会响应到你.他是不会无缘 ...
- v-if和v-show的区别以及callback回调函数的体会
今天总结一下最近一周碰到的一些问题 一.v-if和v-show的区别 v-show用的是css属性中的display="block/none",元素被隐藏了但是节点还在页面中,但是 ...
- poj 3694 Network : o(n) tarjan + O(n) lca + O(m) 维护 总复杂度 O(m*q)
/** problem: http://poj.org/problem?id=3694 问每加一条边后剩下多少桥 因为是无向图,所以使用tarjan缩点后会成一棵树并维护pre数组 在树上连一条边(a ...
- 【杂题总汇】AGC027 C - ABland Yard
◆AGC027◆C - ABland Yard 终于知道为什么比赛的时候这么多人做C题了…… +传送门+(这是beta版的) ◇ 题目(自己翻译的,不要在意细节……) P.S. (@ 2018-9-2 ...
- 微信小程序bindtap与catchtap的区别
1.什么是事件 (1) 事件是视图层到逻辑层的通讯方式. (2) 事件可以将用户的行为反馈到逻辑层进行处理. (3) 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数. (4) ...
- 【Linux】wget: command not found的两种解决方法
1.rpm 安装 下载wget的RPM包: http://mirrors.163.com/centos/6.8/os/x86_64/Packages/wget-1.12-8.el6.x86_64.rp ...
- nginx 安装目录详解
rpm -ql nginx 路径 类型 介绍 /etc/logrotate.d/nginx 配置文件 Nginx 日志轮转,用于logrotate服务日志切割 /etc/nginx /etc/ng ...
- 【ppp-chap,pap,mp,mp-group】
PPP链路端口验证(单){ PAP(明文): 主验证方: {local-user user_name:配置本地用户; password {simple||cipher}:配置验证密码; service ...
- 自己动手编写 Dockerfile 构建自定义的Jenkins
1.构建jenkins 镜像 vim Dockerfile FROM jenkins USER root ARG dockerGid=999 RUN echo "docker:x:${d ...
- 004---基于TCP的套接字
基于TCP的套接字 tcp是基于链接的,必须先启动服务端,然后再启动客户端去连接服务端. 之前实现的简单套接字就是基于TCP的,但是只能实现收发消息一次.服务器与客户端都断开了.不够过瘾. 通信循环版 ...