FileReader 读取文件
import java.io.FileReader;
import java.io.IOException;
public class Demo1_FileReader {
public static void main(String[] args) throws IOException {
// Demo1();
FileReader fr = new FileReader("m.txt");
int b ;
while ( (b = fr.read()) != -1){
System.out.println((char)b);
}
fr.close();
}
private static void Demo1() throws IOException {
FileReader fr = new FileReader("m.txt");
int x = fr.read();
System.out.println(x);
System.out.println((char)x);
}
}
FileWriter 字符写入文件
import java.io.FileWriter;
import java.io.IOException;
public class Demo2_FileWriter {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("output.txt");
String s = "这只羊叫Leon";
fw.write(s);
fw.flush();
fw.close();
}
}
字符复制
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo3_ReaderWriter {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt");
int b ;
while ( (b = fr.read()) != -1){
fw.write(b);
}
fr.close();
fw.close();
}
}
什么情况使用使用字符流
- 字符流也能复制文件, 但不推荐, 字节->字符, 字符->字节 多一步转换
- 程序需要读取一段文本, 或都需要写入一段文本的时候可以使用字符流
- 读取的时候按字符读出, 不会出现半个中文
- 写出时可直接字符串写出, 不用转换为字节数组
- 图片类文件不能使用字符流复制, 丢失数据
自定义数组复制
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo4_ReaderWriter {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt");
char[] arr = new char[1024];
int len;
while ( (len = fr.read(arr)) != -1){
fw.write(arr, 0 , len);
}
fr.close();
fw.close();
}
}
BufferedReader 和 BufferedWriter 读取写入字符
import java.io.*;
public class Demo5_BufferedReader {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));
int b ;
while ( (b=br.read()) != -1){
bw.write(b);
}
br.close();
bw.close();
}
}
BufferedReader readLine()方法, BufferedWriter 的newLine方法
- newLine 没有放在write(line)后, 并写在循环内, 这样写多写一个空行
import java.io.*;
public class Demo6_ReadLine {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));
String line ;
if( (line = br.readLine() ) != null ){
bw.write(line);
}
while ( (line = br.readLine()) != null){
bw.newLine();
bw.write(line);
}
br.close();
bw.close();
}
}
练习, 读取行, 并行数反向输出
- 流, 最好晚开早关
import java.io.*;
import java.util.ArrayList;
public class Demo7_ReverseLine {
public static void main(String[] args) throws IOException {
ArrayList<String> arrayList = new ArrayList<>();
String str ;
BufferedReader br = new BufferedReader(new FileReader("input.txt"));
while( ( str=br.readLine()) != null){
arrayList.add(str);
}
br.close();
BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));
for(int i= arrayList.size()-1;i>=0 ;i--){
bw.write(arrayList.get(i));
if( i == 0 ){
break;
}
bw.newLine();
}
bw.close();
}
}
LineNumberReader
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class Demo8_LineNumberReader {
public static void main(String[] args) throws IOException {
LineNumberReader lnr = new LineNumberReader(new FileReader("input.txt"));
String line;
lnr.setLineNumber(3);
while ( (line = lnr.readLine()) != null){
System.out.println(lnr.getLineNumber() + " "+line);
}
lnr.close();
}
}
装饰设计模式
- 使用被装饰的类, 对类中方法升级增加内容
- 好处
- 耦合性不强, 被装饰类的变化与装饰类的变化无关
public class Demo9_Wrap {
public static void main(String[] args) {
JiuCai j = new JiuCai(new Student());
j.code();
}
}
class Student {
private String name;
private int age;
public void code(){
System.out.println("C");
System.out.println("Java");
}
}
interface Coder{
public void code();
}
class JiuCai implements Coder{
JiuCai (Student stu){
this.stu = stu;
}
private Student stu;
@Override
public void code() {
stu.code();
System.out.println("JavaEE");
System.out.println("SprintBoot");
}
}
使用指定被码表读写字符
utf8格式写到gbk中, 乱码
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo10_UTF8 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("utf8.txt");
FileWriter fw = new FileWriter("gbk.txt");
int b ;
while (( b=fr.read()) != -1){
fw.write(b);
}
fr.close();
fw.close();
}
}
private static void Demo2() throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("utf-8.txt"),"utf-8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk");
int b ;
while ( ( b=isr.read()) != -1 ){
osw.write(b);
}
isr.close();
osw.close();
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader
(new InputStreamReader(new FileInputStream("utf-8.txt"),"utf-8"));
BufferedWriter bw = new BufferedWriter
(new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk"));
int b ;
while ( (b=br.read()) != -1){
bw.write(b);
}
br.close();
bw.close();
}
练习, 统计字符, 并输出到一个文件中
import java.io.*;
import java.util.Map;
import java.util.TreeMap;
public class Demo11_CalculatorChar {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader (new FileReader("utf-8.txt"));
TreeMap<String,Integer> treeMap = new TreeMap<>();
int b ;
while ( (b=br.read()) != -1){
if( treeMap.containsKey(String.valueOf((char)b))){
treeMap.put(String.valueOf((char)b),treeMap.get(String.valueOf((char)b))+1);
} else {
treeMap.put(String.valueOf((char)b), 1);
}
}
br.close();
BufferedWriter bw = new BufferedWriter(new FileWriter("times.txt"));
for(Map.Entry<String,Integer> stringIntegerEntry : treeMap.entrySet()){
if( "\n".equals(stringIntegerEntry.getKey())){
bw.write(stringIntegerEntry.getValue()+"="+"\\n");
} else if( " ".equals(stringIntegerEntry.getKey()) ){
bw.write(stringIntegerEntry.getValue()+"="+"space");
} else {
bw.write(stringIntegerEntry.getValue()+"="+stringIntegerEntry.getKey());
}
bw.newLine();
}
bw.close();
}
}
模拟软件剩余使用次数
import java.io.*;
public class Demo12_CalculatorTimes {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("license.txt"));
String str;
str = br.readLine();
br.close();
int times = Integer.parseInt(str);
if( times <= 0){
System.out.println("试用结束, 请购买正版");
} else if( times > 0){
System.out.println("还可以使用"+times+"次");
times = times - 1;
}
BufferedWriter bw = new BufferedWriter(new FileWriter("license.txt"));
bw.write(String.valueOf(times));
bw.close();
}
}
递归
public static int demo1(int nu){
if(nu > 1){
nu = nu * demo1(nu - 1);
}
return nu;
}
递归找.java结尾的文件
import java.io.File;
import java.util.Scanner;
public class Demo14_DiGui2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str;
while (true){
if( sc.hasNext()){
str=sc.nextLine();
break;
}
}
File file = new File(str);
if(file.exists()){
printJavaFile(file);
} else{
System.out.println("文件夹不存在");
}
}
private static void printJavaFile(File file) {
File[] arrayList ;
arrayList = file.listFiles();
for(File f : arrayList) {
if (f.isDirectory()) {
printJavaFile(f);
} else if (f.isFile() && f.getName().endsWith(".java")) {
System.out.println(f.getAbsoluteFile());
}
}
}
}