Java基础 - IO(3) : 字符流

1. 字符流

  • 字节流操作中文数据不是特别的方便,所以就出现了转换流。
  • 转换流的作用就是把字节流转换字符流来使用。
  • 转换流其实是一个字符流 : 字符流 = 字节流 + 编码表

2. IO流中的编码问题

编码
				String -- byte[]
解码
				byte[] -- String
  • 编码问题很简单,只要编码和解码的格式是一致的。

3. OutputStreamWriter

  • OutputStreamWriter(OutputStream os) : 默认编码
  • OutputStreamWriter(OutputStream os,String charsetName) : 指定编码

4. InputStreamReader

  • InputStreamReader(InputStream is) : 用默认编码读取数据
  • InputStreamReader(InputStream is,String charsetName ) : 用指定编码读取数据

5. 字符流的5种写数据的方式

		// 为什么数据没进去呢?
		// 字符 = 2字节
		// 文件中数据存储的基本单位是字节
  • A. public void write(int c) throws IOException : 写入单个字符
  • B. public void write(char[]) throws IOException : 写入一个字符数组
  • C. public void write(char[] cbuf, int off, int len) throws IOException : 写入字符数组的某一部分
  • D. public void write(String str) throws IOException : 写入一个字符串
  • E. public void write(String str, int off, int len) throws IOException : 写入字符串的某一部分
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class OutputStreamWriterDemo {

	public static void main(String[] args) throws IOException {
		
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw2.txt"));
		
//		osw.write('a');
//		osw.write(97);

		// 为什么数据没进去呢?
		// 字符 = 2字节
		// 文件中数据存储的基本单位是字节
		
//		char[] chs = {'a','b','e','d','c'};
//		osw.write(chs,1,2);
		
		osw.write("淋雨一直走.mp3 - 张韶涵",6,6);
		
		osw.flush();
		
		osw.write("\n淋雨一直走.mp3 - 张韶涵");
		
		osw.close();
		
	}

}

6. OutputStreamWriter的close()方法 和flush()方法的区别?

  • A. close()关闭此流,但要先刷新它。在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。关闭以前关闭的流无效。
  • B. 仅仅刷新该流的缓冲。刷新之后,流对象还可以继续使用
  • C. 两种方法都可以刷新写出的数据,即促使字符转换为字节,因为都刷新流的缓冲了

7. 字符流的2种读数据的方式

package zywaf.yty.practice_02;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderDemo {

	public static void main(String[] args) throws IOException {
	
		InputStreamReader isr = new InputStreamReader(new FileInputStream("CopyImageDemo.java"));
		
//		int ch = 0;
//		while ((ch = isr.read()) != -1) {
//			System.out.print((char)ch);
//		}
//		
//		isr.close();
		
		int len = 0;
		char[] chs = new char[1024];
		while ((len = isr.read(chs)) != -1) {
			System.out.println(new String(chs,0,len));
		}
		
		isr.close();
		
	}

}

8. 字符流复制文本文件案例1

package zywaf.yty.practice_03;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class CopyFileDemo {

	public static void main(String[] args) throws IOException {
		
		InputStreamReader isr = new InputStreamReader(new FileInputStream("b.txt"));
		
		OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("a.txt"));
//		
//		int by = 0;
//		while ((by = isr.read()) != -1) {
//			osr.write(by);
//		}
		
		int len = 0;
		char[] chs = new char[1024];
		while ((len = isr.read(chs)) != -1) {
			osr.write(chs, 0, len);
		}
		
		osr.close();
		isr.close();

	}

}

9. 字符流复制文本文件案例2(FileReader - InputStreamReader子类、FileWriter - OutputStreamWriter子类)

package zywaf.yty.practice_03;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyFileDemo2 {
	public static void main(String[] args) throws IOException {
		
		FileReader fr = new FileReader("d.txt");
		FileWriter fw = new FileWriter("e.txt");
		
//		int ch = 0;
//		while ((ch = fr.read()) != -1) {
//			fw.write(ch);
//		}
		
		int len = 0;
		char[] chs = new char[1024];
		while ((len = fr.read(chs)) != -1) {
			fw.write(chs, 0, len);
			fw.flush();
		}
		
		fw.close();
		fr.close();
	}
}

10. 字符缓冲输出流BufferedWriter与字符缓冲输入流BufferedReader的使用

Reader
			|--InputStreamReader
				|--FileReader
			|--BufferedReader
Writer
			|--OutputStreamWriter
				|--FileWriter
			|--BufferedWriter
  • 字符流为了高效读写,也提供了对应的字符缓冲流。
  • BufferedWriter : 字符缓冲输出流
  • BufferedReader : 字符缓冲输入流
package zywaf.yty.practice_04;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class BufferedWriterDemo {

	public static void main(String[] args) throws IOException {
		
//		BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("bw.txt")));
		
		bw.write("zyWAF");
		bw.write("_");
		bw.write("YTY");
		
		bw.flush();
		bw.close();
		
	}

}
package zywaf.yty.practice_04;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {

	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new FileReader("c.txt"));
		
//		int ch = 0;
//		while ((ch = br.read()) != -1) {
//			System.out.print((char)ch);
//		}
		
		int len = 0;
		char[] chs = new char[1024];
		while ((len = br.read(chs)) != -1) {
			System.out.print(new String(chs, 0, len));
		}
		
		br.close();
		
	}

}

11. 字符缓冲流复制文本文件案例1

package zywaf.yty.practice_05;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class CopyFileDemo1 {

	public static void main(String[] args) throws IOException {
		
//		BufferedReader br = new BufferedReader(new FileReader("fum.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("fum.txt")));
		
//		BufferedWriter bw = new BufferedWriter(new FileWriter("lau.txt"));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("lau.txt")));
		
//		int ch = 0;
//		while ((ch = br.read()) != -1) {
//			bw.write(ch);
//		}
		
		int len = 0;
		char[] chs = new char[1024];
		while ((len = br.read(chs)) != -1) {
			bw.write(chs, 0, len);
		}
		
		bw.flush();
		bw.close();
		br.close();

	}

}

12. 字符缓冲流的特殊功能(BufferedReader 的readLine() 方法和BufferedWriter的newLine()方法)

  • BufferedReader public String readLine() throws IOException : 一次读取一行数据。包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
  • BufferedWriter public void newLine() throws IOException : 根据系统来决定换行符
package zywaf.yty.practice_06;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedDemo {

	public static void main(String[] args) throws IOException {
		
//		write();
		
		read();
	}

	private static void read() throws IOException {
		
		BufferedReader br = new BufferedReader(new FileReader("Rolex.txt"));
		String line = null;
		while ((line = br.readLine()) != null) {
			System.out.println(line);
		}
		br.close();
		
	}

	private static void write() throws IOException {
		BufferedWriter bw = new BufferedWriter(new FileWriter("Rolex.txt"));

		for (int x = 0; x < 10; x++) {
			bw.write("黑水鬼" + (x+1));
//			bw.write("\r\n");
			bw.newLine();
			bw.flush();
		}
		
		
		bw.close();
		
	}

}

13. 字符缓冲流复制文本文件案例2(用BufferedReader 的readLine() 方法和BufferedWriter的newLine()方法)

package zywaf.yty.practice_05;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class CopyFileDemo2 {

	public static void main(String[] args) throws IOException {
		
		// 封装数据源
//		BufferedReader br = new BufferedReader(new FileReader("waf.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("waf.txt")));
		
		// 封装目的地
//		BufferedWriter bw = new BufferedWriter(new FileWriter("zywafyty.txt"));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("zywafyty.txt")));
		
		// 读写数据
		String line = null;
		while ((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}

		bw.close();
		br.close();
	}

}

14. IO流小结图解

在这里插入图片描述

15. 复制文本文件的5种方式案例

package zywaf.yty.practice_01;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

public class CopyFileDemo {

	public static void main(String[] args) throws IOException {
		
		String inputString = "f.txt";
		String outputString = "g.txt";
//		method1(inputString,outputString);
//		method2(inputString,outputString);
//		method3(inputString,outputString);
//		method4(inputString,outputString);
		method5(inputString,outputString);
	}
	
	// 字符流一次读写一个字符串
		private static void method5(String inputString, String outputString) throws IOException {
			
			BufferedReader br = new BufferedReader(new FileReader(inputString));
			BufferedWriter bw = new BufferedWriter(new FileWriter(outputString));
			
			String line = null;
			while ((line = br.readLine()) != null) {
				bw.write(line);
				bw.newLine();
				bw.flush();
			}
			
			bw.close();
			br.close();
		}
	
	// 字符缓冲流一次读写一个字符数组
		private static void method4(String inputString, String outputString) throws IOException {
			
//			FileReader fr = new FileReader(inputString);
//			FileWriter fw = new FileWriter(outputString);
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputString)));
			BufferedWriter bw = new BufferedWriter(new FileWriter(outputString));
			
//			int ch = 0;
//			while ((ch = fr.read()) != -1) {
//				fw.write(ch);
//			}
			
			char[] chs = new char[1024];
			int len = 0;
			while ((len = br.read(chs)) != -1) {
				bw.write(chs, 0, len);
			}
			
			bw.close();
			br.close();
		}
	
	// 字符缓冲流一次读写一个字符
	private static void method3(String inputString, String outputString) throws IOException {
		
//		FileReader fr = new FileReader(inputString);
//		FileWriter fw = new FileWriter(outputString);
		BufferedReader br = new BufferedReader(new FileReader(inputString));
		BufferedWriter bw = new BufferedWriter(new FileWriter(outputString));
		
		int ch = 0;
		while ((ch = br.read()) != -1) {
			bw.write(ch);
		}
		
		bw.close();
		br.close();
	}

	
	// 基本字符流一次读写一个字符数组
	private static void method2(String inputString, String outputString) throws IOException {
		
		FileReader fr = new FileReader(inputString);
		FileWriter fw = new FileWriter(outputString);
		
//		int ch = 0;
//		while ((ch = fr.read()) != -1) {
//			fw.write(ch);
//		}
		
		char[] chs = new char[1024];
		int len = 0;
		while ((len = fr.read(chs)) != -1) {
			fw.write(chs, 0, len);
		}
		
		fw.close();
		fr.close();
	}
	
	// 基本字符流一次读写一个字符
	private static void method1(String inputString, String outputString) throws IOException {
		
		FileReader fr = new FileReader(inputString);
		FileWriter fw = new FileWriter(outputString);
		
		int ch = 0;
		while ((ch = fr.read()) != -1) {
			fw.write(ch);
		}
		
		fw.close();
		fr.close();
	}

}

16. 复制图片的4种方式案例

package zywaf.yty.practice_02;

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

public class CopyImageDemo {

	public static void main(String[] args) throws IOException {
		
		String beforeVideo = "/Users/yangtengyu/downloads/酷爱WAF丨哈狗帮/轻熟女27&1080P.mp4";
		String afterVideo  = "轻熟女27.mp4";
//		method1(beforeImage,afterImage);
//		method2(beforeImage,afterImage);
//		method3(beforeImage,afterImage);
		method4(beforeVideo,afterVideo);
	}

	// 4.缓冲高效字节流一次读写一个字节数组
			private static void method4(String beforeVideo, String afterVideo) throws IOException {
				
				BufferedInputStream bis = new BufferedInputStream(new FileInputStream(beforeVideo));
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(afterVideo));
				
//				int by = 0;
//				while ((by = bis.read()) != -1) {
//					bos.write(by);
//				}
				
				int len = 0;
				byte[] bys = new byte[1024];
				while ((len = bis.read(bys)) != -1) {
					bos.write(bys, 0, len);
				}
				
				bos.close();
				bis.close();
				
			}

	// 3.缓冲高效字节流一次读写一个字节
		private static void method3(String beforeImage, String afterImage) throws IOException {
			
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(beforeImage));
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(afterImage));
			
			int by = 0;
			while ((by = bis.read()) != -1) {
				bos.write(by);
			}
			
			bos.close();
			bis.close();
			
		}


	// 2.基本字节流一次读写一个字节数组
		private static void method2(String beforeImage, String afterImage) throws IOException {
			FileInputStream fis = new FileInputStream(beforeImage);
			FileOutputStream fos = new FileOutputStream(afterImage);
			
			byte[] bys = new byte[1024];
			int len = 0;
			while ((len = fis.read(bys)) != -1) {
				fos.write(bys,0,len);
			}
			
			fos.close();
			fis.close();
			
		}

	// 1.基本字节流一次读写一个字节
	private static void method1(String beforeImage, String afterImage) throws IOException {
	
		
		FileInputStream fis = new FileInputStream(beforeImage);
		FileOutputStream fos = new FileOutputStream(afterImage);
		
		int by = 0;
		while ((by = fis.read()) != -1) {
			fos.write(by);
		}
		
		fos.close();
		fis.close();
		
	}

}

17. 把集合中的数据存储到文本文件案例 与 把文本文件中的数据存储到集合中案例

package zywaf.yty.practice_03;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ArrayListToFileDemo {

	public static void main(String[] args) throws IOException {
		
		List<String> list = new ArrayList<String>();
		list.add("小糊涂神");
		list.add("大头儿子小头爸爸");
		list.add("蓝皮书大脸猫");
		
		BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
	
		for (String string : list) {
			bw.write(string);
			bw.newLine();
			bw.flush();
	}
		bw.close();
	}
}
package zywaf.yty.practice_03;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class FileToArrayListDemo {

	public static void main(String[] args) throws IOException {
		
		List<String> list = new ArrayList<String>();
		
		String line = null;
		BufferedReader br = new BufferedReader(new FileReader("f.txt"));
		while ((line = br.readLine()) != null) {
			list.add(line);
		}
		
		br.close();
		
		for (String string : list) {
			System.out.println(string);
		}
		
	}

}

18. 随机获取文本文件中的姓名案例

package zywaf.yty.practice_03;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class GetRandomName {

	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new FileReader("乌鸦高校.txt"));
		List<String> list = new ArrayList<String>();
		String line = null;
		while ((line = br.readLine()) != null) {
			list.add(line);
		}
		
		br.close();
	
		Random r = new Random();
		int index = r.nextInt(list.size());
		
		String name = list.get(index);
		System.out.println(name);
	
	}

}

19. 复制单级文件夹案例

package zywaf.yty.practice_04;

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

public class CopyFolderDemo {

	public static void main(String[] args) throws IOException {
		
		File srcFolder = new File("/Users/yangtengyu/desktop/CSDN/尔康");
		File destFolder = new File("/Users/yangtengyu/desktop/CSDN/还珠格格");

		if (!destFolder.exists()) {
			destFolder.mkdir();
		}
		
		File[] fileArray = srcFolder.listFiles();
		
		for (File file : fileArray) {
			String name = file.getName();
			File newFile = new File(destFolder, name);
			
			copyFile(file,newFile);
		}

	}

	private static void copyFile(File file, File newFile) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile));
		
		byte[] bys = new byte[1024];
		int len = 0;
		while ((len = bis.read(bys)) != -1) {
			bos.write(bys, 0, len);
		}
		
		bos.close();
		bis.close();
	}

}

20. 复制指定目录下指定后缀名的文件并修改名称案例

package zywaf.yty.practice_05;

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

public class CopyFolderDemo {

	public static void main(String[] args) throws IOException {
		
		File srcFolder = new File("/Users/yangtengyu/desktop/Java Code/JavaSE_day16/src/zywaf/yty/practice_03");
		File destFolder = new File("/Users/yangtengyu/desktop/CSDN/尔康");
		
		if (!destFolder.exists()) {
			destFolder.mkdir();
		}
		
		File[] fileArray = srcFolder.listFiles(new FilenameFilter() {
			
			@Override
			public boolean accept(File dir, String name) {
			
				return new File(dir, name).isFile() && name.endsWith(".java");
			}
		});
		
		for (File file : fileArray) {
			String name = file.getName();
			File newFile = new File(destFolder, name);
			copyFile(file,newFile);
		}
		
		File[] destFileArray = destFolder.listFiles();
		for (File destFile : destFileArray) {
			String name = destFile.getName();
			String newName = name.replaceAll(".java", ".jad");
			
			File newFile = new File(destFolder, newName);
			destFile.renameTo(newFile);
		}
		
	}

	private static void copyFile(File file, File newFile) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile));
		
		int len = 0;
		byte[] bys = new byte[1024];
		while ((len = bis.read(bys)) != -1) {
			bos.write(bys, 0, len);
		}
		bos.close();
		bis.close();
	}

}

21. 把一个文件中的字符串排序后再写入另一个文件案例

package zywaf.yty.practice_06;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

public class StringDemo {

	public static void main(String[] args) throws IOException {
	
		BufferedReader br = new BufferedReader(new FileReader("s1.txt"));
		
		String line = br.readLine();
		br.close();
		
		char[] chs = line.toCharArray();
		
		Arrays.sort(chs);
		
		String s = new String(chs);
		
		BufferedWriter bw = new BufferedWriter(new FileWriter("s2.txt"));
		bw.write(s);
		bw.newLine();
		bw.flush();
		bw.close();
		
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值