Java
处理流
- 节点流和处理流的关系
- 节点流处于IO操作的第一线,所有操作必须通过它们进行
- 处理流可以对其他流进行处理(提高效率和操作灵活性)
1.字节缓冲流
BufferedInputStream
BufferedOutputStream
public void fileCopy01() {
// 1.源文件
File file1 = new File("E:/xp/test/demo1.txt");
File file2 = new File("E:/xp/test/demo2.txt");
// 2.选择流
try {
InputStream is = new BufferedInputStream(new FileInputStream(file1));
OutputStream os = new BufferedOutputStream(new FileOutputStream(file2));
byte[] car = new byte[1024];
int len = 0;
while ((len = is.read(car)) != -1) {
os.write(car,0,len);
}
os.flush();
os.close();
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
2.字符缓冲流
BufferedReader
BufferedWriter
新方法:
readLine() 读取一行
newLine() 换行
public void fileCopy02() {
// 1. 源文件
File file01 = new File("E:/xp/test/demo1.txt");
File file02 = new File("E:/xp/test/demo2.txt");
// 2.选择流(有新方法,就不要使用多态)
try {
BufferedReader reader = new BufferedReader(new FileReader(file01));
BufferedWriter writer = new BufferedWriter(new FileWriter(file02));
String line = null;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine(); // 换行
}
writer.flush();
writer.close();
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
3. 转换流:字节流转为字符流 处理乱码(编码集,解码集)
编码与解码都是以程序为中心来说的
1. 编码与解码概念
- 编码:字符--->编码字符集--->二进制
- 解码:二进制--->解码字符集--->字符
2. 乱码
- 编码与解码的字符集不统一
- 字节缺少,长度丢失
3. 文件乱码
/**
* 编码与解码字符集不统一导致乱码
* @throws UnsupportedEncodingException
*/
public void test() throws UnsupportedEncodingException {
// 编码: char ---> byte
String str = "中国";
// 解码: byte ---> char
byte[] data = str.getBytes();
// 编码与解码字符集统一
System.out.println(new String(data));
// 设定编码字符集
data = str.getBytes("utf-8");
// 不统一,出现乱码
System.out.println(new String(data));
// 编码
byte[] data2 = str.getBytes("utf-8");
// 解码
str = new String(data2,"utf-8");
// 编码和解码统一
System.out.println(str);
}
/**
* 字节数不完整 导致的乱码
*/
public void test() {
String str = "中国";
byte[] data = str.getBytes();
// 字节数不完整 导致的乱码
System.out.println(new String(data,0,3));
}
转换流
InputStreamReader 读取字节流转换为字符流
OutputStreamWriter
public void test() {
try {
// 1. 源文件
File file = new File("E:/xp/test/Demo1.java");
// 2. 字节流
FileInputStream fileInputStream = new FileInputStream(file);
// 3. InputStreamReader是字节流到字符流的桥梁,并使用指定的charset将其解码为字符
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
// 4. BufferedReader从字符输入流中读取文本,缓冲字符,以提供字符,数组和行的高效读取
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 1. 输出源文件
File file1 = new File("E:/xp/test/Demo2.java");
// 2. 字节输出流
OutputStream outputStream = new FileOutputStream(file1);
// 3. 字节流转换为字符流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"utf-8");
// 4. 字节缓冲流
BufferedWriter writer = new BufferedWriter(outputStreamWriter);
String info = null;
while ((info = bufferedReader.readLine()) != null) {
System.out.println(info);
writer.write(info);
}
bufferedReader.close();
bufferedWriter.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}