Java 21-2 IO技术字符流
2019-01-29 本文已影响0人
第二套广播体操
发现 文本数据 媒体文件字节流没问题 但是对于文本文件 想要操作文件中的中文数据时 字节流只能操作字节
需要我们转码成字符 麻烦
所以到Api查找 字符流 字节到字符的桥梁对象(字节流的基础上添加字符流)
Reader
|--InputStreamReader:字节转字符
Writer
|--OutPutStreamReader:字符转字节
出现了中文编码问题
为了便捷操作字符文件 找到了转换流的子类 但是他有局限性 只能操作文件 而且默认编码
如果不操作文件 而且编码不是默认的 需要转换流
Reader
|--InputStreamReader:字节转字符
|--FileReader
Writer
|--OutPutStreamReader:字符转字节
|--FileWriter 只能操作文本
为了挺高效率 引用了字符串的缓冲区
Reader
|--InputStreamReader:字节转字符
|--FileReader
|--BufferedReader
Writer
|--OutPutStreamReader:字符转字节
|--FileWriter
|--BufferedWriter
public class Reader_Test1 {
public static void main(String[] args) throws IOException {
File file=new File("D:\\TEST.txt");
if (!file.exists()) {
file.createNewFile();
}
OutputStream ops=new FileOutputStream(file,true);
Writer writer=new OutputStreamWriter(ops);
// 只能操作字符数据
writer.write("yusongjiang");
// 缓冲转换成汉字 所以需要刷新
// 刷新 或者关闭字符流才可以获取到文件中 会存储在缓冲区里因为需要查表
writer.close();
// 关闭字符流就关闭了字节流
}
}
InputStreamReader
方法摘要
一次读一个字符
public class FileReader_Tesr1 {
public static void main(String[] args) throws IOException {
File file=new File("D:\\TEST.txt");
FileReader fr=new FileReader(file);
int ch=0;
while ((ch=fr.read())!=-1)
System.out.println((char) ch);
fr.close();
}
}
将复制文本
public class FileReader_Test2 {
public static void main(String[] args) throws IOException {
File file=new File("D:\\TEST.txt");
FileReader fr=new FileReader(file);
FileWriter fw=new FileWriter("D:\\TEST副本.txt");
char[] buf=new char[1024];
int len=0;
while ((len=fr.read(buf))!=-1)
fw.write(buf,0,len);
fr.close();
fw.close();
// 记得关闭
}
}
OutputStreamWriter
方法
public class FileWriter_Test1 {
public static void main(String[] args) throws IOException {
File file=new File("D:\\TEST.txt");
FileWriter fw=new FileWriter(file);//只能操作文件
// 等价于 FileOutputStream fos=new FileOutputStream(file);
// OutputStreamWriter osw=new OutputStreamWriter(fos);
fw.write("你好");
fw.close();
}
}
BufferedWriter
BufferedReader
BufferedWriter方法
将文件中的所有.java文件写入txt中
public class BufferWriter_Test2 {
public static void main(String[] args) {
File file=new File("C:\\Users\\Yu\\IdeaProjects\\Study\\src\\it");
outPutNames(file);
}
private static void outPutNames(File file) {
ArrayList<File> list=new ArrayList<>();
FileFilter filter=new NameFilter(".java");
getFile(file,filter,list);
BufferedWriter bw=null;
try {
bw= new BufferedWriter(new FileWriter("D:\\TEST.txt"));
for (File f:
list) {
// 循环集合 并通过BufferedWriter写入文本
bw.write(f.getAbsolutePath());
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (bw!=null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private static void getFile(File file, FileFilter filter, ArrayList<File> arrayList) {
File[] files=file.listFiles();
for (File f :
files) {
if (f.isDirectory())
getFile(f,filter,arrayList);
else {
if (filter.accept(f))
arrayList.add(f);
}
}
}
}
过滤器
public class NameFilter implements FileFilter {
private String string;
public NameFilter(String string) {
this.string = string;
}
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(string);
}
}