博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA在IO流量汇总
阅读量:6593 次
发布时间:2019-06-24

本文共 4724 字,大约阅读时间需要 15 分钟。

本文是在学习中的总结,欢迎转载但请注明出处:

      我想你对JAVA的IO流有所了解,平时使用的也比較的多,可是对于其详细分类和继承体系可能知道的并不多,可能也非常少去看相关的API文档,找出当中的关系和各自的应用情形。本文简单对经常使用的IO流进行分类整理,并简单举例说明其应用。希望本文对你有所帮助。

(A)IO流大致分为两种:

        (1)字节流:相应抽象类为InputStream(输入流)和 OutputStream(输出流)。 
        (2)字符流:相应抽象类为Reader(输入流)和Writer(输出流)。

 

(B)详细实现例如以下 

        (1)字节流:(经常使用的)FileInputStream实现了InputStream。
                               (经常使用的)FileOutputStream实现了OutputStream。 
        (2)字符流:(经常使用的)BufferedReader、InputStreamReader、 StringReader实现了Reader。FileReader继承了InputStreamReader。
                               (经常使用的)BufferedWriter、OutputStreamWriter、StringWriter实现了Writer,FileWriter继承了OutputStreamWriter。

(C)实现类详情及使用情况例如以下:

        输出流:

        (1)OutputStreamWriter是字符流通向字节流的桥梁:使用指定的 charset 将要向其写入的字符编码为字节。它使用的字符集能够由名称指定或显式给定,否则可能接受平台默认的字符集。

 每次调用 write() 方法都会针对给定的字符(或字符集)调用编码转换器。在写入基础输出流之前。得到的这些字节会在缓冲区累积。能够指定此缓冲区的大小。只是,默认的缓冲区对多数用途来说已足够大。

为了达到最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中以避免频繁调用转换器。

比如: 

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

        (2)FileReader 用来读取字符文件的便捷类,用于读取字符流。

        (3)BufferedReader具有缓冲区,从字符输入流中读取文本。缓冲各个字符。从而实现字符、数组和行的高效读取。 

        (4)StringReader  一个字符串的字符输入流。

 

        (5)FileInputStream 要读取原始字节流。经常使用于读二进制文件,如图片、声音、影像等文件。

        输入流:

        (1)InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。每次调用其一个 read() 方法都会导致从基础输入流读取一个或多个字节。要启用从字节到字符的有效转换。能够提前从基础流读取很多其它的字节,使其超过满足当前读取操作所需的字节。为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。比如: BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        (2)FileWriter 用来写入字符文件的便捷类。

        (3)BufferedWriter  具有缓冲区,将文本写入字符输出流。缓冲各个字符。从而提供单个字符、数组和字符串的高效写入。

        (4)StringWriter  一个字符串的字符输出流。能够用其回收在字符串缓冲区中的输出来构造字符串。

 

        (5)FileOutputStream 写入原始字节流。

经常使用于读二进制文件,如图片、声音、影像等文件。

(D)代码实例分析例如以下:

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import org.junit.Test;public class TestStream  {	// 读取文件里字符	@Test	public void testRead() throws IOException {		String path = "read.txt";		FileReader read = new FileReader(path);		BufferedReader reader = new BufferedReader(read);		while (reader.readLine() != null) {			String s = reader.readLine();			System.err.println(s);		}		reader.close();	}	// 写入字符到文件	@Test	public void testWrite() throws IOException {		String path = "write.txt";		FileWriter write = new FileWriter(path);		BufferedWriter writer = new BufferedWriter(write);		char[] buffer = new char[1024];		for (int i = 0; i < 1024; i++) {			if ((char) 'a' + i > Character.MAX_VALUE) {				buffer[i] = 'z';				System.err.println(1);			} else {				buffer[i] = (char) ('a' + i);			}		}		writer.write(buffer);		writer.close();	}	// 删除文件内容	@Test	public void testDelete() throws IOException {		String path = "write.txt";		FileWriter write = new FileWriter(path);		BufferedWriter writer = new BufferedWriter(write);		StringBuffer buffer = new StringBuffer();		writer.write(buffer.toString());		writer.close();	}	// 替换内容	@Test	public void testDeleteAndReplace() throws IOException {		String path = "write.txt";		FileWriter write = new FileWriter(path);		BufferedWriter writer = new BufferedWriter(write);		int i = 0;		while (++i < 100) {			StringBuffer buffer = new StringBuffer();			buffer.append(Math.random());			writer.write(buffer.toString() + "\r\n");		}		writer.close();	}	// 拷贝一个文件内容到还有一个文件	@Test	public void copyFile(String oldPath, String newPath) { 	       try { 	           int byteread = 0; 	           File oldfile = new File(oldPath); 	           if (oldfile.exists()) {                  //文件存在时 	               InputStream inStream = new FileInputStream(oldPath);      //读入原文件 	               FileOutputStream fs = new FileOutputStream(newPath); 	               byte[] buffer = new byte[100]; 				while ((byteread = inStream.read(buffer)) != -1) { 	                   fs.write(buffer, 0, byteread); 	               } 	               inStream.close(); 	               fs.close();	           } 	       }  catch (Exception e) { 	           e.printStackTrace(); 	       } 	   } 	//读取字符流	@Test	public static void testReadByte() {		String path = "write.txt";		File file = new File(path);		InputStream in = null;		try {			// 一次读一个字节			in = new FileInputStream(file);			int tempbyte;			while ((tempbyte = in.read()) != -1) {				System.out.write(tempbyte);			}			in.close();		} catch (IOException e) {			e.printStackTrace();			return;		}		try {			// 一次读多个字节			byte[] tempbytes = new byte[100];			int byteread = 0;			in = new FileInputStream(path);			while ((byteread = in.read(tempbytes)) != -1) {				System.out.write(tempbytes, 0, byteread);			}		} catch (Exception e1) {			e1.printStackTrace();		} finally {			if (in != null) {				try {					in.close();				} catch (IOException e1) {				}			}		}	}}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
hive优化--增加减少map数
查看>>
ERP计划参数如何在线更新
查看>>
LVS+Keepalived实现高可用集群
查看>>
我的友情链接
查看>>
unbantu安装 mysql --- 百度云
查看>>
sql2008性能计数器注册表配置单元一致性失败
查看>>
LNMP环境搭建
查看>>
我的友情链接
查看>>
学习linux—— 磁盘相关指令
查看>>
词法分析与语法分析简介
查看>>
JS中的默认行为
查看>>
我的友情链接
查看>>
Checkio代码闯关小计
查看>>
从oracle到mysql,主从到分库,一个普通项目数据库架构的变迁
查看>>
从零开始学wordpress 之四
查看>>
[LeetCode] Course Schedule
查看>>
selenium层级定位及鼠标键盘操作
查看>>
SpringBoot跨域问题解决方案
查看>>
(转载)hibernate3.0配置文件模板
查看>>
46、练习:输出指定目录下的所有文件名称
查看>>