Java-JavaSE-IO
Posted wonewo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-JavaSE-IO相关的知识,希望对你有一定的参考价值。
- 输入输出流是相对内存来说的
- * Windows的换行:
- * 键盘输入
- InputStream in = System.in;
- System.in这个流不需要关闭,不然本次程序无法再次使用此流
- InputStream in = System.in;
- IO的一些使用规律
- 转换流:
- InputStreamReader:字节流转字符流,解码
- OutputStreamWriter:字符流转字节流,编码
- 明确源和目的
- 源:InputStream Reader(文本)
- 目的:OutputStream Writer(文本)
- 明确具体设备
- 源:
- 硬盘:FileInputStream FileReader
- 键盘:System.in
- 内存:数组
- 网络:Socket流
- 目的:
- 硬盘:FileOutputStream FileWriter
- 控制台:System.out
- 内存:数组
- 网络:Socket流
- 源:
- 转换流:
- 字节流
- 2个抽象基类:InputStream/OutputStream
- InputStream
- 子类
- BufferedInputStream
- FileInputStream
- 方法
- int available()
- 返回待操作文件的大小
- int available()
- 方法
- 子类
- OutputStream
- write()方法直接写到目的地,不用flush(),但是要close()
- 子类
- BufferedOutputStream
- FileOutputStream
- 子类
- PrintStream
- 永不抛IOException
- print()
- 提供许多可以打印多种数据类型的方法,会保持数据的表示形式
- PrintStream
- 子类
- ObjectInputStreamObjectOutputStream
- 被操作的对象需要实现Serializable
- 非瞬态,非静态数据才会被序列化
- transient修饰,不会被序列化
- 强烈建议,给需要序列化的类显示声明serialVersionUID
- RandomAccessFile
- 支持对随机访问文件的读取和写入
- 不会清空原文件的内容,会在原有内容上进行覆写
- 可以多个线程,同时往一个文件中写入数据
- 内部维护了一个byte数组
- 将字节输入流和输出流进行了封装
- 源和目的只能是文件
- 可以获取指针位置,或者设置指针位置,以便操作任意位置的数据
- PipedInputStreamPipedOutputStream
- 结合多线程,某个线程通过PipedInputStream读取数据,另一个线程通过PipedOutputStream将数据写出
- PipedInputStream提供PipedOutputStream需要的数据
- DataInputStreamDataOutputStream
- 操作基本数据类型、
- ByteArrayInputStreamByteArrayOuputStream
- 关闭这个流是无效的,此类的方法在关闭后仍可以使用
- 源和目的都是内存
- 字符流
- 2个抽象基类:Reader/Writer
- 其实是字节流+编码表,读到字节之后,先查表,再转成字符
- Reader
- 方法
- int read()
- read a single character,返回读到的字符的int表示,没读到,返-1
- int read(char[] c)
- 将读到的字符存入c中,返回读到的字符个数(只要读到,就返回!),当读到末尾后,返回-1
- 简单应用:
- while( (length=r.read( c ))!=-1){ System.out.print(new String(c , 0, length);}
- int read()
- 子类
- BufferedReader
- 构造方法
- BufferedReader(Reader in)
- 方法
- String readLine()
- 直接读一行,返回字符串,读完,返回null,而非-1
- String readLine()
- 子类
- LineNumberReader
- 同属于装饰类
- 用于需要操作行号的情况
- LineNumberReader
- 构造方法
- InputStreamReader
- 字节流向字符流转换的桥梁
- 可以指定码表
- 小应用
- BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
- 子类
- FileReader
- 使用默认的码表
- FileReader
- BufferedReader
- 方法
- Writer
- 方法
- abstract void close()
- closes the stream, flushing it first
- abstract void flush()
- void write(char[]intString x)
- abstract void close()
- 子类
- OutputStreamWriter
- 字符流通往字节流的桥梁
- 可以指定码表
- FileWriter
- 使用默认的码表
- FilleWriter fw =new FileWriter("filename");
- //若文件不存在,就创建,若存在,则覆盖原文件
- 所以最好在写入之前一步才写这句话!不然会将原有的文件覆盖
- fw.write("abc");
- 写入临时存储缓冲区
- fw.flush();
- fw.close();
- //关闭前会自动调用flush()方法
- 异常处理
- FileWriter fw= null;
- try{
- fw=new FileWriter("xxx.txt");
- fw.write("a");
- }catch(IOException e){}
- finally{
- if(fw!=null)
- try{
- fw.close();
- catch(IOException e){}
- }}
- BufferedWriter
- 构造函数
- BufferedWriter(Writer out)
- method
- write()
- 将数据放在缓冲区
- flush()
- 将缓冲区中的东西写入外设
- close()
- 缓冲区关闭后,关闭前会先flush(),流也就关了
- void newLine()
- 写入一个与平台相关的换行符
- write()
- 构造函数
- PrintWriter
- 保证打印数据的表示形式
- 构造函数的参数
- 字符串路径
- File对象
- 字节输出流
- 字符输出流
- 序列流
- SequenceInputStream
- 构造器参数有Enumeration<xx>
- 所以要创建Vector对象存储多个流,来创建Vector的Enumeration
- 构造器参数有Enumeration<xx>
- SequenceInputStream
- OutputStreamWriter
- 方法
- RandomAccessFile
- 实例支持对随机文件的读和写
- 内部维护了byte类型的数组,且有指针可以操作数组中的元素
- 若目的文件存在则不创建,要写的话,则将原来的数据覆盖,若不存在,就创建
- getFilePointer()
- seek(1*8)
- 将指针设置到角标是8的位置,每一个角标存储1个字节的数据
- 读和写都是从角标位置开始的
- writeInt()
以上是关于Java-JavaSE-IO的主要内容,如果未能解决你的问题,请参考以下文章