总类为
reader
writer
主要用于
只读纯文本
只写纯文本
底层其实是
读入的时候 把字节转换成字符
输出的时候 把字符转换成字节
依赖码表
基本操作代码
用的特别少
因为 字节 ->字符 ->字节 特别的麻烦
import java.io.FileReader;
import java.io.FileWriter;
public class Main{
public static void main(String[] args) throws Exception {
FileReader fr = new FileReader("xxx.txt");
FileWriter fw = new FileWriter("xxxcopy.txt");
int c;
while((c = fr.read()) != -1) {
fw.write(c);
}
fr.close();
fw.close(); //writer中有2KB (1024个字符 一个字符占两个字节 )的缓冲区 如果不关闭的话 可能内容会有缺失(要刷新)
}
}
定义小数组
import java.io.FileReader;
import java.io.FileWriter;
public class Main{
public static void main(String[] args) throws Exception {
FileReader fr = new FileReader("xxx.txt");
FileWriter fw = new FileWriter("xxxcopy2.txt");
char arrc[] = new char[1024];
int len;
while((len = fr.read(arrc)) != -1) {
fw.write(arrc ,0 ,len);
}
fr.close();
fw.close();
}
}
带缓冲的字符流
BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("xxxcopy3.txt"));
int i;
while((i = br.read()) != -1) {
bw.write(i);
}
br.close();
bw.close();
readline
newline 类似与\r\n 不过区别是
newline是跨平台操作 \r\n只支持Windows系统
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("aaa.txt"));
String line;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); //写出回车换行符
//bw.write("\r\n");
}
br.close();
bw.close();
}
读取纯文本文件 并且反转内容
利用集合进行反转!
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
public class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("xxxcopy3.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("xxxcopy3rev.txt"));
ArrayList<String> list = new ArrayList<>();
String line;
while((line = br.readLine()) != null) {
list.add(line);
}
for(int i=list.size()-1 ;i>0;i--) {
bw.write(list.get(i));
bw.newLine();
}
br.close();
bw.close();
}
}
lineNumberReadr
功能 添加了行号
import java.io.FileReader;
import java.io.LineNumberReader;
public class Main{
public static void main(String[] args) throws Exception {
LineNumberReader lnr = new LineNumberReader(new FileReader("xxxcopy3.txt"));
String line;
lnr.setLineNumber(100);
while((line = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber()+" : "+line);
}
lnr.close();
}
}
装饰设计模式 降低耦合性 不要用继承 否则如果父类更改的话 那么对子类的影响很大
关键是装饰类的使用
public class Main{
public static void main(String[] args) throws Exception {
Student s = new Student();
s.code();
System.out.println("=======================");
NBStudent nbs = new NBStudent(s);
nbs.code();
}
}
interface Coder{
public void code();
}
class Student implements Coder{
@Override
public void code() {
System.out.println("C");
System.out.println("JAVA");
System.out.println("C++");
}
}
class NBStudent implements Coder{
private Student s; //获取被装饰类的引用
public NBStudent(Student s) {
this.s = s;
}
@Override
public void code() {
s.code();
System.out.println("Android");
System.out.println("MySQL");
System.out.println("OpenGL");
}
}
使用不同码表来读写
主要使用了
InputStreamReader 是一个字符流 功能是字符流与字节流的桥梁 用其构造方法来实现不同码表之间的转换
同理 OutputStreamWriter( out Stream, String charset)
两个参数一个是字节流对象 一个是指定的码表
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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 Main{
public static void main(String[] args) throws Exception {
// demo1();
BufferedReader br =
new BufferedReader(new InputStreamReader(new FileInputStream("utf-8.txt"), "utf-8"));
BufferedWriter bw =
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk"));
String line;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
br.close();
bw.close();
}
public static void demo1() throws FileNotFoundException, IOException {
//默认版本 eclipse是用 gbk
BufferedReader br = new BufferedReader(new FileReader("utf-8.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("gbk.txt"));
String line;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
br.close();
bw.close();
}
}
详细图解
记录每个字符出现的次数 使用IO流来生成一个记录次数的txt文件
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.TreeMap;
public class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("xxxcopy3.txt"));
TreeMap<Character, Integer> tm = new TreeMap<>();
int ch;
while((ch = br.read()) != -1) {
char c = (char)ch;
tm.put(c, tm.containsKey(c) ? tm.get(c)+1 : 1 );
}
br.close();
BufferedWriter bw =new BufferedWriter(new FileWriter("times.txt"));
for(Character key : tm.keySet()) {
switch(key) {
case '\t' :
bw.write("\\t" + "=" +tm.get(key));
break;
case '\n' :
bw.write("\\r"+"="+tm.get(key));
break;
case '\r' :
bw.write("\\n"+"="+tm.get(key));
break;
default :
bw.write(key+"="+tm.get(key));
break;
}
bw.newLine();
}
bw.close();
}
}
对同一文件进行IO流操作
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class Main{
public static void main(String[] args) throws Exception {
//读入文件
BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));
BufferedWriter bw = null;
String s;
while((s = br.readLine()) !=null) {
int count = Integer.parseInt(s);
if(count <=0) {
System.out.println("您的使用次数还有0次 ,请购买正版");
break;
}
count--;
System.out.println("您的使用次数还有"+count +"次");
//写出文件 文件如果存在就全部清空
bw =new BufferedWriter(new FileWriter("xxx.txt"));
bw.write(count+"");
}
br.close();
if(bw != null) {
bw.close();
}
}
}
利用递归搜索文件夹中的所有java文件
import java.io.File;
import java.util.Scanner;
public class Main{
public static void main(String[] args) throws Exception {
File Dir = getDir();
printJava(Dir);
}
public static File getDir()
{
Scanner sc = new Scanner(System.in);
while(true) {
String s = sc.nextLine();
File Dir = new File(s);
if(!Dir.exists()) {
System.out.println("文件夹路径有误 请重新输入");
}else if(Dir.isFile()) {
System.out.println("您输入的是文件路径 不是文件夹路径");
}else if(Dir.isDirectory()) {
return Dir;
}
}
}
public static void printJava(File dir)
{
File[] subFiles = dir.listFiles();
for (File file : subFiles) {
if(file.isFile() && file.getName().endsWith(".java")) {
System.out.println(file);
}else if(file.isDirectory()) {
printJava(file);
}
}
}
}