java中IO流之字节字符流的总结概述
概念


Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中。其中,
所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类;
而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类。
【首先需要明白的是:流是干什么的???(为了永久性的保存数据)
根据数据流向的不同分为输入流和输出流;
根据处理数据类型的不同分为字符流和字节流;
】
【然后需要明白的是输入模式和输出模式是谁流向谁:
InputStream(字节输入流)和Reader(字符输入流)通俗的理解都是读(read)的。
OutputStream(字节输出流)和Writer(字符输出流)通俗的理解都是写(writer)的。
】
最后下面搞清楚各种流的类型的该怎么用,谁包含谁,理清思路。
字节流
字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream
2.实例:
(1)FileInputStream的单个字节读取,FileOutputStream的单个字节写入:
//输出流
public class fos_demo {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt", true);
//FileOutputStream()后面加true指文件后面可追加 int a = fis.read();//单个读取输入流字节
System.out.println(a);
int b = fis.read();
System.out.println(b);
int c = fis.read();
System.out.println(c);
fos.write(97);//单个读出字节
fos.write(98);
fos.write(99);
fis.close();//关闭输出流
fos.close();//关闭输出流
}
}
(2)FileInputStream和FileOutputStream进行拷贝文本或者图片或者歌曲(以图片为例)
public class copy_demo1 {
public static void main(String[] args) throws IOException{
copy_2();
}
public static void copy_2() throws IOException{
FileInputStream fis= new FileInputStream("aaa.jpg");
FileOutputStream fos = new FileOutputStream("copy1.jpg");
int b;
while((b=fis.read())!=-1){
fos.write(b);
}
fis.close();
fos.close();
}
}
(3)FileInputStream和FileOutputStream定义小数组进行操作:
//拷贝图片
package IO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Array_copy {
public static void main(String[] args) throws IOException {
FileInputStream fis= new FileInputStream("aaa.jpg");
FileOutputStream fos= new FileOutputStream("copy3.jpg");
byte[] bytes = new byte[1024 * 8];//自定义字节大小
int len;
while ((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fis.close();
fos.close();
}
}
(4)关于buffer
package IO; import java.io.*; //Buffer 相当于缓冲池 输入输出的转化
public class Buffer_demo {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("ren.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.jpg"));
int len;
while((len=bis.read())!=-1){
bos.write(len);
}
bis.close();
bos.close();
}
}
//读文件
public class Demo_FileReader {
public static void main(String[] args) throws Exception {
FileReader reader = new FileReader("demo.txt");
int len;
while ((len=reader.read())!=-1){
System.out.println((char) len);
}
reader.close();
}
//写文件
public class Demo_FileWriter {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("pao.txt");
fw.write("哈哈哈哈哈哈");;
fw.write(97);
fw.close();
}
}
2.字符流是不可以拷贝非纯文本的文件(如图片)
public static void copy_2() throws IOException{
BufferedReader br = new BufferedReader(new FileReader("aaa.jpg"));
BufferedWriter bw = new BufferedWriter(new FileWriter("copy2.jpg"));
int len;
while ((len = br.read()) != -1) {
bw.write(len);
}
br.close();
bw.close();
}
3.关于文本行(line)
//读取一个文本行
public class Buffered_demo {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("copy3.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("line.txt"));
String line;
while((line=br.readLine())!=null){
bw.write(line);
}
br.close();
bw.close();
}
//使用默认输入缓冲区的大小创建新的行编号 reader。
public class Linenum_Demo {
public static void main(String[] args) throws IOException {
LineNumberReader lr = new LineNumberReader(new FileReader("copy3.txt"));
String line;
lr.setLineNumber(2);
while((line=lr.readLine())!=null){
System.out.println(lr.getLineNumber()+" "+line);
} lr.close(); }
字节流与字符流的区别
字节流和字符流使用是非常相似的,那么除了操作代码的不同之外,还有哪些不同呢?
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
那开发中究竟用字节流好还是用字符流好呢?
在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。


java中IO流之字节字符流的总结概述的更多相关文章
- Java中常用的字节流和字符流
IO流(输入流.输出流) 字节流.字符流 1.字节流: InputStream.OutputStream InputStream抽象了应用程序读取数据的方式: OutputStream抽象了应用程序写 ...
- Java基础IO类之字节数组流
package IODemo; //字节数组流 :内部维护这着一个字节数组,我们可以利用流的读取机制来处理字符串 无需关闭,不会报IO异常 // ByteArrayInputstream ByteAr ...
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...
- Java中IO流的总结
有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...
- Java中IO流中的装饰设计模式(BufferReader的原理)
本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...
- java IO的字节流和字符流及其区别
1. 字节流和字符流的概念 1.1 字节流继承于InputStream OutputStream, 1.2 字符流继承于InputStreamReader OutputStre ...
- java中IO流小解
下面这张图列出了java中一些处理流: java中根据操作对象的不同可以分为:字节流和字符流. 首先我们先表示一下什么叫节点流和处理流: 节点流:可以从或向一个特定的地方(节点)读写数据.如FileR ...
- java基础46 IO流技术(输出字符流/缓冲输出字符流)
一.输出字符流 1.1.输出字符流体系 --------| Writer:输出字符流的基类(抽象类) ----------| FileWriter:向文件输出数据输出字符流(把程序中的数据写到硬盘中 ...
随机推荐
- 2014-9-27 NOIP模拟赛
1.栅栏迷宫 田野上搭建了一个黄金大神专用的栅栏围成的迷宫.幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫 ...
- Codevs 1444 “破锣摇滚”乐队
1444 “破锣摇滚”乐队 题目描述 Description 你刚刚继承了流行的“破锣摇滚”乐队录制的尚未发表的N(1 <= N <= 20)首歌的版权.你打算从中精选一些歌曲,发行M ...
- 自动化测试 Cucumber
Cucumber是一个能够理解用普通语言描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和.Net等多种开发语言. Cucumber 三大组成: Feature ...
- HTML5math标签
HTML5 MathML 一.HTML5 可以在文档中使用 MathML 元素,对应的标签是 <math>...</math> . MathML 是数学标记语言,是一种基于XM ...
- 启动Eclipse时,出现 “Failed to load the JNI shared library "C:\Program Files\java\jdk1.7.....\jvm.dll"
原因1:给定目录下jvm.dll不存在. 解决方法:(1)重新安装jre或者jdk并配置好环境变量. (2)copy一个jvm.dll放在该目录下. 原因2:eclipse的版本与jre或者jdk版本 ...
- python进阶02 特殊方法与特殊属性
python进阶02 特殊方法与特殊属性 一.初始化.析构 1.初始化 # python中有很多双下划线开头且以下划线结尾的固定方法,它们会在特定的时机被触发执行,这便是特殊方法 # 在实例化的时候就 ...
- NSwag生成客户端调用代码
NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码 https://www.cnblogs.com/hunanzp/p/9297361.html 前言 上一篇博客中我们 ...
- P2737 [USACO4.1]麦香牛块Beef McNuggets 数学题 + 放缩思想
https://www.luogu.org/problem/show?pid=2737#sub 先说一个结论:对于两个数p, q,且gcd(p, q) = 1(这个很重要,是条件来的).他们不能组合成 ...
- (转)Linux命令之Ethtool用法详解
Linux命令之Ethtool用法详解 原文:http://www.linuxidc.com/Linux/2012-01/52669.htm Linux/Unix命令之Ethtool描述:Ethtoo ...
- this、apply、call的指向
1.关于this this它总是返回一个对象,是指调用当前函数的对象,由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的. var person={ name: ...