博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
06、IO流(一) -- 字符流
阅读量:5886 次
发布时间:2019-06-19

本文共 5962 字,大约阅读时间需要 19 分钟。

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();    }}

###################################

转载于:https://www.cnblogs.com/pengjingya/p/5528871.html

你可能感兴趣的文章
sizeof(long)
查看>>
pxe网络启动和GHOST网克
查看>>
2.5-saltstack配置apache
查看>>
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>
增强myEclipse的提示功能
查看>>
[翻译]Protocol Buffer 基础: C++
查看>>
runloop与线程的关系
查看>>
[Bzoj2246]迷宫探险(概率+DP)
查看>>
详解消息队列的设计与使用
查看>>
使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误
查看>>
控制子窗口的高度
查看>>
处理 Oracle SQL in 超过1000 的解决方案
查看>>
Alpha线性混合实现半透明效果
查看>>
chkconfig 系统服务管理
查看>>
ORACLE---Unit04: SQL(高级查询)
查看>>
贪食蛇
查看>>
201521123009 《Java程序设计》第11周学习总结
查看>>
Python3之多线程学习
查看>>
MVC和MTV结构分析
查看>>
(转)微信网页扫码登录的实现
查看>>