java基础复习(十九)

字符流

FileReader fr = new FileReader("new.txt");
int x = fr.read();
while((x = fr.read()) != -1){
System.out.println(x);
}
fr.close();
//GBK码表

java.io.Writer

FileWriter fw = new FileWriter("new1.txt");
fw.write("hello world!");
fw.close();
//字符流在写入的时候,可以直接写进去 不像字节流里面要先转成字节数组再写入

字符流拷贝

FileReader fr = new FileReader("xxx.txt");
FileWriter fw = new FileWriter("yyy.txt");

int c;
while((c = fr.read())!= -1){
    fw.write();
}
fr.close();
fw.close();
//如果流没有关,没有字符写入,那就意味着这些数据在缓冲区里面。

writer类中有一个2k的小缓冲区,如果不关流,就会将内容写到缓冲区里,关流会将缓冲区内容刷新出来再关闭。

  • 字符流可以拷贝文本文件但不推荐使用,因为读取时会把字节流转为字符,写出时还要把字符转回字节。
  • 程序需要读取一段文本,或者需要写出一段文本的时候可以使用字符流。

字符流是否可以拷贝非纯文本文件

  • 不可以拷贝非纯文本文件
  • 因为在读的时候会将字节转换为字符,在转换过程中可能找不到对应的字符,就会用?代替,写出的时候会将字符转换字节写出
  • 如果是?直接写出,这样写出之后的文件就乱了,看不了

自定义字符数组的拷贝

//字符流不能拷贝纯文本文件
FileReader fr = new FileReader("xxx.txt");
FileWriter fw = new FileWriter("yyy.txt");

char[] arr = new char[1024];
int len;
while((len = fr.read(arr)) != -1){//将文件中的数据读取到字符数组中
    fw.write(arr,0,len);//将字符数组中的数据写到文件中
}
fr.close();
fw.close();

带缓冲区的字符流

BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));
int c;
while((c = br.read())!=-1){
    bw.write(c);
}
br.close();
bw.close();

readLine ()读取一个文本,一行一行读,读到没有就返回null

BufferedReader br =new BufferedReader(new FileReader("xxx.txt"));
BUfferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));
String line;
while(( line = br.readLine())!=null){
    bw.write(line);
    bw.newLine();//相当于回车换行符 
}
br.close();
bw.close();

newLine();和rn的区别:

newLine是通用换行符,而rn是windows下的换行符

将文本反转

分析:

1.创建输入输出流对象

2.创建集合对象

3.将读到的数据存储在集合中

4.倒着遍历集合将数据写到文件上

5.关流

--流对象晚开早关--

LineNumberReader

设置和获取行号

setLineNumber();

getLineNumber();

设计模式

IO流(装饰设计模式)

套路----

interface Coder{
    public void code();
}
class Student implements Coder {
    System.out.println("java se");
    System.out.println("java web");
}
class HeiMaStudent implements Coder {
    private Student s;//获取学生引用
    public HeiMaStudent(Student s) {
        this.s = s;
    }
    @Override
    public void code() {
        s.code();
        System.out.println("ssh");
    }
}

//耦合性没那么强

//装饰设计模式的好处

//用默认编码表进行读写

耦合性不强,被装饰类的变化与装饰类无关。

使用指定的码表

构造方法

InputStreamReader isr = new InputStreamReader(new FIleInputStream("xxx.txt"),"utf-8");

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk");

int c ;
while((c = isr.read()) != -1){
    osw.write(c);
}
isr.close();
osw.close();

1556069981615

IO流(获取文本上字符出现的次数)

获取一个文本上每个字符出现的出书,将结果写到times.txt

分析:

1.创建带缓冲的输入流对象

2.创建双列集合对象TreeMap

3.将读到的字符存储在双列集合中,存储的时候要做判断,如果不包含这个键,就将键和1存储,如果包含这个键,就将给键和值+1存储

4.关闭输入流

5.创建输出流对象

6.遍历集合将集合中的内容写到times.txt

7.关闭输出流

大多数的简单if-else都可以用 三元运算符代替,简化代码

试用版软件

  • 创建带缓冲流对象,因为要使用readLine方法,可以保证数据原样性
  • 将读到的字符串转换为int数
  • 对int数进行判断,如果大于0,就将其--写回去,如果不大于0,就提示请购买正版
  • 在if判断中要将结果打印,并将结果通过输出流写道文件上。

递归:方法自己调用自己

五的阶乘

for循环要明确次数,而递归是可以不用明确次数的

int result = 1;
for(int i = 1 ;i <= 5;i++){
    result = result *i;
}
System.out.println(result);

递归

5fun(4)fun(3)fun(2)fun(1)

fun(int num){
    if( num == 1){
        return num *fun(num -1);
    }
}

StackOverFlower栈内存溢出 如果数字特别大的话

递归的弊端:

不能调用次数过多,容易导致栈内存溢出

递归的好处:

不用知道循环的次数

构造方法是否可以递归调用

构造方法不能使用递归调用

递归调用是否必须有返回值

不一定

本文链接:

https://heyzen.club/index.php/J/267.html
1 + 8 =
快来做第一个评论的人吧~