Java中IO

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();
缓冲流
  1. 对普通字节流和字符流的增强
  2. 基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO 次数,从而提高读写的效
  3. 字节缓冲流: BufferedInputStream , BufferedOutputStream
  4. 字符缓冲流: 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();

你可能感兴趣的:(Java中IO)