Java 的 IO 流
接着上一篇的 “Java 的 File 类” 的随笔,在File类的基础上,我们就走进Java的IO流吧。
流的概念和作用
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
流的分类:
(1)、按照数据流向的不同分为:输入流(从磁盘、网络等读取到内存,只能读,不能写)、输出流(从内存写出到磁盘、网络,只能写,不能读)
(2)、按照处理数据的单位不同分为:字节流(以字节为基本操作单位)、字符流(以字符为基本操作单位)
(3)、按照角色的不同分为:节点流(向某个IO设备/节点(磁盘文件、网络等)直接读写数据,也称为低级流)、处理流(用于包装一个已存在的流,通过这个已存在的流来进行读写操作,并不直接操作IO节点,也称为高级流、包装流)
Java流类结构:
分类 |
字节输入流 |
字节输出流 |
字符输入流 |
字符输出流 |
抽象基类 |
InputStream |
OutputStream |
Reader |
Writer |
操作文件 |
FileInputStream |
FileOutputStream |
FileReader |
FileWriter |
操作数组 |
ByteArrayInputStream |
ByteArrayOutputStream |
CharArrayReader |
CharArrayWriter |
操作字符串 |
StringReader |
StringWriter |
||
缓冲流 |
BufferedInputStream |
BufferedOutputStream |
BufferedReader |
BufferedWriter |
转换流 |
InputStreamReader |
OutputStreamWriter |
||
对象流(用于序列化) |
ObjectInputStream |
ObjectOutputStream |
||
抽象基类(用于过滤) |
FilterInputStream |
FilterOutputStream |
FilterReader |
FilterWriter |
打印流(输出功能极其大) |
PrintStream |
PrintWriter |
java的IO流的用法
InputStream是字节输入流的顶级父类,常用方法:
- int read() //读取一个字节,返回该字节数据的Unicode码值
- int read(byte[] buff) //最多读取buff.length个字节,将读取的数据放在buff数组中,返回实际读取的字节数
- int read(byte[] buff, int off, int length) //最多读取length个字节,放在buff数组中,从数组的off位置开始放置数据,返回实际读取的字节数。off一般设置为0,length一般设置为buff的长度。
//1、创建一个File类的对象File file = new File("hello.txt");//2、创建一个FileInputStream类的对象FileInputStream fis = new FileInputStream(file);//3、调用FileInputStream的方法,实现file文件的读取int b = fis.read();while(b != -1){System.out.print((char)b+" ");b = fis.read();}fis.close();
OutputStream是字节输出流的顶级父类,常用方法:
- void write(int i) \\输出一个字节,i是码值,即read()得到的码值,输出i对应的字节
- void write(byte[] buff) //输出整个字节数组的内容
- void write(byte[] buff, int off, int length) //把字节数组从off位置开始,输出长度为length字节的内容
File file = new File("hello1.txt");FileOutputStream fos = null;try{fos = new FileOutputStream(file);fos.write(new String("\nI Love CYT!").getBytes());}catch(Exception e){e.printStackTrace();}finally{if(fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}}
Reader时字符输入流的顶级父类,常用方法:
- int read() //读取一个字符,返回该字符的Unicode码值,注意并不是返回该字符。
- int read(char[] buff) //最多读取buff.length个字符,放在buff数组中,返回实际读取的字符数
- int read(char[] buff, int off, int length) //最多读取length个字节,放在buff数组中,从数组的off位置开始放置数据,返回实际读取的字符数。off一般设置为0,length一般设置为buff的长度
File file = new File("1.txt");FileReader fr = null;try{fr = new FileReader(file);char[] c = new char[24];int len;while((len = fr.read(c)) != -1){for(int i=0;i<len;i++){System.out.print(c[i]);}}}catch(Exception e){e.printStackTrace();}finally{if(fr != null){try {fr.close();} catch (IOException e) {e.printStackTrace();}}}}
Writer是字符输出流的顶级父类,常用方法:
- void write(int i) //输出一个字符,i是码值,输出的是i对应的字符
- void write(char[] buff) //输出整个char[]的内容
- void write(char[] buff, int off, int length) //把char[]从off位置开始,输出长度为length字符的内容
可以用String代替char[],所以Writer还具有以下2个方法:
- void write(String str)
- void write(String str, int off, int length)
FileWriter fw = null;try{fw = new FileWriter(new File("1.txt"));String str = "我喜欢Java,我要成为Java工程师。";fw.write(str);}catch(Exception e){e.printStackTrace();}finally{if(fw != null){try {fw.close();} catch (IOException e) {e.printStackTrace();}}}}
缓冲流是和4级顶级父类对应的:加前缀Buffered
InputStream BufferedInputStream 字节输入缓冲流,可作为所有字节输入流类的缓冲流
OutputStream BufferedOutputStream 字节输出缓冲流
Reader BufferedReader 字符输入缓冲流
Writer BufferedWriter 字符输出缓冲流
//用 BufferedReader 把文件读进来, 再用 BufferedWriter 把内容写出去File file = new File("hello.txt");File file1 = new File("hello3.txt");FileReader fr = null;BufferedReader br = null;FileWriter fw = null;BufferedWriter bw = null;try{fr = new FileReader(file);fw = new FileWriter(file1);br = new BufferedReader(fr);bw = new BufferedWriter(fw);String str;while((str = br.readLine()) != null){ // System.out.println(str); bw.write(str);bw.newLine();bw.flush();}}catch(Exception e){e.printStackTrace();}finally{if(bw != null){try {bw.close();} catch (IOException e) {e.printStackTrace();}}if(br != null){try {br.close();} catch (IOException e) {e.printStackTrace();}}}}
其他方法我就不一一说明了。有兴趣的同学可以自己再深入研究。
最后我就提供文件复制的通用方法吧。自己写的通用类。让自己更好的去了解Java的IO流的使用。
package io; /** 实现文件的复制*/ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class CopyFile {// 字节文件的复制方法public static void copyFileByte(String src, String dest) {// 1、提供读入、写出的文件File file1 = new File(src);File file2 = new File(dest);// 2、提供相应的流FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream(file1);fos = new FileOutputStream(file2);// 3、实现文件的复制byte[] b = new byte[20];int len;while ((len = fis.read(b)) != -1) {fos.write(b, 0, len);}} catch (Exception e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}/** 使用FileReader 、 FileWriter 可以实现文本文件的复制* 对于非文本文件(视频文件、音频文件、图片),只能使用字节流复制。*/public static void copyFileChar(String src, String dest) {// 1、提供读入、写出的文件File file1 = new File(src);File file2 = new File(dest);// 2、提供相应的流FileReader fr = null;FileWriter fw = null;try {fr = new FileReader(file1);fw = new FileWriter(file2);// 3、实现文件的复制char[] c = new char[24];int len;while ((len = fr.read(c)) != -1) {fw.write(c, 0, len);}} catch (Exception e) {e.printStackTrace();} finally {if (fw != null) {try {fw.close();} catch (IOException e) {e.printStackTrace();}}if (fr != null) {try {fr.close();} catch (IOException e) {e.printStackTrace();}}}}//使用BufferedInputStream和BufferedOutputStream实现非文本文件的复制public static void copyFileBuffered1(String src, String dest) {//1、提供读入、写出的文件File file1 = new File(src);File file2 = new File(dest);//2、先创建相应的节点流:FileInputStream、 FileOutputStreamFileInputStream fis = null;FileOutputStream fos = null;//3、再创建缓冲流:BufferedInputStream 、 BufferedOutputStreamBufferedInputStream bis = null;BufferedOutputStream bos = null;try {fis = new FileInputStream(file1);fos = new FileOutputStream(file2);bis = new BufferedInputStream(fis);bos = new BufferedOutputStream(fos);//4、具体实现文件复制的操作byte[] b = new byte[1024];int len;while((len = bis.read(b)) != -1){bos.write(b, 0, len);bos.flush();}}catch (Exception e) {e.printStackTrace();} finally {if(bos != null){try {bos.close();} catch (IOException e) {e.printStackTrace();}}if(bis != null){try {bis.close();} catch (IOException e) {e.printStackTrace();}}}} }
现在自己也准备大四了,所以自己要捉紧时间去学习,博客里面有什么问题的可以跟我说一下,大家一起交流一下学习的经验。
转载于:https://www.cnblogs.com/HHHY/p/10964567.html
Java 的 IO 流相关推荐
- Java基础—IO流
第一讲 IO概述 1. 流的概念 IO流即InputOutput的缩写,在Java中IO流用来处理设备之间的数据传输,Java对数据的操作是通过IO流的方式, 我们可以把IO流抽象的当作一根管道, ...
- java数据通道抽象为流_【java】IO流
对于java的IO流的理解很长时间来都是很乱,包括学习其他的语言对这一块知识也都算是一个盲点.更多的时候一提到读取保存数据就是使用数据库.这一次学习了IO流,自己又解决了一个很大的盲点. IO流为我们 ...
- 第15章-输入/输出 --- 理解Java的IO流
(一)理解Java的IO流 JAVA的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出(键盘.文件.网络连接等)抽象表述为"流"( ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- Java中IO流的总结
有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...
- java中io流是类吗_Java中的IO流
今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...
- Java - 文件(IO流)
Java - 文件 (IO) 流的分类: > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter & ...
- java 的io流需要学吗_Java的IO流之字节流,必须要学得内容,你会嘛?
原标题:Java的IO流之字节流,必须要学得内容,你会嘛? 伙伴们~ 端午节过的如何呀~ 有没有很开心呀~ 假期已过咱们继续开动了 IO流 先来认识一下IO流: IO流用来处理设备之间的数据传输,Ja ...
- 总是记不住java的IO流用法?用N个问题教你掌握java IO流
本文分享自华为云社区<总是记不住java的IO流用法?用N个问题教你掌握java IO流>,原文作者:breakDraw . Java IO 体系看起来类很多,感觉很复杂,但其实是 IO ...
最新文章
- 【Zookeeper入门】相关概念总结
- webpack热更新实现
- 读书笔记:人月神话的博客积极的心态读后感
- a标签href不跳转_[网页编程]-06 HTML5 超链接标签
- nodejs项目_多人群聊实现其实很简单:Nodejs+WebSocket+Vue轻松实现Web IM
- Python:Sklearn概述
- python预测新航线的票价_浙江长龙航空有限公司四条新航线(线路+票价)
- python实现字母的加密和解密 字典_python实现AES加密与解密
- Jmeter响应断言介绍
- 关于单细胞批次矫正那些事(一)
- linux开机时驱动的加载流程
- libreelec投屏_【树莓派】树莓派与XBMC及Kodi、LibreELEC插件(一)
- Windows 自带的 UTF8 字符 颜文字表情符号
- 使用全局优化方法识别中文事件因果关系
- web版Project简介
- 金山卫士开源软件之旅(九) KUI高级界面(列表控件、树控件例子、超文本、网页控件)
- 2020年1月使用Mac线刷红米Note3全网通
- Linux笔记一:Linux基本命令
- 百度apollo自动驾驶planning代码学习-Apollo/modules/planning/common/Smoother类代码详解
- tensorflow正则化添加方法整理
热门文章
- 使用Android studio 创建svn分支
- bat脚本注释多行_cmd批处理常用符号详解
- cat 常用的日志分析架构方案_芯片失效分析常用方法及解决方案
- 对AI领域的会议的评点
- BZOJ-2242-计算器-SDOI2011-BSGS
- BZOJ 2959 长跑 (LCT、并查集)
- jmr连接mysql_MYSQL 优化之延迟关联
- 公众号获取用户手机号_小程序中如何获取微信用户绑定的手机号
- mysql8创建用户并授权_新版mysql8.0.12添加用户并设置权限避免踩坑!
- python多进程编程实例_Python多进程编程multiprocessing代码实例