Java中的常用的输入输出流
Java中的输入输出流根据格式又可以分为字节流和字符流:(成对)
字节流:FileInputStream,FileOutputStream ; BufferedInputStream,BufferedOutputStream ;
字符流:FileReader,FileWriter ; BufferedReader,BufferedWriter
字符流和字节流的主要区别:
1.字节流读取的时候,读到一个字节就返回一个字节;(一个英文字符是一个字节);字符流使用了字节流读到一个或多个字节(一个中文是两个字节,在UTF-8码表中是3个字节,这要看编码方式,不同的编码中文是不同的大小)时。先去查指定的编码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
下面根据字节流和字符流来依次说明:
字节流:
1. FileInputStream,FileOutputStream( 这两个都是成对出现,前者进行输入(读文件)操作,后者进行输出(写文件)操作)
FileInputStream类称为文件输入流。它的作用是将文件中的数据输入到内存中,我们可以利用它来读文件。由于它属于字节流,因此在读取Unicode字符(如中文)的文件时可能会出现问题。
该类的构造方法:
·FileInputStream(File file):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。
·FileInputStream(String name):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。
这里提一下File类,File类的对象不但可以表示文件,还可以表示目录;当创建一个文件对象后,就可以利用它来对文件或目录的属性进行操作,如:文件名、最后修改日期、文件大小等等;需要注意的是,File对象并不能直接对文件进行读/写操作,只能查看文件的属性;创建格式:File file = new File("test.txt");
FileOutputStream类称为文件输出流,他的作用是将数据写到文件中,我们可以利用它来写文件。
该类的构造方法:
·FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。
·FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。
常用到的方法:
·void write(byte[] b):将b.length个字节从指定byte数组写入此文件输出流中。
·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此文件输出流。
·void write(int b):将指定字节写入此文件输出流。
2. BufferedInputStream,BufferedOutputStream(这对可以和上面一组对比着看,主要就是相差了一个缓冲区)
BufferedInputStream类称为缓冲输入流,其本身带有一个缓冲区,在读取数据时,先放到缓冲区中,可以减少对数据源的访问,提高运行的效率。
构造方法:
·BufferedInputStream(InputStream in):创建一个BufferedInputStream并保存其参数,即输入流in,以便将来使用。
·BufferedInputStream(InputStream in,int size):创建一个具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in,以便将来使用。
常用方法:
·int read():从输入流中读取数据的下一个字节。
·int read(byte[] b,int off,int len):从此字节输入流中给定偏移量处开始将各字节读取到指定的byte数组中。
BufferedOutputStream类称为缓冲输出流,其本身也带有一个缓冲区,在写入数据时,先放到缓冲区中,实现缓冲的数据流。要注意在使用BufferedOutputStream写完数据后,要调用flush()方法或close()方法,强行将缓冲区中的数据写出。否则可能无法写出数据。
构造方法:
·BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流,来将数据写入指定的底层输入流。
·BufferedOutputStream(OutputStream out,int size):创建一个新的缓冲输出流,来将具有指定缓冲区大小的数据写入指定的底层输出流。
常用方法:
·void flush():刷新此缓冲的输出流。
·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此缓冲的输出流。
·void write(int b):将指定的字节写入此缓冲的输出流。
字符流:
FileReader,FileWriter ; BufferedReader,BufferedWriter(放在一起说)
FileReader类称为文件读取流,允许以字符流的形式对文件进行读操作(该类将从文件中逐个地读取字符,效率比较低下,因此一般将该类对象包装到缓冲流中进行操作。BufferedReader类主要为字符流提供缓冲,所以FileReader一般配合BufferReader来用)
构造方法:
FileReader(String fileName)
FileReader(File file)
常用方法://都是继承自Reader的方法
int read()
int read(char[] b)
int read(char[] b , int off ,int len)
FileWriter类称为文件写入流,以字符流的形式对文件进行写操作与FileReader类相似,FileWriter类同样需要使用缓冲流进行包装,所以FileWriter一般配BufferedWriter来用
构造方法:
FileWriter(String fileName)
FileWriter(String fileName, boolean append) //boolean append是否在原有基础上继续写
FileWriter(File file)
FileWriter(File file, boolean append)//boolean append是否在原有基础上继续写
常用方法:
void write(char[] b)
void write(char[] b, int off, int len)
void write(int b)
void write(String str)
void write(String str, int off, int len)
Writer append(char c)
Writer append(CharSequence csq)
Writer append(CharSequence csq, int start, int end)
为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。BufferedReader用于加快读取字符的速度,BufferedWriter用于加快写入的速度。BufferedReader和BufferedWriter类各拥有8192个字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。
BufferedReader是为了提供读的效率而设计的一个包装类,它可以包装字符流。可以从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
构造方法:
BufferedReader(Reader in) //创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) //创建一个使用指定大小输入缓冲区的缓冲字符输入流。
常用方法:
int read() //读取单个字符。
int read(char[] cbuf, int off, int len) //将字符读入数组的某一部分。
String readLine() //读取一个文本行。(不包括换行符)
BufferedWriter:
构造方法:
BufferedWriter(Writer out) //创建一个缓冲字符输出流,使用默认大小的输出缓冲区
BufferedWriter(Writer out, int sz) //创建一个缓冲字符输出流,使用给定大小的输出缓冲区
常用方法:
void write(int c) //写入单个字符。
void write(char[] cbuf, int off, int len) //写入字符数组的某一部分。
void write(String s, int off, int len) //写入字符串的某一部分。
void newLine() //写入一个行分隔符。
void close() //关闭此流,但要先刷新它
void flush() //刷新该流的缓冲
乱码问题:
虽然前面提到处理纯文本数据,就要优先考虑使用字符流,但是考虑到编码的因素,可以使用包装InputStreamReader的BufferedReader,包装OutputStreamWriter的BufferedWriter来复制文件,好处就是可以指定复制文件的时候使用的字符编码使不产生乱码。下面讲一下InputStreamReader和OutputStreamWriter:
InputStreamReader:它使用指定的字符集读取字节并将它们解码为字符。 它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节。为了获得最高效率,通常在BufferedReader中包装InputStreamReader。
使用格式: BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile),"UTF-8"));
OutputStreamWriter:它使用指定的字符集将字符编码为字节(是InputStreamReader的逆过程)。它的字符集可以由名称指定,也可以接受平台的默认字符集。
使用格式: BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(destFile), "UTF-8"));
Java中的常用的输入输出流的更多相关文章
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- Java中的I/O输入输出流概述
流是一组有序的数据序列,根据操作类型,可以分为输入流和输出流两种,Java语言中定义的负责各种输入输出的类都被放在java.io包中.其中所有的输入流类都是抽象类InputStream(字节输入流)或 ...
- Java中IO对象的输入输出流
输入流: public void inputDemo () throws IOException { //文件名称 String fileName = "d:\\aaa.txt"; ...
- Java中最常用的集合类框架之 HashMap
一.HashMap的概述 HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构. HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射 ...
- JAVA 中两种判断输入的是否是数字的方法__正则化_
JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...
- java中最常用jar包的用途说明
java中最常用jar包的用途说明,适合初学者 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实 ...
- java中的常用类(二)
java中的常用类(二) Math类 Math类的声明:public final class Math extends Object Math类是与数学计算有关的类,里面的方法都是静态方法,直接使用类 ...
- java 3 接口与多态&输入输出流
接口 中的所有方法都是方法 抽象 使用接口实现多继承 类型的装换 数据成员就变成了static 和 final food 和 snow 都是可以吃的 可以同时实现多个接口 接口与接口之间也可以有继承关 ...
- Java I/O(二)其他常用的输入输出流PrintStream等、标准流重定向
四.FilterOutputStream.PrintStream PrintStream是继承自FilterStream类的,例如标准输出流System.out就是著名的PrintStream类对象. ...
随机推荐
- css中cursor(光标类型)
值 描述 url 需使用的自定义光标的 URL. 注释:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标. default 默认光标(通常是一个箭头) auto 默认.浏览器 ...
- 美和易思 · 「云农职互联网技术学院」HTML+CSS 做西普尼金表官网
假期作业,好久没碰了,代码写得很烂......写博客纯属记录! 源代码下载地址:https://download.csdn.net/download/weixin_44893902/12805555 ...
- docker构建.net core运行的镜像
在docker很火的今天,越来越多的应用现在都在往docker上迁移,.net core怎么能落后? 项目要运行在docker上,我们需要先制作镜像,可以基于centos来制作,当然也可以基于Ubun ...
- 初识python: 文件下载进度
(后续待更新...) 使用 request 的 urlretrieve 方法创建"回调函数": 下载进度 详细代码如下: #!/user/bin env python # auth ...
- spring cloud bus 消息总线 动态刷新配置文件 【actuator 与 RabbitMQ配合完成】
1.前言 单机刷新配置文件,使用actuator就足够了 ,但是 分布式微服务 不可能是单机 ,将会有很多很多的工程 ,无法手动一个一个的发送刷新请求, 因此引入了消息中间件 ,常用的 消息中间件 是 ...
- Git 的配置 config
Git 的配置 config Git 的配置 config config 文件简述 config 文件位置 信息查询 修改 config 文件 编辑配置文件 增加指定配置项 删除指定配置项 自助餐 ...
- HDURomantic
Problem - 1004 (hdu.edu.cn) 扩展欧几里得解决线性同余方程.先得到gcd的解,再恢复原解,因为知道通解的一般形式,所以通过模来得到最小正整数解.另一个可以通过相减,或者一样的 ...
- JAVA之内存结构
概述 JAVA是我们现在最常用的开发语言,而他的垃圾回收机制(Garbage Collection)的重要作用不言而喻,以下简称GC,所以了解GC至关重要,现本人对于GC机制以前的理解和现在的理解记录 ...
- 二维数组与稀疏数组的转换---dataStructures
首先我们看一个需求 在11 * 11 的五子棋的棋盘中 我们使用0代表十字交叉点也是无效的数据 用1代表黑棋 用2代表蓝棋 那么所看到的棋盘如下 改用数字显示后就如一下样式 现在我们需要将怎个棋盘存储 ...
- [Anti-AV] 从攻防对抗辩证性分析jsp免杀(一)
从攻防对抗辩证性分析jsp免杀 从最早的最朴素木马 <%@ page import="java.io.InputStream" %> <%@ page impor ...