JAVA IO详解

目录

一、流的概念与作用

二、Java IO的用途和特征

三、流的使用详解

四、流运用实例 

1、带缓冲区读文件:

2、带缓冲区写文件

3、不带缓冲区的写文件 

4、从键盘读取字符样例

5、从文件中读取汉字 


一、流的概念与作用

流(Stream): 在Java IO中,流是一个核心的概念。流从概念上来说是一个连续的数据传输过程。人们根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。你既可以从流中读取数据,也可以往流中写数据。流的特性与数据源或者数据流向的媒介相关联。

作用:为数据源和目的地建立一个输送通道

在Java IO中按照数据单位将流分为两类:

1.字节流:以字节为单位进行读写 1字节(byte) = 8位(bit)。

2.字符流:以字符为单位进行读写 1字符 = 2字节

字节流字符流的区别:

  1. 字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse() 方法时,信息已经输出了,而字符流只有在调用close() 方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush() 方法。
  2. 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
  3. 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

I/O(输入输出的定义):输入(InputStream) 和 输出(OutputStream) 经常容易让人混淆,因为,一个程序的输入,往往是一个程序的输出。

在这里插入图片描述

 所以我们说的输入与输出都是相对于当前应用程序而言的

二、Java IO的用途和特征

结合上文,我们可以按照流的操作单元和流方向大体上可将流分为四个基本的流类,所有的流都继承这四个:

字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

java.io包除了这四个基本的抽象流类,除此外java.io包类还提供了大量的子类,每个子类都有其特定的功能与用处,大致分为以下用处:

  • File Access ( 文件访问 )
  • Network Access ( 网络访问 )
  • Internal Memory Buffer Access ( 内存缓存访问 )
  • Inter-Thread Communication (Pipes) ( 线程内部通信(管道) )
  • Buffering ( 缓冲 )
  • Filtering ( 过滤 )
  • Parsing ( 解析 )
  • Reading and Writing Text (Readers / Writers) ( 读写文本 )
  • Reading and Writing Primitive Data (long, int etc.) ( 读写基本类型数据 例如long, int )
  • Reading and Writing Objects ( 读写对象 )

java.io之所以提供了那么多子类,是因为java基于装饰模式的设计思想来设计io体系的,它为每个子类提供了很极小颗粒度功能的实现,这样当你需要使用流的某一特定功能时,能动态的装配这些Stream类,获取自己想要的流类。

装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活,是一个对象结构型模式。——刘伟主编的《设计模式(第2版)》

Byte Based InputByte Based OutputCharacter Based InputCharacter Based Output
Basic(基本)InputStreamOutputStreamReader
InputStreamReader
Writer
OutputStreamWriter
Arrays(数组)ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
Files(文件)FileInputStream
RandomAccessFile
FileOutputStream
RandomAccessFile
FileReaderFileWriter
Pipes(管道)PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
Buffering(缓冲器)BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
Filtering(过滤器)FilterInputStreamFilterOutputStreamFilterReaderFilterWriter
Parsing(解析)PushbackInputStream StreamTokenizerPushbackReader
LineNumberReader
Strings(字符串)StringReaderStringWriter
Data(日期)DataInputStreamDataOutputStream
Data - Formatted(格式化日期)PrintStreamPrintWriter
Objects(对象)ObjectInputStreamObjectOutputStream
Utilities(工具)SequenceInputStream

三、流的使用详解

在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。
主要的类如下:
1. File(文件特征与管理):File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
3. OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
4. Reader(文件格式操作):抽象类,基于字符的输入操作。
5. Writer(文件格式操作):抽象类,基于字符的输出操作。 

举例说明:InputStream

在这里插入图片描述

1.ByteArrayInputStream:字节数组输入流,该类的功能就是从字节数组(byte[])中进行以字节为单位的读取,也就是将资源文件都以字节的形式存入到该类中的字节数组中去,我们拿也是从这个字节数组中拿
2.PipedInputStream:管道字节输入流,它和PipedOutputStream一起使用,能实现多线程间的管道通信
3.FilterInputStream :装饰者模式中处于装饰者,具体的装饰者都要继承它,所以在该类的子类下都是用来装饰别的流的,也就是处理类。具体装饰者模式在下面会讲解到,到时就明白了
4.BufferedInputStream:缓冲流,对处理流进行装饰,增强,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送。效率更高
5. DataInputStream:数据输入流,它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”
6.FileInputSream:文件输入流。它通常用于对文件进行读取操作
7.File:对指定目录的文件进行操作,具体可以查看讲解File的博文。注意,该类虽然是在IO包下,但是并不继承自四大基础类。
8.ObjectInputStream:对象输入流,用来提供对“基本数据或对象”的持久存储。通俗点讲,也就是能直接传输对象(反序列化中使用) 

四、流运用实例 

1、带缓冲区读文件:

读文件要定义一个FileInputStream类型的输入流。

package first_project;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

//带缓冲区的读文件
public class BufferFileInput {

public static void main(String[] args) throws IOException{
		
		//FileInputStream类用来在创建文件IO
		//BufferedOutputStream创建了一个缓冲区
		FileInputStream in =new FileInputStream("abc.txt");
		BufferedInputStream bufin= new BufferedInputStream(in);
		
		//获取缓冲区的长度
		int length=bufin.available();
		char c;
		for(int i=0;i<=length;i++) {
			c=(char)bufin.read();
			System.out.print(c);
		}
		bufin.close();
		in.close();
	}
}

2、带缓冲区写文件

 写文件要定义一个FileOutputStream类型的输出流

package first_project;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferFileOutput {

	public static void main(String[] args) throws IOException{
		
		//FileOutputStream类用来在创建文件IO
		//BufferedOutputStream创建了一个缓冲区
		FileOutputStream out =new FileOutputStream("abc.txt");
		BufferedOutputStream bufout= new BufferedOutputStream(out);
		
		for(int i='a';i<='z';i++) {
			bufout.write(i);
		}
		bufout.close();
		out.close();
	}
}

3、不带缓冲区的写文件 

package first_project;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

//不带缓冲区的写文件
public class FileOutput {

public static void main(String[] args) throws IOException{
		
		//FileOutputStream类用来在创建文件IO
		
		FileOutputStream out =new FileOutputStream("abc.txt");
		
		
		for(int i='a';i<='z';i++) {
			out.write(i);
		}
		
		out.close();
	}
}

4、从键盘读取字符样例

package first_project;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

//从键盘读取字符样例
public class BufferReaderFromConsole {

	public static void main (String args[]) {
		
		char c = 0;
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		
		System.out.println("输入字符,按下'q'退出");
		
		//
		do {
			try {
				c= (char)br.read();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(c);
		}while(c!='q');
	}
}

5、从文件中读取汉字 

package first_project;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

//从文件中读取汉字
public class ChineseFileInput {
	
	public static void main(String[] args) {

		try {
			File f =new File("E:\\eclipse\\workspace\\Default\\src\\first_project\\FileInputSampleChinese.txt");
			FileInputStream fis =new FileInputStream(f);//创建文件流
			
			byte[] bytes =new byte[(int)f.length()];
			fis.read(bytes);//将文件写入到bytes中
			//window记事本默认编码方式是gbk,如果保存文GBK件以保存,便以UTF-8读出
			
			String str = new String(bytes,"UTF-8");
			System.out.println(str);
		}catch(IOException e) {
			e.printStackTrace();
		}
	
	}
}

 

文件读写总结:


• 文件读写有关的类都在java.io包中。
• 四个基本类:
– InputStream, OutputStream:字节流读写
– Reader, Writer: Unicode流(字符流)读写
• 常用类:
– FileInputStream, FileOutputStream:文件读写类
– BufferedInputStream, BufferedOutputStream:缓冲区读写类
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WHS-_-2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值