I/O流学习笔记

本文探讨了I/O流的核心概念,重点介绍了字节流和字符流的读取方式,如inputstream、outputstream、reader、writer及其常用实现类。强调字节流与字符流的区别,包括是否使用缓冲区以及处理对象类型,并指出两者间的转换方法。通过实例说明了如何在实际操作中选择合适的流类型。

流的本质就是数据传输

流的读取方式可以分为两种:字节流和字符流

字节流的读取接口为inputstream和outputstream 实现类常用的为fileinputstream和fileoutputstream

字符流的读取接口为reader和writer实现类常用的为filereader和filewriter

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流

字节流和字符流也可以相互进行转换之间桥梁是inputstreamreader和outstreamwriter

字节流和字符流的区别:

字节流在操作时本身不会用到缓冲区,是文件本身直接操作的,字符流,通过缓冲区再操作文件,字节流可以用于任何类型的对象,包括二进制对象而字符流只能处理字符或者字符串 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理unicode字符 而字符流可以

下面看一下例子吧

 

/*
	 * 编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,
	 * a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔.
	 */
	/*
	 * 读取文件中的内容 按照规定格式拆分
	 */
	public static String[] read(String pathname, String regex) throws Exception {
		// 根据一个路径找到文件
		File f = new File(pathname);
		// 读取文件内容到内存
		FileReader reader = new FileReader(f);
		// 建立一个字节数组
		char[] buf = new char[(int) f.length()];
		// 把文件内容放在数组字节数组中
		reader.read(buf);
		// 文件内容转换成字符串
		String results = new String(buf);
		reader.close();
		// 拆分并返回符合需求的字符串数组
		return results.split(regex);
	}

	/*
	 * 得到一个交叉数组 写入到另一个文件中
	 */
	public static void writers(FileWriter c, String[] words) throws Exception {

		for (int i = 0; i < words.length; i++) {
			// 获取输出流 输出内容到指定文件中
			c.write(words[i] + " ");

		}
	}

	public static void main(String[] args) throws Exception {
		// 读取 a和b文件
		String[] aword = MainClass.read("D:/a.txt", " ");
		String[] bword = MainClass.read("D:/b.txt", " ");

		// 实例一个ab的组合数组
		String[] ab = new String[aword.length + bword.length];
		// 循环遍历输出a和b中的内容 循环最大的那个数组长度
		int count = (aword.length > bword.length ? aword.length : bword.length);
		// 组合数组
		int j = 0;
		for (int i = 0; i < count; i++) {
			// 如果数组索引比i大就说明还有数据
			if (aword.length > i) {
				ab[j] = aword[i] + "\r\n"; // 加回车
				j++;
			}
			// 如果数组索引比i大就说明还有数据
			/*
			 * windows下的文本文件换行符:\r\n 
			 * linux/unix下的文本文件换行符:\r 
			 * Mac下的文本文件换行符:\n
			 */
			if (bword.length > i) {
				ab[j] = bword[i] + " "; // 加空格或回车
				j++;
			}
		}
		FileWriter c = new FileWriter("D:/c.txt");
		MainClass.writers(c, ab);
		c.close();
	}

</pre>第二个:</p><p><pre name="code" class="java">/**
	 * 编写一个程序,将 d:\java目录下的所有.java 文件复制到d:\jad目录下,并将原来文件的扩展名从.java 改为.jad。
	 * 
	 * listFiles方法接受一个 FileFilter对象, 这个 FileFilter 对象就是过虑的策略对象, 不同的人提供不同的
	 * FileFilter 实现,即提供了不同的过滤策略。
	 * 
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		/*
		 * 得到某个目录下的所有的.java文件
		 */
		// 1.找到这个目录
		File srcDir = new File("D:/java");
		/*
		 * 判断目录是否存在file_exists() 函数检查文件或目录是否存在。 如果指定的文件或目录存在则返回 true,否则返回 false。
		 * isDirectory() 检查表示此抽象路径名的文件是否是一个目录
		 */
		if (!(srcDir.exists() && srcDir.isDirectory())) {
			throw new Exception("目录不存在");
		} else {
			/*
			 * 2 File.listFiles() 返回抽象路径名的定义中表示此抽象路径名的目录中的文件的数组 3
			 * FilenameFilter过滤得到指定类型的文件或者目录 必须重写accept(File file,String path)方法
			 */
			File[] files = srcDir.listFiles(new FilenameFilter() {
				public boolean accept(File dir, String name) {
					return name.endsWith(".java");
				}
			});
			/*
			 * 将文件写入jad目录中
			 */
			File desDir = new File("D:/jad");
			if (!desDir.exists()) {
				/*
				 * mkdir() 只能在已经存在的目录中创建创建文件夹。
				 * mkdirs()可以在不存在的目录中创建文件夹。诸如:a\\b,既可以创建多级目录。D:/a/b/c
				 */
				desDir.mkdir();
			}
			/*
			 * filereader fileinputstream FileInputStream :以字节流方式读取 byte数组;
			 * FileReader :把文件转换为字符流读入 char数组 FileInputStream 类以二进制输入 / 输出, I/O
			 * 速度快且效率搞,但是它的 read ()方法读到的是一个字节,很不利于人们阅读 FileReader 类弥补了这个缺陷
			 * 如果处理纯文本文件,建议使用 FileReader
			 * 因为更方便,也更适合阅读;但是要注意编码问题!其他情况(处理非纯文本文件),FileInputStream是唯一的选择
			 */
			// 根据源文件名得到目标文件名,并且改名
			for (File f : files) {
				FileInputStream fis=new FileInputStream(f);
				//replace和replaceAll都是查找出所有匹配字符并替换之,最大的不同:replaceAll的参数是正则表达式,而replace是普通字符
				//$是匹配输入的结束 结束是否符合条件
				String destFileName=f.getName().replaceAll("\\.java$", ".jad");
				//desDir 是所在上一级路径 destFileName是文件名
				FileOutputStream fos=new FileOutputStream(new File(desDir,destFileName));
				//复制内容 
				copy(fis, fos);
				fis.close();
				fos.close();
				
			}
		}
	}
	private static void copy(InputStream ips,OutputStream ops) throws IOException{
		//读取内容放入字节数组中
		int len=0;
		byte[] buf=new byte[1024];
		/*
		 * int read()读取一个字节,返回值为所读的字节 
		 * int read( byte b[ ] ); //读取多个字节,
		 * 放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字节的数量 
		 * 
		 */
		while((len=ips.read(buf))!=-1){
			//buf 输出字节数组  结束
			//write( byte b[ ], int off, int len ); //把字节数组b中从下标off开始,长度为len的字节写入流中 
			ops.write(buf, 0, len);
		}
	}


 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值