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

it2022-05-09  34

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 : 一次读取一行数据。包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 nullBufferedWriter 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//尔康"); File destFolder = new File("/Users/yangtengyu/desktop//还珠格格"); 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//尔康"); 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)