20201016冯强

学习总结:

1 字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

2 输入流

2.1 输入字符流(Reader

java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。下面是 Reader 的体系:

image-20201016221104029

public abstract class Reader implements Readable, Closeable{
    protected Reader();
    protected Reader(Object lock)
        //它是个抽象类,因此不能被实例化。
}

2.2实例方法

public void close() :关闭此流并释放与此流相关联的任何系统资源。

public int read() : 从输入流读取一个字符。

public int read(char[] cbuf) : 从输入流中读取一些字符

public abstract int read(char[] cbuf, int off, int len) : 从输入流中读取一些字符

public int read(CharBuffer target) :将字符读入指定的字符缓冲区

public void mark(int readAheadLimit) :标记流中的位置

public boolean ready() : 流是否准备好被读取

public void reset() : 重置流

public long skip(long n) : 跳过字符

2.3 FileReader

java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

2.3.1 构造方法

FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。

FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。

File file = new File("D:\\temp\\a.txt"); 

FileReader reader = new FileReader(file); 

FileReader reader1 = new FileReader("D:\\temp\\a.txt");

构造方法内部都是调用了父类的构造方法,传入一个 FileInputStream 对象。

2.3.2 实例方法

FileReader 中的所有方法都来自其父类 InputStreamReader ,没有重写任何方法同时也没有扩展的方法。也就是说,学习了 FileReader 同时也学习了 InputStreamReader .

2.2.4 读取多个字符
// 使用文件名称创建流对象 
FileReader fr = new FileReader("D:/temp/reader2.txt"); 
// 定义变量,保存有效字符个数 
int len; // 定义字符数组,作为装字符数据的容器
char[] cbuf = new char[2]; 
// 循环读取 
while ((len = fr.read(cbuf)) != -1) 
{
    System.out.println(new String(cbuf));
}// 关闭资源 fr.close();

2.4 BufferedReader

java.io.BufferedReader 从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。 它是一个缓冲流。

BufferedReader 继承了 Reader 中所有 public 方法,还扩展了一个方法:

public String readLine()//读取一行文字

当 readLine() 读取完毕时,返回 null

2.5增强try

public static void main(String[] args) throws IOException {
    FileOutputStream out = null;
    OutputStreamWriter writer = null;
    try {
        out = new FileOutputStream("d:/temp/outStreamWriter.txt"); Charset set =                     Charset.forName("utf-8");
        writer = new OutputStreamWriter(out, set); 
        System.out.println("编码格式为: " + writer.getEncoding());
        writer.write("站在那别动,我去买橘子");
    } catch (IOException e) { 
        e.printStackTrace(); 
    }finally {
        //关闭资源
        writer.close(); out.close();
    }
}

3.序列化(Serializable)

public interface Serializable { 

} 

3.1例子

package com.ittzb.demo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Demo {
    public static void main(String[] args) {
        Student student =new Student(11,"zs","女");
        
        try(FileOutputStream fs = new FileOutputStream("D:\\lol\\temp.txt");
                ObjectOutputStream oss = new ObjectOutputStream(fs)) {  
                    oss.writeObject(student);
                }
    catch (IOException e) {
    }
}
}

class Student implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Integer age;
    private String name;
    private String gender;
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [age=" + age + ", name=" + name + ", gender=" + gender + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public Student(Integer age, String name, String gender) {
        super();
        this.age = age;
        this.name = name;
        this.gender = gender;
    }
    
}

package com.ittzb.demo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Demo02 {
    public static void main(String[] args) {
         try(FileInputStream fs = new FileInputStream("D:\\lol\\temp.txt");
                 ObjectInputStream oss = new ObjectInputStream(fs)
                 ){
             Object o =oss.readObject();
             System.out.println(o.getClass());
             if(o instanceof Student) {
                 Student stu = (Student)o;
                 System.out.println(stu);
             }
             
         } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

作业:

package com.ittzb.demo;

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.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

public class Exam {
    
public static void main(String[] args) {
     Exam ex =new Exam();
     Map<Integer,String> map = ex.getMap("D:\\lol\\temp.txt");
        Set<Map.Entry<Integer, String>> entrys =map.entrySet();
        Iterator<Map.Entry<Integer, String>> iter = entrys.iterator();
        while (iter.hasNext()) {
            Map.Entry<Integer, String> en =iter.next();
            System.out.println(en.getValue());
        }
    ex.sort(map,"D:\\\\lol\\\\temp1.txt");
} 
public Map<Integer,String> getMap(String path) {
    Map<Integer,String> map =new TreeMap<Integer,String>(
            (c1,c2)->{
                return c1-c2;
            }
            );
    try(    FileReader fis = new FileReader(path);
            BufferedReader br = new BufferedReader(fis)){
        String line = null;
        int breakWhile= br.read();
        while((line = br.readLine()) != null) {
            map.put(breakWhile,line);
             breakWhile= br.read();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return map;
}

public void  sort(Map<Integer,String> map,String path) {
    
    try(FileWriter fw = new FileWriter(path);
            BufferedWriter bf = new BufferedWriter(fw)
            ){
        Set<Map.Entry<Integer, String>> entrys =map.entrySet();
        Iterator<Map.Entry<Integer, String>> iter = entrys.iterator();
        while (iter.hasNext()) {
            Map.Entry<Integer, String> en =iter.next();
            bf.write(en.getKey());
            bf.write(en.getValue());
            bf.newLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}



标签

评论

this is is footer