菜鸟先飞之JAVA_IO流

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Happy_cloudlife/article/details/78132700
IO流概述
IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,Java用于操作流的类都在IO包中,流按流向分为两种:输入流,输出流。流按操作类型分为两种: 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的。字节流的抽象父类:InputStream和OutputStream; 字符流 : 字符流只能操作纯字符数据,比较方便。字符流的抽象父类:Reader和Writer。

FileInputStream类
FileInputStream 从文件系统中的某个文件中获得输入字节。用于读取诸如图像数据之类的原始字节流。
构造方法:
public FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,如果指定文件不存在,或者它是一个目录,而不是一个常规文件,抑或因为其他某些原因而无法打开进行读取,则抛出 FileNotFoundException。
成员方法:
1)public int read() 从此输入流中读取一个数据字节。如果已到达文件末尾,则返回 -1。
2)public int read (byte[] b)从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。返回读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。
3)public int available() 返回要读取文件的字节大小。
4)public void close ()关闭此文件输入流并释放与此流有关的所有系统资源。如果此流有一个与之关联的通道,则关闭该通道。
read()方法读取的是一个字节,为什么返回是int,而不是byte,因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111,那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上,24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型。

FileOutputStream类
FileOutputStream是用于将数据写入 File 或 FileDescriptor 的输出流。如果所涉及的文件已经打开,则此类中的构造方法将失败。FileOutputStream 用于写入诸如图像数据之类的原始字节的流。
构造方法:
1)public FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
2)public FileOutputStream(File file,boolean append)创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。
成员方法:
1)public void write(int b)将指定字节写入此文件输出流。
2)public void write (byte[] b)将 b.length 个字节从指定 byte 数组写入此文件输出流中。
3)public void write(byte[] b,int off,int len)将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
4)public void close()闭此文件输出流并释放与此流有关的所有系统资源。

FileInputStream和FileOutputStream整合拷贝文件
public static void demo1() throws FileNotFoundException, IOException {
		FileInputStream fis = null;//定义全局输入流,并赋值为null
		FileOutputStream fos = null;//定义全局输出流,并赋值为null
		try{
			fis = new FileInputStream("aaa.txt");//让输入流关联aaa.txt
			fos = new FileOutputStream("yyy.txt");//让输出流关联yyy.txt
			
			int b;
			while ((b=fis.read()) != -1){//开始读
				fos.write(b);//开始写
			}
		} finally {
			try{//嵌套try...finally , 保证尽可能的把流都关闭
					if(fis != null)
					fis.close();//关闭输入流
				} finally {
					if(fos != null)
					fos.close();//关闭输出流
				
			}
		}
	}


BufferedInputStream类
BufferedInputStream在创建时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。
构造方法:
1)public BufferedInputStream(InputStream in)创建一个内部缓冲区数组并将其存储在 buf 中。
2)public BufferedInputStream(InputStream in, int size)创建具有指定缓冲区大小的BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。创建一个长度为 size 的内部缓冲区数组并将其存储在 buf 中。

BufferedOutputStream类
该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统
构造方法:
1)public BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
2)public BufferedOutputStream(OutputStream out,int size)创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
成员方法:
public void flush()刷新此缓冲的输出流。这迫使所有缓冲的输出字节被写出到底层输出流中。
flush和close方法的区别:
1)flush()方法用来刷新缓冲区的,刷新后可以再次写出。
2)close()方法用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出。

FileReader类
FileReader用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
构造方法:
public FileReader(String fileName)在给定从中读取数据的文件名的情况下创建一个新 FileReader。
FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)

FileWriter类
用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
构造方法:
1)public FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。
2)public FileWriter(File file,boolean append)根据给定的 File 对象构造一个 FileWriter 对象。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。
FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)

BufferedReader类
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
构造方法:
1)public BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。
2)public BufferedReader(Reader in,int sz)创建一个使用指定大小输入缓冲区的缓冲字符输入流。
成员方法:
public String readLine()读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
LineNumberReader是BufferedReader的子类,具有相同的功能,并且可以统计行号。调用getLineNumber()方法可以获取当前行号;调用setLineNumber()方法可以设置当前行号。

BufferedWriter类
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
构造方法:
1)public BufferedWriter(Writer out)创建一个使用默认大小输出缓冲区的缓冲字符输出流。
2)public BufferedWriter(Writer out,int sz)创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
成员方法:
public void newLine()写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符。

字符流使用注意事项
1)字符流是可以直接读写字符的IO流,字符流读取字符, 就要先读取到字节数据,然后转为字符。 如果要写出字符, 需要把字符转为字节再写出。
2)字符流也可以拷贝文本文件,但不推荐使用。 因为读取时会把字节转为字符,写出时还要把字符转回字节。
3)程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流。
4)读取的时候是按照字符的大小读取的,不会出现半个中文;写出的时候可以直接将字符串写出,不用转换为字节数组。
5)字符流不可以拷贝非纯文本的文件,因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符。就会用?代替,写出的时候会将字符转换成字节写出去。如果是?,直接写出,这样写出之后的文件就乱了,看不了了。

SequenceInputStream类
SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
构造方法:
1)public SequenceInputStream(InputStream s1,InputStream s2)通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。
2)public SequenceInputStream(Enumeration<? extends InputStream> e)通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。将按顺序读取由该枚举生成的输入流,以提供从此 SequenceInputStream 读取的字节。在用尽枚举中的每个输入流之后,将通过调用该流的 close 方法将其关闭。
类 Vector<E>中有一个方法:public Enumeration<E> elements()返回此向量的组件的枚举。可以结合这个集合,实现多文件的整合。

ByteArrayOutputStream类
此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
构造方法:
1)public ByteArrayOutputStream()创建一个新的 byte 数组输出流。缓冲区的容量最初是 32 字节,如有必要可增加其大小。
2)public ByteArrayOutputStream(int size)创建一个新的 byte 数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。
成员方法:
1)public String toString()使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串。
2)public String toString(String charsetName)使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串。
3)public byte[] toByteArray()创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。
4)public void writeTo(OutputStream out)将此 byte 数组输出流的全部内容写入到指定的输出流参数中,这与使用 out.write(buf, 0, count) 调用该输出流的 write 方法效果一样。

ObjectOutputStream和ObjectInputStream
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。只能将支持 java.io.Serializable 接口的对象写入流中。ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
注意:要写出的对象必须实现Serializable接口才能被序列化

PrintStream和PrintWriter
PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。向文本输出流打印对象的格式化表示形式。

标准输入输出流
1)什么是标准输入输出流
a)System.in是InputStream, 标准输入流, 默认可以从键盘输入读取字节数据
b)System.out是PrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据
2)修改标准输入输出流
a)修改输入流: System.setIn(InputStream)
b)修改输出流: System.setOut(PrintStream)


猜你喜欢

转载自blog.csdn.net/Happy_cloudlife/article/details/78132700