Java IO学习--输入输出流
一、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学习--输入输出流的更多相关文章
- JAVA Io 缓冲输入输出流
		
java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...
 - java Io文件输入输出流 复制文件
		
package com.hp.io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...
 - 《三》Java IO 字节输入输出流
		
那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream) ...
 - Java IO学习笔记:概念与原理
		
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
 - Java IO学习笔记总结
		
Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...
 - Java IO学习笔记三
		
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
 - Java IO学习笔记二
		
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
 - 第27章 java I/O输入输出流
		
java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...
 - java IO 学习(三)
		
java IO 学习(一)给了java io 进行分类,这一章学习这些类的常用方法 一.File 1.创建一个新的File的实例: /** * 创建一个新的File实例 */ File f = new ...
 
随机推荐
- 写一个简单的shellcode
			
0x00 前言 漏洞利用中必不可缺的部分就是shellcode,不会编写shellcode和咸鱼有什么区别,跳出咸鱼第一步. 0x01 系统调用 通过系统调用execve函数返回shell C语言实现 ...
 - IP地址获取当前地理位置(省份)的接口
			
腾讯的接口是 ,返回数组 http://fw.qq.com/ipaddress 返回值 var IPData = new Array("61.135.152.194"," ...
 - sed实现路径替换
			
shell和sed忘得差不多了,现在更喜欢用python notebook,可以自动补充,所以很方便.但是记得以前用过这个的,试了几次不成功,搜了一下,这几个地方给的比较清晰,尤其是路径替换. 以下内 ...
 - logistic regression svm hinge loss
			
二类分类器svm 的loss function 是 hinge loss:L(y)=max(0,1-t*y),t=+1 or -1,是标签属性. 对线性svm,y=w*x+b,其中w为权重,b为偏置项 ...
 - 于是他错误的点名开始了(trie树)
			
题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). ...
 - dom4j里面封装方法的操作
			
animal.xml <?xml version="1.0" encoding="UTF-8"?><animal> <cat ...
 - MYSQL 版本5.7.24  sql_mode=only_full_group_by问题
			
具体出错提示: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggr ...
 - Python数值
			
一.python数值类型 python数值类型有以下四种: int(整数) float(浮点数) complex(复数) bool(布尔型) 注意:python3取消了long型. 二.python ...
 - QQ群排名优化到霸屏的策略怎么做?
			
谈起QQ群排名霸屏,首先要弄清楚概念,有些刚接触QQ群的朋友可能不太了解,所谓的QQ群排名霸屏,就是指当你的客户群体搜索QQ群某个关键词时,出现在QQ群搜索结果前面的群,全部或者大部分都是我们自己的群 ...
 - C# WebClient类上传和下载文件
			
这篇文章主要介绍了C# WebClient类用法实例,本文讲解使用WebClient下载文件.OpenWriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下 ...