一、Java IO的定义

I/O:输入输出系统,由输入输出控制系统和外围设备两部分组成。

Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。java类库中的I/O类分为输入和输出两部分。

Java IO模型 :Java的IO模型设计是非常典型的装饰器模式---Decorator模式,按功能划分Stream,可以动态装配这些Stream,以便获得您需要的功能。例如,需要一个具有缓冲的文件输入流,则应当组合使用FileInputStream和BufferedInputStream。

二、流的分类

1.按流的方向分类

  按流的方向分为:输入和输出流,注意输入流和输出流是相对于程序而言的。输入流即从不同数据源输入进程序或者说内存。输出流则相反。

  输入流的数据源包括:字节数组、String对象、文件、管道、一个由其他种类的流组成的序列、其他数据源,如intenet连接等。

2.按传输单位分类

  按传输单位分为:字节流和字符流,例如:InputStream和OutStream、Reader和Writer。

输入/输出

字节流

字符流

输入流

Inputstream

Reader

输出流

OutputStream

Writer

3.按功能分类

  按功能分为:节点流和处理流,节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader。处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。

三、Java IO 流的整体架构图

从网上找到一张关于java IO流的整体架构图,一目了然。

四、输入输出字节流

 public class FileStreamDemo {

     public static void main(String[] args) {

         //字节输入/输出流,并且以文件为数据源,即文件字节输入输出流
try {
//1.确定数据源与流类型
File targetFile = new File("E:\\a.txt");
OutputStream os = new FileOutputStream(targetFile, true);//第二参数,表示写入的数据是否追加到文件后面
//2.借助流进行具体的IO操作
/**
* void write(int b):把一个字节写入到文件中
* void write(byte[] b):把数组b 中的所有字节写入到文件中
* void write(byte[] b,int off,int len):把数组b 中的从 off 索引开始的 len 个字节写入到文件中
*/
os.write(45);
os.write("aaa".getBytes());
os.write("bbbbb".getBytes(), 1, 3);
//操作完毕,关闭流
os.close(); //通过字节输入流将目标文件的数据读取进内存中
InputStream is = new FileInputStream(targetFile); //读取一个字节
int data1 = is.read();
System.out.println((char)data1); byte [] bytes = new byte[10];
is.read(bytes);
System.out.println(Arrays.toString(bytes)); is.close(); } catch (Exception e) {
e.printStackTrace();
} } }

结果输出:

-
[97, 97, 97, 98, 98, 98, 0, 0, 0, 0]

五、输入输出字符流

Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。一般可以用记事本打开的文件,我们可以看到内容不乱码的。就是文本文件,可以使用字符流。而操作二进制文件(比如图片、音频、视频)必须使用字节流。

 public class FileStreamDemo2 {

     public static void main(String[] args) {
//1.定义数据源对象
File targetFile = new File("E:\\test.txt");
try {
//2.定义输出字符流
FileWriter fw = new FileWriter(targetFile,true);
//3.借助字符流进行IO操作
fw.write(65);
fw.write("lplp");
fw.write(new char[]{'a','b','c'}, 1, 2);
fw.close(); FileReader fr = new FileReader(targetFile);
char [] ch= new char[5];
System.out.println(fr.read());
int count = fr.read(ch);//读取流中字符填充到字符数组ch中
System.out.println(count+":"+Arrays.toString(ch));
fr.close();
} catch (Exception e) {
e.printStackTrace();
}
} }

结果输出:

65
5:[l, p, l, p, b]

六、包装流的使用

包装流,又称处理流,主要用来对已存在的流进行修饰和封装,进一步丰富或拓展流的功能。常用的处理流主要有下面几种

1.缓冲流

  缓冲流:是一个包装流,目的是缓存作用,加快读取和写入数据的速度。

  字节缓冲流:BufferedInputStream、BufferedOutputStream

  字符缓冲流:BufferedReader、BufferedWriter

 public class BufferStreamDemo {

     public static void main(String[] args) {

         //1.定义数据源对象
File targetFile = new File("E:\\test2.txt"); try {
//2.定义字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile));
/*
*通过缓冲流将字节数组写入到文件输出流,最终是写入到文件,与通过文件字节输出流的区别在于,具备一个缓冲的作用,并不会立即将字节数组或者字节
* 写入到文件中,而先将字节写入到缓冲字节数组中,最后一次性写入到输出流中,避免多次操流,减少IO操作,提高效率,写到内存中比写到硬盘上快的多
*/
bos.write("aaa".getBytes());
bos.write(100);
bos.write("sdjlksdjkl".getBytes(), 1, 5); bos.flush();//将缓冲字节数组的字节写入文件
bos.close();
//3.定义字节缓冲输入流,本质上也是较少IO操作
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(targetFile)); System.out.println((char)bis.read());
byte [] bs = new byte[8];
bis.read(bs);
System.out.println(Arrays.toString(bs));
System.out.println(new String(bs)); bis.close();
} catch (Exception e) {
e.printStackTrace();
} } }

结果输出:

a
[97, 97, 100, 100, 106, 108, 107, 115]
aaddjlks

字符缓冲流,BufferedReader和BufferedWriter的使用和上面异曲同工。

2.转换流

InputStreamReader:把字节输入流转换为字符输入流

OutputStreamWriter:把字节输出流转换为字符输出流

 public class BufferStreamDemo2 {

     public static void main(String[] args) {

         //1.定义数据源对象
File targetFile = new File("E:\\test2.txt"); try {
//定义缓冲字符流,将字节输出流转换为字符流,再包装为字符输出缓冲流,并且字符在转字节的时候,采用的编码为UTF-8
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(targetFile),"UTF-8"));
bw.write("aaabababcc");
bw.flush();
bw.close();
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(targetFile)));
String line = br.readLine();//读取文件中的一行
System.out.println(line);
br.close(); } catch (Exception e) {
e.printStackTrace();
} } }

结果输出:

aaabababcc

3.内存流

字节内存流:ByteArrayOutputStream 、ByteArrayInputStream

字符内存流:CharArrayReader、CharArrayWriter

字符串流:StringReader,StringWriter(把数据临时存储到字符串中)

 public class ArrayStreamDemo {

     public static void main(String[] args) {
//1.字节内存流,数据源为字节数组
ByteArrayInputStream bais = new ByteArrayInputStream("aaa".getBytes());
//2通过字节流从字节数组从读取字节
int len =-1;
while((len=bais.read())!=-1){
System.out.println((char)len);
}
//3.定义字节数组输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream(5);//10表示指定字节数组的大小
try {
baos.write("abcdef".getBytes()); System.out.println(Arrays.toString(baos.toByteArray()));
System.out.println("--------------");
//4.定义字符数组输出流
CharArrayWriter caw = new CharArrayWriter();
caw.write("ppll");
System.out.println(new String(caw.toCharArray()));
//5.定义字符数组输入流
CharArrayReader car = new CharArrayReader(caw.toCharArray());//从字符数组中读取字符
int len2 =-1;
while((len2=car.read())!=-1){
System.out.print((char)len2);
}
System.out.println();
System.out.println("--------------");
//7.字符串输入流
StringReader sr = new StringReader("aaaa");
//8.字符串输出流
StringWriter sw = new StringWriter();
int len3=-1;
while((len3=sr.read())!=-1){
sw.write(len3);
}
System.out.println(sw.getBuffer().toString()); } catch (Exception e) {
e.printStackTrace();
} } }

输出结果:

a
a
a
[97, 98, 99, 100, 101, 102]
--------------
ppll
ppll
--------------
aaaa

Java IO学习--输入输出流的更多相关文章

  1. JAVA Io 缓冲输入输出流

    java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...

  2. java Io文件输入输出流 复制文件

    package com.hp.io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...

  3. 《三》Java IO 字节输入输出流

    那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream)     ...

  4. Java IO学习笔记:概念与原理

    Java IO学习笔记:概念与原理   一.概念   Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...

  5. Java IO学习笔记总结

    Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  8. 第27章 java I/O输入输出流

    java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...

  9. java IO 学习(三)

    java IO 学习(一)给了java io 进行分类,这一章学习这些类的常用方法 一.File 1.创建一个新的File的实例: /** * 创建一个新的File实例 */ File f = new ...

随机推荐

  1. 【洛谷P2577】[ZJOI2005]午餐

    午餐 题目链接 DP题都辣么毒瘤的么.. 首先,看一下题解 我们就有了思路: 贪心:显然,让吃饭慢的先打饭,sort一遍(证明?不存在的.. DP:f[i][j][k]表示前i个人,窗口1的打饭时间为 ...

  2. Android学习笔记_67_Android MyCrashHandler 中异常处理 UncaughtExceptionHandler

    1.程序中故意抛出异常: public class ExceptionActivity extends Activity { String str; @Override public void onC ...

  3. SQL Error: 1064, SQLState: 42000 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version

    -- ::, WARN [org.hibernate.util.JDBCExceptionReporter:] - SQL Error: , SQLState: -- ::, ERROR [org.h ...

  4. 用java语言编写的简单二叉树

    package com.cjonline.foundation.evisa; public class TestTree { private int data=-1; private TestTree ...

  5. HDU 1180 诡异的楼梯(超级经典的bfs之一,需多回顾)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1180 诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)     ...

  6. C# 通过socket实现UDP 通信

    UDP不属于面向连接的通信,在选择使用协议的时候,选择UDP必须要谨慎.在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重.但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小, ...

  7. golang-Tag

    Tag 理解 Golang中可以对struct定义Tag 例如: type TestTag struct{ UserName string `json:"name"` Age In ...

  8. iOS:GCD理解1(串行-并行、同步-异步)

    1.获取并行.创建串行 队列 1-1).获取 并行(全局) 队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t global_qu ...

  9. QString, Std::string, char *相互转换

    Qt 库中对字符串类型进行了封装,QString 类提供了所有字符串操作方法,给开发带来了便利. 由于第三方库的类型基本上都是标准的类型,即使用std::string或char *来表示字符 (串) ...

  10. Mit6.824 Lab1-MapReduce

    前言 Mit6.824 是我在学习一些分布式系统方面的知识的时候偶然看到的,然后就开始尝试跟课.不得不说,国外的课程难度是真的大,一周的时间居然要学一门 Go 语言,然后还要读论文,进而做MapRed ...