Java中IO
2019-09-15 本文已影响0人
iDevOps
java.io包
分类
- 按流向分类
输入流: 把数据从其他设备上读取到内存中的流
输出流: 把数据从内存中写出到 其他设备上的流 - 按数据类型分类
字节流:以字节为单位,读写数据的流
字符流:以字符为单位,读写数据的流
顶级父类
输入流 | 输出流 | |
---|---|---|
字节流 | InputStream | OutputStream |
字符流 | Reader | Writer |
字节流
一切皆字节
-
输入流(InputStream)
常用子类FileInputSteam
构造函数
FileInputStream(File file) #File对象
FileInputStream(String name) #文件路径名
常用方法
public void close() :关闭此输入流并释放与此流相关联的任何系统资源
public abstract int read() : 从输入流读取数据的下一个字节
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组b中
......
示例
FileInputStream fs = new FileInputStream("test.txt");
byte[] b = new byte[2];
int len;
while ((len = fs.read(b)) != -1){
System.out.println(new String(b));
}
fs.close();
- 输出流(OutputStream)
构造函数
public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件
public FileOutputStream(File file, boolean append) :是否追加
public FileOutputStream(String name, boolean append) : 是否追加
常用方法
write(int b) 每次可以写出一个字节数据
write(byte[] b) 每次可以写出数组中的数据
write(byte[] b, int off, int len) 每次写出从off索引开始,len个字节
示例代码
FileOutputStream fos = new FileOutputStream("test.txt");
fos.write(97); //int类型四个字节,但是只会保留一个字节的信息写出
fos.write("测试".getBytes());
fos.write("abcdefg".getBytes(), 2, 2);
fos.write("\r\n".getBytes(), 2, 2); //换行 Windows : \r\n Mac和Linux : \n
fos.close(); //流操作完毕后,必须释放系统资源,调用close方法,千万记得
字符流
当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为 一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
- 输入流(Reader)
构造方法
FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象
FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称
常用方法
public int read() : 从输入流读取一个字符
public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组cbuf中
public void close() :关闭此流并释放与此流相关联的任何系统资源
示例代码
读取字符
FileReader reader = new FileReader(new File("test.txt"));
int b;
while ((b = reader.read()) != -1){
System.out.println((char)b);
}
reader.close();
读取字符数组
FileReader reader = new FileReader(new File("test.txt"));
int len;
char[] b = new char[2];
while ((len = reader.read(b)) != -1){
System.out.println(b);
}
reader.close();
- 输出流(Writer)
构造函数
FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称
常用方法
void write(int c) 写入单个字符
void write(char[] cbuf) 写入字符数组
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len 写的字符个数
void write(String str) 写入字符串
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个 数
void flush() 刷新该流的缓冲
void close() 关闭此流,但要先刷新
示例代码
FileWriter fw = new FileWriter("test.txt");
fw.write(97);
fw.write('a');
fw.write("bbbbbbb");
fw.write("测试");
fw.close();
缓冲流
- 对普通字节流和字符流的增强
- 基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO 次数,从而提高读写的效
- 字节缓冲流: BufferedInputStream , BufferedOutputStream
- 字符缓冲流: BufferedReader , BufferedWriter
- 字节缓冲流
构造方法
public BufferedInputStream(InputStream in) :创建一个新的缓冲输入流。
public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。
示例代码
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test1.txt"));
byte[] b = new byte[1028];
while (bis.read(b) != -1){
bos.write(b);
}
bis.close();
bos.close();
- 字符缓冲流
构造方法
public BufferedReader(Reader in) :创建一个 新的缓冲输入流
public BufferedWriter(Writer out) : 创建一个新的缓冲输出流
特有方法
BufferedReader: public String readLine() : 读一行文字。
BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号
示例代码
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
String line = null;
while ((line = br.readLine()) != null){
System.out.println(line);
}
br.close();