IO流的分类及常用案例

IO流的分类
1、根据流的数据对象来分:
高端流:所有的内存中的流都是高端流,比如:InputStreamReader  
低端流:所有的外界设备中的流都是低端流,比如InputStream,OutputStream 
如何区分:所有的流对象的后缀中包含Reader或者Writer的都是高端流,反之,则基本上为低端流,不过也有例外,比如PrintStream就是高端流

2、根据数据的流向来分:
输出流:是用来写数据的,是由程序(内存)--->外界设备
输入流:是用来读数据的,是由外界设备--->程序(内存)
如何区分:一般来说输入流带有Input,输出流带有Output 

3、根据流数据的格式来分:
字节流:处理声音或者图片等二进制的数据的流,比如InputStream 
字符流:处理文本数据(如txt文件)的流,比如InputStreamReader  

如何区分:可用高低端流来区分,所有的低端流都是字节流,所有的高端流都是字符流

4、根据流数据的包装过程来分:
原始流:在实例化流的对象的过程中,不需要传入另外一个流作为自己构造方法的参数的流,称之为原始流。
包装流:在实例化流的对象的过程中,需要传入另外一个流作为自己构造方法发参数的流,称之为包装流。
如何区分:所以的低端流都是原始流,所以的高端流都是包装流

IO流对象的继承关系(如下图):

下面来看一些具体的代码例子:

1.将一个文件的内容写入另一个文件(按行来写)

<span style="white-space:pre">	</span>/**
	 * 将一个文件的内容写入另一个文件(按行来写)<br>
	 * 
	 * @param source 源文件
	 * @param target 目标文件
	 */
	public static void readFileToAnother(String source, String target) {
		File sourceFile = new File(source);

		BufferedReader read = null;
		BufferedWriter writer = null;

		try {
			// 源文件读取对象缓冲读入流
			read = new BufferedReader(new FileReader(sourceFile));
			
			// 目标文件写入对象缓冲写入流
			writer = new BufferedWriter(new FileWriter(target));
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			String tempString = null;
			while (null != (tempString = read.readLine())) {
				writer.append(tempString);
				writer.newLine();// 换行
				writer.flush();// 需要及时清掉流的缓冲区,万一文件过大就有可能无法写入了,Soga!
			}

			read.close();
			writer.close();
			System.out.println("文件写入完成...");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

2.以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件<br>

	/**
	 * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件<br>
	 * @param fileName 文件路径
	 */
	public static void readFileByBytes(String fileName) {
		File file = new File(fileName);
		InputStream is = null;
		
		// 一次读一个字节
		System.out.println("一次读一个字节:");
		try {
			is = new FileInputStream(file);
			int tempbyte;
			while (-1 != (tempbyte = is.read())) {
				System.out.print(tempbyte);
			}
			System.out.println();
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
			return;
		}
		
		// 一次读多个字节
		System.out.println("一次读多个字节:");
		try {
			is = new FileInputStream(fileName);
			int available = is.available();
			System.out.println("此字节流一次可读取的字节数:" + available);
			
			// 设置一次读取100个字节
			byte[] tempbytes = new byte[100];
			
			int byteread = 0;
			// 读入多个字节到字节数组中,byteread为一次读入的字节数
			while (-1 != (byteread = is.read(tempbytes))) {
				System.out.print(tempbytes + "->" + byteread);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e1) {
				}
			}
		}
	}


3.以行为单位读取文件,常用于读面向行的格式化文件

	/**
	 * 以行为单位读取文件,常用于读面向行的格式化文件
	 * 
	 * @param fileName 文件路径
	 */
	public static void readFileByLines(String fileName) {
		File file = new File(fileName);
		BufferedReader reader = null;

		try {
			reader = new BufferedReader(new FileReader(file));

			String tempString = null;
			int line = 1;
			// 一次读入一行,直到读入null为文件结束
			while (null != (tempString = reader.readLine())) {
				// 显示行号
				System.out.println("line " + line + ": " + tempString);
				line++;
			}
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
				}
			}
		}
	}

4.以字符为单位读取文件,常用于读文本,数字等类型的文件

	/**
	 * 以字符为单位读取文件,常用于读文本,数字等类型的文件
	 * 
	 * @param fileName 文件路径
	 */
	public static void readFileByChars(String fileName) {
		File file = new File(fileName);
		Reader reader = null;

		// 一次读一个字符
		try {
			reader = new InputStreamReader(new FileInputStream(file));
			
			int tempchar;
			while (-1 != (tempchar = reader.read())) {
				// 对于windows下,\r\n这两个字符在一起时,表示一个换行。
				// 但如果这两个字符分开显示时,会换两次行。
				// 因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。
				if (((char) tempchar) != '\r') {
					System.out.print((char) tempchar);
				}
			}
			
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		// 一次读多个字符
		try {
			
			// 由于要以字符来读取,所以需要套上字符流
			reader = new InputStreamReader(new FileInputStream(fileName));
			
			// 一次读30个字符
			char[] tempchars = new char[30];
			int charread = 0;
			// 读入多个字符到字符数组中,charread为一次读取字符数
			while (-1 != (charread = reader.read(tempchars))) {
				// 同样屏蔽掉\r不显示
				if ((charread == tempchars.length)
						&& (tempchars[tempchars.length - 1] != '\r')) {
					System.out.print(tempchars);
				} else {
					for (int i = 0; i < charread; i++) {
						if (tempchars[i] == '\r') {
							continue;
						} else {
							System.out.print(tempchars[i]);
						}
					}
				}
			}
		} catch (Exception e1) {
			e1.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
				}
			}
		}
	}



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. 读取文本文件并打印到控制台 2. 从键盘读取输入并将其写入到文本文件中 3. 将图像文件复制到另一个文件夹 4. 从网络套接字读取数据并将其写入到文件 5. 使用ObjectInputStream和ObjectOutputStream进行序列化和反序列化 注意:这些练习应该在你已经掌握了Java IO流的基本概念和语法之后进行。如果你还没有学习过Java IO流,建议先去学习相关知识。 ### 回答2: 以下是一些JavaIO流的练习案例: 1. 文件复制:编写一个程序,从一个文件中读取内容,并将其复制到另一个文件中。可以使用字节流字符流进行操作。 2. 文件备份:编写一个程序,能够备份指定的文件夹,并将文件夹中的所有文件和子文件夹复制到指定的目标文件夹中。 3. 文件搜索:编写一个程序,可以搜索指定文件夹中的所有文件,找到包含特定关键字的文件,并将其路径输出。 4. 文件压缩:编写一个程序,可以将指定文件夹中的所有文件压缩成一个压缩文件,并保存到指定目录中。 5. 文本编辑器:编写一个简单的文本编辑器,可以打开和保存文件,并实现一些基本的文本编辑操作,如插入、删除和替换文本等。 6. 网络文件传输:编写一个客户端和服务器端的程序,实现从客户端向服务器端传输文件的功能。 7. 序列化和反序列化:创建一个Java对象,并将其序列化到文件中,然后再从文件中反序列化出来,并打印出对象的信息。 这些练习案例可以帮助你熟悉JavaIO流的使用,加深对文件操作和网络传输的理解。通过实际操作和练习,你可以更好地掌握JavaIO流的相关知识。 ### 回答3: 以下是几个Java IO流的练习案例: 1. 案例一:复制文件 编写一个Java程序,实现将一个文件的内容复制到另一个文件中。可以使用FileInputStream和FileOutputStream来读取和写入文件的内容。 2. 案例二:读取文件内容并统计字符数 编写一个Java程序,实现读取一个文本文件的内容,并统计其中的字符数。可以使用BufferedReader来逐行读取文件内容,并使用字符流来读取文件的内容。 3. 案例三:写入文件内容 编写一个Java程序,实现向一个文本文件中写入内容。可以使用PrintWriter来写入文件内容。 4. 案例四:读取CSV文件内容并处理 编写一个Java程序,读取一个CSV文件的内容,并对其内容进行处理。可以使用BufferedReader和StringTokenizer来读取CSV文件的内容,并使用String的split方法对每一行进行解析和处理。 5. 案例五:读取网络资源内容并保存 编写一个Java程序,从一个URL中读取内容,并将其保存到一个文件中。可以使用URL和HttpURLConnection来读取URL资源的内容,并使用FileOutputStream将内容写入文件中。 这些案例可以帮助你加深对Java IO流的理解,掌握各种IO类的使用方法和技巧。通过练习这些案例,你可以更好地理解Java IO流的概念和应用场景,提升你在Java开发中处理文件和网络资源的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值