1.1、字符流
字符流:一次读入或读出是16位二进制。格式:后缀名是父类名。前缀名是该流对象的功能。
Reader(字符流):用于读取字符流的抽象类。
Writer:写入字符流的抽象类。
IO流用来处理设备之间的数据传输,而且流按照分向划分可分为输入流和输出流。
1、IO流常用基类
(1)字节流的抽象基类:InputStream,OutputStream 。
(2)字符流的抽象基类:Reader,Writer 。 注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。 如: InputStream 的子类 FileInputStream 。Reader 的子类 FileReader 。a) Writer :
字段
protected Object lock://用于同步针对此流的操作的对象。
构造方法:
protected Writer()://创建一个新的字符流 writer,其关键部分将同步 writer 自身。protected Writer(Object lock)://创建一个新的字符流 writer,其关键部分将同步给定的对象。
方法:
Writer append(char c)://将指定字符添加到此 writer。 Writer append(CharSequence csq)://将指定字符序列添加到此 writer。Writer append(CharSequence csq, int start, int end)://将指定字符序列的子序列添加到此 writer.Appendable。abstract void close()://关闭此流,但要先刷新它。abstract void flush()://刷新该流的缓冲。刷新后可以继续使用该流。void write(char[] cbuf)://写入字符数组。 abstract void write(char[] cbuf, int off, int len)://写入字符数组的某一部分。void write(int c)://写入单个字符。void write(String str)://写入字符串。void write(String str, int off, int len)://写入字符串的某一部分。
b) Reader:
字段
protected Object lock://用于同步针对此流的操作的对象。
构造方法:
protected Reader()://创建一个新的字符流 reader,其重要部分将同步其自身的 reader。 protected Reader(Object lock)://创建一个新的字符流 reader,其重要部分将同步给定的对象。
方法:
abstract void close()://关闭该流并释放与之关联的所有资源。void mark(int readAheadLimit)://标记流中的当前位置。boolean markSupported()://判断此流是否支持 mark() 操作。int read()://读取单个字符。一次读一个字符。而且会自动向下读取。 int read(char[] cbuf)://将字符读入数组。abstract int read(char[] cbuf, int off, int len) ://将字符读入数组的某一部分。int read(CharBuffer target)://试图将字符读入指定的字符缓冲区。 boolean ready()://判断是否准备读取此流。 void reset()://重置该流。long skip(long n)://跳过字符。
2、IO异常处理
FileWriter fw = null;//在外面建立引用,在try内进行初始化try { fw = new FileWriter("demo.txt"); fw.write("abcdef");}catch (IOException e) { System.out.println(e.toString());}finally { try { if(fw!=null) fw.close(); }catch (IOException e) { System.out.println(e.toString()); }}
3、 FileWriter 和 FileReader
a) FileWriter
FileWriter是Writer的子类。
构造函数:FileWriter(File file)//根据给定的 File 对象构造一个 FileWriter 对象。FileWriter(File file, boolean append)//根据给定的 File 对象构造一个 FileWriter 对象。FileWriter(FileDescriptor fd)//构造与某个文件描述符相关联的 FileWriter 对象。FileWriter(String fileName)//根据给定的文件名构造一个 FileWriter 对象。FileWriter(String fileName, boolean append)//根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
写入实例:
private static void writerFile() { File file = new File("D:\\hello.txt"); try { FileWriter fileWriter = new FileWriter(file); fileWriter.write("Hello"); System.out.println("写入成功!"); fileWriter.flush(); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); }}
b) FileReader
FileReader:它是Reader的子类。
构造函数:FileReader(File file)//在给定从中读取数据的 File 的情况下创建一个新 FileReader。FileReader(FileDescriptor fd)//在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。FileReader(String fileName)// 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
第一种取出:单个字符的读取
public static void FileReader(){ File file = new File("D:\\hello.txt"); FileReader fileReader; try { fileReader = new FileReader(file); int ch = 0; while ((ch = fileReader.read()) != -1) { System.out.println("ch="+(char)ch); } fileReader.close(); } catch (Exception e) { e.printStackTrace(); }} //read():一次读一个字符。而且会自动向下读取
第二种取出:定义缓冲区的读写
public static void FileReader(){ File file = new File("D:\\hello.txt"); FileReader fileReader; try { fileReader = new FileReader(file); char[] buf = new char[1024]; int len = 0; while((len = fileReader.read(buf)) != -1){ System.out.println(new String(buf, 0, len)); } fileReader.close(); } catch (Exception e) { e.printStackTrace(); }} //read(char[]):该read(char[])返回的是读到的字符个数。//String(char[] value, int offset, int count):分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
4、字符流的缓冲区
BufferedWriter和BufferedReader:缓冲区的出现提高了数据的读写效果,它必须结合流使用,并且在流的基础上对流的功能进行增强。
a) BufferedWriter:
- 缓冲区的出现是为了提高流的操作效率而出现。
- 创建缓冲区之前,必须要先有流对象。
- 记住只要用到缓冲区,就要记得刷新。
- 其实关闭缓冲区,就是在关闭缓冲区中的流对象。
构造方法:
BufferedWriter(Writer out)://创建一个使用默认大小输出缓冲区的缓冲字符输出流。BufferedWriter(Writer out, int sz)://创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
特有方法:
void newLine()://写入一个行分隔符。该缓冲区中提供了一个跨平台的换行符。 在Windows系统下换行符是/r/n,而在Linux系统下换行符是/n。
代码示例:
private static void bufferedWriterFile() { // 自带flush方法 BufferedWriter writer; try { writer = new BufferedWriter(new FileWriter("D:\\hello.txt")); writer.write("你好"); writer.newLine(); writer.write("世界"); writer.close(); } catch (IOException e) { e.printStackTrace(); }}
b) BufferedReader
构造方法:
BufferedReader(Reader in)://创建一个使用默认大小输入缓冲区的缓冲字符输入流。BufferedReader(Reader in, int sz)://创建一个使用指定大小输入缓冲区的缓冲字符输入流
特有方法:
boolean markSupported()://判断此流是否支持 mark() 操作(它一定支持)。String readLine()://读取一个文本行。boolean ready()://判断此流是否已准备好被读取。void reset()://将流重置到最新的标记。long skip(long n):// 跳过字符。
代码示例:
private static void bufferedReaderFile() { BufferedReader reader; try { reader = new BufferedReader(new FileReader("D:\\hello.txt")); String line = null; while((line = reader.readLine())!= null){ System.out.println(line); } reader.close(); } catch (Exception e) { e.printStackTrace(); } }
c) LineNumberReader
它是BufferedReader 的一个子类。属于功能增强,带着行号。
构造方法:LineNumberReader(Reader in)://使用默认输入缓冲区的大小创建新的行编号 reader。LineNumberReader(Reader in, int sz)://创建新的行编号 reader,将字符读入给定大小的缓冲区。
特有方法:
int getLineNumber()://获得当前行号。void setLineNumber(int lineNumber)://设置当前行号。
读取文件的内容,并且带上行号:
private static void readerFileWithLine() { LineNumberReader reader; try { reader = new LineNumberReader(new FileReader("D:\\hello.txt")); String line = null; while((line = reader.readLine()) != null){ System.out.println(reader.getLineNumber() + ":" + line); } reader.close(); } catch (Exception e) { e.printStackTrace(); }}
###################################