IO流
Posted shewuxuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流相关的知识,希望对你有一定的参考价值。
java中的流都位于java.io包中
字节流
计算机中所有文件都是以二进制字节形式存在。 JDK提供抽象类InputStream和OutputStream,它们是字节流的顶级父类。
输入流 InputStream常用方法:
-
int read();//读取一个字节并转换为0-255之间的整数返回
-
int read(byte[] b);//读取若干字节保存到数组b中返回读取到的字节数
-
int read(byte[] b,int off,inr len);//读取若干字节保存到数组,off指定数组开始保存数据的起始下标,len表示读取的字节数目
-
void close(); //关闭该流并释放所有关联的系统资源
输出流OutputStream常用方法:
-
void write();//向输出流写入一个字节
-
void write(byte[] b);//把b中的所有字节写入输出流
-
void write(byte[] b,int off,inr len);//将数组off开始的len个字节写入输出流
-
void flush();//刷新此流并强制写出所有缓冲的输出字节
-
void close(); //关闭该流并释放所有关联的系统资源
字节流读写文件:
-
FileInputStream
-
FileOutputStream
文件拷贝:
字节流缓冲区:
装饰设计模式:
字节流缓冲://在IO包中提供了两个带缓冲的字节流,分别如下,这两个流都使用了装饰设计模式,它们的构造方法中分别接收InputStream和OutputStream类型的参数作为被包装对象。
-
BufferedInputStream
-
BufferedOutputStream
字符流
JDK提供字符流,主要用于文本文件操作。同字节流一样字符流也有两个顶级父类分别是Reader和Writer。
字符流操作文件:
FileReader和FileWriter用于读写文件,BufferedReader和BufferedWriter是具有缓冲功能的流,可以有效的提高读写效率。
public static void main(String[] args) throws Exception FileReader reader = new FileReader("reader.txt"); int ch; while((ch = reader.read() != -1) System.out.println((char) ch); reader.close();
BufferedReader中有一个重要的方法readLiner(),用于一次读取一行文本
LineNumberReader:
这是jdk提供的一个可以跟踪行号的输入流,是BufferedReader的直接子类。
public static void main(String[] args) throws Exception FileReader fr = new FileReader("A.java"); FileWriter fw = new FileWriter("B,java"); LineNumberReader lr = new LineNumberReader("fr"); lr.setLineNumber(0); String line = null; while((line = lr.readLine()) != null) fw.writer(lr.getLineNumber()+":"+line); fw.writer("\r\n"); lr.close();
转换流:
JDK中提供了InputStreamReader和OutputStreamWriter两个类可以将字节流转换为字符流。转换流也是一种包装流,其中的OutputStreamWriter是Writer的子类,可以将字节流包装成字符流输出流;InputStreamReader是Reader的子类,可以将字节输入流包装成字符输入流。
public static void main(String[] args) FileInputStream in = new FileInputStram("src.txt"); InputStreamReader isr = new InputStramReader(in);//将字节输入转换为字符流输入 BufferedReader br = new BufferedReder(isr);//对字节流对象进行包装 FileOutputStream out = new FileOutputStream("des.txt");//将字节输出流转换为字符输出流 OutputStreamWriter osw = new OutputStreamWriter(out); BufferedWriter bw = new BufferedStreamWriter(osw);//对字符输出流对象进行包装 String line; while((line = br.readLine()) != null)//判断是否读到文件末尾 bw.write(line;//输出读取到的文件 br.close(); bw.close();
其他IO流
ObjectInputStream 和ObjectOutputStream
将对象转为字节数据写入到硬盘上的过程称为对象序列化。对象序列化必须实现Serializable接口。
ObejctOutputStream--序列化(对象转化为二进制):
FileOutputStream fos = new FileOutputStream("text.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(obj); fos.close(); oos.close();
ObjectInputStream--反序列化(二进制转为序列化之前的对象):
FileInputStream fis = new FileInputStream("test.txt"); ObjectInputStream ois = new ObjectInputStream(fis); Map map2 = (Map)ois.readObject(); fis.close(); ois.close();
DataInputStream和DataOutputStream
操作基本类型对象时IO包提供,不必使用Object相关的流。并且还提供了readUTF()和writeUTF()方法读取和输出UTF-8编码的字符串。
FileOutputStream fos = new FileOutputStream("test.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); DataOutputStream dos = new DataOutputStream(bos); dos.writeByte(1);//写入一个字节 dos.writeChar(‘a‘);//写入一个字符 dos.writeBoolean(true);//写入一个布尔值 dos.writeUTF("世界你好");//写入UTF8编码的字符串 dos.close(); ? FileInputStream fis = new FileInputStream("test.txt"); BufferedInputStream bis = new BufferedInputStream(fis); DataInputStream dis = new DataInputStream(bis); System.out.println( dis.readByte());//读取一个字节 System.out.println( dis.readChar());//读取一个字符 System.out.println( dis.readBoolean());//读取一个布尔值 System.out.println( dis.readByte());//读取一个UTF8编码的字符串 dis.close();
printStream
之前的字节流和字符流只能write字节或字符,想要输出基本类型或对象类型就必须转为字符,为此IO包中提供printStream将基本类型或引用类型的对象格式化为字符串后输出
PrintStream ps = new PrintStream(new FileOutputStream("test.txt")); ps.print(true); ps.println(map);//会自动调用对象的toString() ps.close();
标准输入输出流
System中定义了三个常量:in\out\err分别是标准输入流、标准输出流、标准错误流。
StringBuffer sb = new StringBuffer(); int ch; while((ch=System.in.read()) != -1) if(ch==‘\r‘ || ch==‘\n‘) break; sb.append((char)ch); System.out.println(sb);
重定向流:
void setIn(InputStream in)
void setOut(PrintStream out);
void setErr(PrintStream out);
管道流 PipedInputStream和PipedOutputStream
是一种比较特殊的流,必须先建立连接才能彼此通信。通过connect方法建立管道连接。在字符流中也有一对PipedReader和PipedWriter用于管道通信。
File类
字节编码
以上是关于IO流的主要内容,如果未能解决你的问题,请参考以下文章