A.转换流
l 由于字节流操作中文不是特别方便,所以,java就提供了转换流。
l 字符流=字节流+编码表。
package com.core.io.demo;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
//String---byte
String s = "你好";
byte[] bs1 = s.getBytes();
byte[] bs2 = s.getBytes("GBK");
byte[] bs3 = s.getBytes("utf-8");
System.out.println(Arrays.toString(bs1));//[-60, -29, -70, -61]
System.out.println(Arrays.toString(bs2));//[-60, -29, -70, -61]
System.out.println(Arrays.toString(bs3));//[-28, -67, -96, -27, -91, -67]
//bye----String
byte[] bs4 = {-60, -29, -70, -61};
System.out.println(new String(bs4));//你好
System.out.println(new String(bs4,"GBK"));//你好
byte[] bs5 = {-28, -67, -96, -27, -91, -67};
System.out.println(new String(bs5,"utf-8"));//你好
System.out.println(new String(bs5));//浣犲ソ
System.out.println(new String(bs4,"utf-8"));//???
}
}
B.转换流OutputStreamWriter
package com.core.io.demo;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class Test2 {
// 转换流,OutputStreamWriter的使用
public static void main(String[] args) throws UnsupportedEncodingException,
IOException {
// OutputStreamWriter(OutputStream out)
// 创建使用默认字符编码的 OutputStreamWriter。
// OutputStreamWriter(OutputStream out, Charset cs)
// 创建使用给定字符集的 OutputStreamWriter。
// OutputStreamWriter(OutputStream out, CharsetEncoder enc)
// 创建使用给定字符集编码器的 OutputStreamWriter。
// OutputStreamWriter(OutputStream out, String charsetName)
// 创建使用指定字符集的 OutputStreamWriter。
// OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
// "osw.txt"));// 默认使用GBK
// OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
// "osw.txt"),"GBK");// 指定使用GBK
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
"osw.txt"), "UTF-8");// 指定使用UTF-8
osw.write("中国UTF-8");// 不需要getbytes了
osw.close();
}
}
C.转换流InputStreamWriter
package com.core.io.demo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test3 {
// 转换流,InputStreamWriter的使用
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream(
"osw-gbk.txt"));
// 使用指定编码(gbk),读取数据
// 一次读取一个字符
int ch = 0;
while ((ch = isr.read()) != -1) {
System.out.print((char) ch);// 中国gbk
}
isr.close();
InputStreamReader isr2 = new InputStreamReader(new FileInputStream(
"osw-utf.txt"), "utf-8");// 使用指定字符集读取数据
int ch2 = 0;
while ((ch2 = isr2.read()) != -1) {
System.out.print((char) ch2);// 中国UTF-8
}
// 关资源
isr2.close();
}
}
D.字符流的5种写数据的方式
l OutputStreamWriter写数据方法
• public void write(int c)
• public void write(char[] cbuf)
• public void write(char[] cbuf,int off,int len)
• public void write(String str)
• public void write(String str,int off,int len)
l 字符流操作要注意的问题
• flush()的作用
• flush()和close()的区别
package com.core.io.demo;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Test4 {
// D.字符流的5种写数据的方式
// l OutputStreamWriter写数据方法
// • public void write(int c)
// • public void write(char[] cbuf)
// • public void write(char[] cbuf,int off,int len)
// • public void write(String str)
// • public void write(String str,int off,int len)
// l 字符流操作要注意的问题
// • flush()的作用
// • flush()和close()的区别
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"));
//写一个字符
osw.write(97);
osw.write('a');
//写一个字符数组
char[] chs = {'b','c','d',102,103};
osw.write(chs );
//写一个换行
osw.write("\n\r");
//写一个字符数组的一部分
osw.write(chs, 1, 2);
//写一个字符串
String str = "中国 China";
osw.write(str);
//写一个字符串的一部分
osw.write(str,0,2);
//刷新缓冲区
osw.flush();
osw.close();
// aabcdfg
//
// cd中国 China中国
}
}
E.字符流的2种读数据的方式
package com.core.io.demo;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test5 {
// 字符流读取数据的两种方式
public static void main(String[] args) throws IOException {
// A.一次读取一个字符
InputStreamReader isr = new InputStreamReader(new FileInputStream(
"file.java"));
int ch = 0;
while ((ch = isr.read()) != -1) {
System.out.print((char) ch);
}
isr.close();
// B.一次读取一个字符数组
System.out.println("-----------------");
InputStreamReader isr2 = new InputStreamReader(new FileInputStream(
"file.java"));
char[] chs = new char[1024];
int len = 0;
while((len = isr2.read(chs))!=-1){
System.out.print(new String(chs,0,len));
}
isr2.close();
}
}
F.字符流文件复制
package com.core.io.demo;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class Test6 {
// 字符流文件复制的两种方式
public static void main(String[] args) throws IOException {
// A.一次读取一个字符
InputStreamReader isr = new InputStreamReader(new FileInputStream(
"file.java"),"UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("fileA.java"),"UTF-8");
int ch = 0;
while ((ch = isr.read()) != -1) {
osw.write(ch);
}
isr.close();
osw.close();
// B.一次读取一个字符数组
System.out.println("-----------------");
InputStreamReader isr2 = new InputStreamReader(new FileInputStream(
"file.java"),"UTF-8");
OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream("fileB.java"),"UTF-8");
char[] chs = new char[1024];
int len = 0;
while((len = isr2.read(chs))!=-1){
osw2.write(chs, 0, len);
}
isr2.close();
osw2.close();
}
}
G.转换流的简化书写,FileReader&FileWriter
package com.core.io.demo2;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
// FileReader & FileWriter
FileReader fr = new FileReader("file.java");
FileWriter fw = new FileWriter("fileA.java");
// 方法1:一次读写一个字符
int ch;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
fr.close();
fw.close();
// 方法2:一次读写一个字符数组
FileReader fr2 = new FileReader("file.java");
FileWriter fw2 = new FileWriter("fileB.java");
int len =0;
char[] chs = new char[1024];
while((len = fr2.read(chs))!=-1){
fw2.write(chs, 0, len);
}
fr2.close();
fw2.close();
}
}
H.字符缓冲输出流BufferedWriter & 字符缓冲输入流BufferedReader
特殊用法
BufferedWriter
-newLine()
BufferedReader
-readLine()
使用字符缓存流复制数据的3种方式
package com.core.io.demo2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test2 {
// 使用字符缓存流复制数据3种方式
public static void main(String[] args) throws IOException {
method1();
method2();
method3();
}
// 使用字符缓存流的特殊方法读取数据
private static void method3() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("file.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("fileE.java"));
String line = null;
while((line = br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
// 关资源
br.close();
bw.close();
}
// 一次读写一个字符数组
private static void method2() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("file.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("fileD.java"));
int len = 0;
char[] chs = new char[1024];
while ((len = br.read(chs)) != -1) {
bw.write(chs, 0, len);
bw.flush();
}
// 关资源
br.close();
bw.close();
}
// 一次读写一个字符
private static void method1() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("file.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("fileC.java"));
int ch = 0;
while ((ch = br.read()) != -1) {
bw.write(ch);
}
// 关资源
br.close();
bw.close();
}
}
I .复制文本文件的5种方式案例(字符流)
FileWriter & FileReader: 一次读一个字符、一个读一个字符数组
BufferedWriter & BufferedReader : 一次读一个字符、一个读一个字符数组、特殊的方法(newLine()、readLine())
J.复制图片的4种方式案例(字节流)
FileOutputStream & FileInputStream: 一次读一个字符、一个读一个字符数组BufferedOutputStream & BufferedInputStream:一次读一个字符、一个读一个字符数组
K.文件和集合ArrayList
package com.core.io.demo2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class Test3 {
// ArrayList存进文件
// 文件取出来存到ArrayList
public static void main(String[] args) throws IOException {
ArrayList<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("java");
list.add("android");
FileWriter fw = new FileWriter("list.txt");
BufferedWriter bw = new BufferedWriter(fw);
for (String str : list) {
bw.write(str);
bw.newLine();
bw.flush();
}
bw.close();
System.out.println("-----------");
BufferedReader br = new BufferedReader(new FileReader("list.txt"));
ArrayList<String> list2 = new ArrayList<String>();
String line = null;
while((line= br.readLine())!=null){
list2.add(line);
}
br.close();
for (String str : list2) {
System.out.println(str);
}
}
}
L.复制单级文件夹案例
package com.core.io.demo2;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;
public class Test4 {
public static void main(String[] args) throws IOException {
// 复制单机文件夹
// E:\temp\a----》E:\temp\b
// method1();
// 复制单级目录指定后缀名并修改后缀名
System.out.println("over...");
method2();
}
private static void method2() throws IOException {
File srcFile = new File("e:\\temp\\a");
File desFile = new File("e:\\temp\\c");
if (!desFile.exists()) {
desFile.mkdir();
}
File[] listFiles = srcFile.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isFile() && name.endsWith(".java");
}
});
System.out.println(Arrays.toString(listFiles));
for (File file : listFiles) {
String name = file.getName();
File newFile = new File(desFile, name);
copyFile2(file, newFile);
String newName = name.replace(".java", ".jad");
File newNameFile = new File(desFile, newName);
newFile.renameTo(newNameFile);
}
}
private static void copyFile2(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();
}
private static void method1() throws IOException {
File srcFile = new File("e:\\temp\\a");
File[] listFiles = srcFile.listFiles();
File desFile = new File("e:\\temp\\b");
if (!desFile.exists()) {
desFile.mkdir();
}
for (File file : listFiles) {
String name = file.getName();
File newFile = new File(desFile, name);
copyFile(file, newFile);
}
}
private static void copyFile(File srcFile, File newFile) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(srcFile));
BufferedWriter bw = new BufferedWriter(new FileWriter(newFile));
if (!newFile.exists()) {
newFile.createNewFile();
}
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}
M.复制多级文件夹案例
package com.core.io.demo2;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;
public class Test5 {
public static void main(String[] args) throws IOException {
// 复制多级文件
File srcFile = new File("e:\\temp\\a");
File desFile = new File("e:\\temp\\b");
if (!desFile.exists()) {
desFile.mkdir();
}
copyFolder(srcFile, desFile);
System.out.println("over...");
}
private static void copyFolder(File srcFile, File desFile)
throws IOException {
if (srcFile.isDirectory()) {
File newFloder = new File(desFile, srcFile.getName());
newFloder.mkdir();
File[] listFiles = srcFile.listFiles();
for (File file : listFiles) {
copyFolder(file, newFloder);
}
} else {
String name = srcFile.getName();
System.out.println("复制文件:" + name);
File newFile = new File(desFile, name);
copyFile(srcFile, newFile);
}
}
private static void copyFile(File srcFile, File desFile) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
srcFile));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(desFile));
byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
bos.close();
bis.close();
}
}
N.LineNumberReader
package com.core.io.demo3;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class Test {
public static void main(String[] args) throws IOException {
//LineNumberReader
//是bufferedReader的子类
LineNumberReader lnr = new LineNumberReader(new FileReader("file.java"));
String line = null;
while((line = lnr.readLine())!=null){
int lineNumber = lnr.getLineNumber();
System.out.println(lineNumber+":"+line);
}
lnr.close();
}
}
IO流
|--字节流
|--字节输入流
InputStream
intread():一次读取一个字节
intread(byte[] bys):一次读取一个字节数组
|--FileInputStream
|--BufferedInputStream
|--字节输出流
OutputStream
voidwrite(int by):一次写一个字节
voidwrite(byte[] bys,int index,int len):一次写一个字节数组的一部分
|--FileOutputStream
|--BufferedOutputStream
|--字符流
|--字符输入流
Reader
intread():一次读取一个字符
intread(char[] chs):一次读取一个字符数组
|--InputStreamReader
|--FileReader
|--BufferedReader
StringreadLine():一次读取一个字符串
|--字符输出流
Writer
voidwrite(int ch):一次写一个字符
voidwrite(char[] chs,int index,int len):一次写一个字符数组的一部分
|--OutputStreamWriter
|--FileWriter
|--BufferedWriter
voidnewLine():写一个换行符
voidwrite(String line):一次写一个字符串