20201016黄春跃

20201016黄春跃

知识点总结:

字符流

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

输入字符流(Reader)

public abstract class Reader implements Readable, Closeable 
   //它是个抽象类,因此不能被实例化

构造方法

protected Reader()
protected Reader(Object lock)

实例方法

它定义了字符输入流的基本共性功能方法。
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) : 跳过字符
由于 public abstract int read(char[] cbuf, int off, int len) 是抽象方法,所以所有子类
必须实现此方法。

FileReader

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");

读取单个字符

package ycdl.itlaobing.demo;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderTest {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("D:/temp/file-input.txt");
        int ch = fr.read();//读取单个字符 返回hashcode码
        System.out.println((char)ch);
        fr.close();//关闭流
}
}

读取多个字符

read() 方法,每次可以读取一个字符的数据,提升为 int 类型,读取到文件末尾,返回 -1 ,循环读

package ycdl.itlaobing.demo;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
 * read(char[] cbuf) ,1.每次读取 cbuf 的长度个字符到数组中,
 *                     2.返回读取到的有效字符个数,读取到末尾时,返回 -1
 */
public class FileReaderTest2 {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileReader fr = new FileReader("D:/temp/file-input.txt");
        FileWriter fw = new FileWriter("D:/temp/fileWriter.txt");
        // 定义变量,保存有效字符个数
        int len;
        // 定义字符数组,作为装字符数据的容器
        char[] cbuf = new char[2];
        // 循环读取
        while ((len = fr.read(cbuf)) != -1) {
//          for(char a:cbuf) {
//              System.out.print(a);
//          }
//          for(int i = 0; i<cbuf.length; i++) {
//              System.out.print(cbuf[i]);
//          }//次循环效果与new String结果一只
            
            
            fw.write(cbuf);
            
            
        System.out.print(new String(cbuf, 0, len));//源数组 下标[0,len)
        }
//      System.out.println(cbuf);
//      // 关闭资源
        fw.close();
        fr.close();
        
    }
}

BufferedReader

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

读取一行字符

package ycdl.itlaobing.demo;
/*
 * readLine()//读取一行文字
 */
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderTest {
    public static void main(String[] args) throws IOException {
        //创建流对象
        BufferedReader br = new BufferedReader(new FileReader("D:/temp/bufferReader.txt"));
        String line = null;
        while((line = br.readLine()) != null) {
            System.out.println(line);
        }
        br.close();
        
        
    }
}

InputStreamReader

java.io.InputStreamReader 是 Reader 的子类,是从字节流到字符流的桥:它读取字节,并使用指
定的 Charset 将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受
平台的默认字符集。

构造方法:

//创建一个使用默认字符集的InputStreamReader
public InputStreamReader(InputStream in)
//创建一个使用命名字符集的InputStreamReader
public InputStreamReader(InputStream in, String charsetName)
//创建一个使用给定字符集的InputStreamReader
public InputStreamReader(InputStream in, Charset cs)
//创建一个使用给定字符集解码器的InputStreamReader
public InputStreamReader(InputStream in, CharsetDecoder dec)

指定编码读取

package ycdl.itlaobing.demo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderTest {
    public static void main(String[] args) throws IOException {
        String fileName = "D://temp/InputStreamReader.txt";
        //创建对象 流,默认utf8编码
        InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName));
        //创建对象流,使用GBK编码
        InputStreamReader isr2 = new InputStreamReader(new FileInputStream(fileName), "GBK");
        // 定义变量,保存字符
        int read;
        // 使用默认编码字符流读取,编译正常
        while ((read = isr.read()) != -1) {
        System.out.print((char) read);
        }
        isr.close();
        System.out.println();
        // 使用指定编码字符流读取,乱码
        while ((read = isr2.read()) != -1) {
        System.out.print((char) read);
        }
        isr2.close();
    }
}

字符输出流【Writer】

构造方法:

protected Writer();
protected Writer(Object lock)

FileWriter

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

构造方法:

//构造一个给定文件名的FileWriter对象
public FileWriter(String fileName);
//构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据
public FileWriter(String fileName, boolean append);
//给一个File对象构造一个FileWriter对象
public FileWriter(File file);
//给一个File对象构造一个FileWriter对象
public FileWriter(File file, boolean append);
//构造与文件描述符关联的FileWriter对象
public FileWriter(FileDescriptor fd)

写出单个字符/多个字符

package ycdl.itlaobing.demo;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterTest {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("D://temp/fileWriter.txt");
        char[] c = {'a','b','c'};
        fw.write('a');//a
        fw.write(97);//a
        fw.write("你好");//你好
        fw.write(c);
        fw.flush();
        fw.close();
        System.out.println(c);
    }
}

BufferedWriter

java.io.BufferedWriter 是将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的
高效写入。 可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。是一
个缓冲流

构造方法:

//创建使用默认大小的输出缓冲区的缓冲字符输出流
public BufferedWriter(Writer out);
//创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区
public BufferedWriter(Writer out, int sz);
package ycdl.itlaobing.demo;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriteTest {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("D://temp/BufferedWriter.txt"));
        bw.write("鹅,鹅,鹅,");
        bw.newLine();
        bw.write("曲项向天歌。");
        bw.newLine();
        bw.write("白毛浮绿水,");
        bw.newLine();
        bw.write("红掌拨清波。");
        bw.newLine();
        bw.flush();
        bw.close();
        
    }
}

OutputStreamWriter

java.io.OutputStreamWriter ,是 Writer 的子类,是从字符流到字节流的桥梁。使用指定的字符
集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

构造方法:

//创建一个使用默认字符编码的OutputStreamWriter
public OutputStreamWriter(OutputStream out);
//创建一个使用命名字符集的OutputStreamWriter。
public OutputStreamWriter(OutputStream out, String charsetName);
//创建一个使用给定字符集的OutputStreamWriter
public OutputStreamWriter(OutputStream out, Charset cs);
//创建一个使用给定字符集编码器的OutputStreamWriter
public OutputStreamWriter(OutputStream out, CharsetEncoder enc);
package ycdl.itlaobing.demo;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class OutputStreamWriterTest {

    public static void main(String[] args) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D://temp/OutputStreamWrite.txt"));
        String bianma = osw.getEncoding();
        System.out.println("编码格式为: " + bianma);
        osw.write("梦想着梦想中国家的梦想");
        osw.close();

    }

}

今日总结:

晚自习把字符流这一块儿看了,把练习做了,序列化还没来得及看,脑容量有点不够了

然后就在网上看了看集合那一块的视频。9

标签

评论

this is is footer