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();
}
}