java读取文件

看到有人用 IOUtils.readLines(xxxx) 来进行文件的读取,有点陌生,-_-

要做的事情是按行读取一个很大的文件,然后每一行的数据用户进行一次rpc调用查询,查询的结果再保存到另一个文件中。

 

1. IOUtils 是 apcahe提供的 io操作包中  下的一个类 

 // 原来做的事情就是将 按行读取文件,然后保存到List中
1
public static List<String> readLines(final Reader input) throws IOException { 2 final BufferedReader reader = toBufferedReader(input); 3 final List<String> list = new ArrayList<>(); 4 String line = reader.readLine(); 5 while (line != null) { 6 list.add(line); 7 line = reader.readLine(); 8 } 9 return list; 10 }

按行读取完后,可以通过 stream 来进行后面的处理。

 

2. xxxReader 和 xxxStream 的区别? 

 BufferedReader bufferedReader = new BufferedReader(new FileReader(sourcePath));
 String str = bufferedReader.readLine()

 

BufferedReader 中 聚合 了一个 Reader 变量.

FileReader  继承   InputStreamReader.    继承   Reader 

InputStream 中 聚合了一个 StreamDecoder 类型的对象, 该对象的创建需要传入一个 InputStream 类型的对象, 在 FileReader的创建中,构造函数中创建了一个 FileInputStream类型的对象。

通过 xxxReader 来读取文件,内部都是通过聚合的 xxxInputStream来进行读取的。

xxxStream 是一个byte 一个 byte 的来进行读取, 也可以一次读取多个字节

xxxReader 通常是一次读取多个字节,然后缓存到一个byte数组中,再进行后面的操作。如 readLine

 

3. BufferedReader  

public class BufferedReader extends Reader {

    private Reader in;   // 

    private char cb[];           //  
    private int nChars, nextChar;

    private static final int INVALIDATED = -2;
    private static final int UNMARKED = -1;
    private int markedChar = UNMARKED;
    private int readAheadLimit = 0; /* Valid only when markedChar > 0 */

    /** If the next character is a line feed, skip it */
    private boolean skipLF = false;

    /** The skipLF flag when the mark was set */
    private boolean markedSkipLF = false;

    private static int defaultCharBufferSize = 8192;
    private static int defaultExpectedLineLength = 80;

    /**
     * Creates a buffering character-input stream that uses an input buffer of
     * the specified size.
     *
     * @param  in   A Reader
     * @param  sz   Input-buffer size
     *
     * @exception  IllegalArgumentException  If {@code sz <= 0}
     */
    public BufferedReader(Reader in, int sz) {
        super(in);
        if (sz <= 0)
            throw new IllegalArgumentException("Buffer size <= 0");
        this.in = in;
        cb = new char[sz];          // 缓存数组
        nextChar = nChars = 0;
    }

    /**
     * Creates a buffering character-input stream that uses a default-sized
     * input buffer.
     *
     * @param  in   A Reader
     */
    public BufferedReader(Reader in) {
        this(in, defaultCharBufferSize);
    }
----

 

posted @ 2021-07-25 13:30  你眼里的星辰  阅读(832)  评论(0)    收藏  举报