IO分类
根据数据的流向分为
- 输入流 : 把数据从其他设备上读取到内存中的流;
- 输出流 : 把数据从内存中写出到其他设备上的流;
根据数据的类型分为
- 字节流 : 以字节为单位,读写数据的流;
- 字符流 : 以字符为单位,读写数据的流;
输入流 | 输出流 | |
---|---|---|
字节流 | 字节输入流 InputStream | 字节输出流 OutputStream |
字符流 | 字符输入流 Reader | 字符输出流 Writer |
字节输出流 OutputStream
java.io.OutputStream
此抽象类是表示字节输出流的所有类的超类;
- public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
- public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
- public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
- public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
- public abstract void write(int b) :将指定的字节输出流。
public static void main(String[] args) throws IOException {
//创建文件输出流FileOutputStream实例对象,第一个参数是输出的位置,第二个Boolean类型是指是否续写,false会覆盖源文件,true是续写源文件;
FileOutputStream fos = new FileOutputStream("src\\demo\\outputStream\\a.txt",false);
//使用write方法,参数为byte[],可以String.getBytes()方法
fos.write("你好,世界".getBytes());
//换行,windows: \r\n linux: /n mac: /r
fos.write("\r\n".getBytes());
//从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流
//表示从第2个索引开始写3个
fos.write("abcde".getBytes(),2,3);
//写完要关闭流
fos.close();
}
字节输入流 InputStream
java.io.InputStream
此抽象类是表示字节输入流的所有类的超类;
- public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
- public abstract int read() : 从输入流读取数据的下一个字节。读完会返回-1
- public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src\\demo\\outputStream\\a.txt");
//记录读取到的字节
int len = 0;
//判断变量len是否不等于-1,read方法读完当前字节指针会指向下一个字节,所以必须这样写
while ((len = fis.read())!=-1){
System.out.print((char) len);
}
fis.close();
}
一次读取多个字节
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src\\demo\\outputStream\\a.txt");
//存储读取到的多个字节
byte[] bytes = new byte[1024];
//记录读取到的字节
int len = 0;
//判断变量len是否不等于-1,read方法读完当前字节指针会指向下一个字节,所以必须这样写
while ((len = fis.read(bytes))!=-1){
//把字节数组的一部分转换成字符串,offset:数组的开始索引,length:转换的字节个数
System.out.println(new String(bytes,0,len));
}
fis.close();
}
字符输入流 Reader
java.io.Reader
字符输入流最顶层父类,定义了一些共性的成员方法,是一个抽象类;
- public void close() :关闭此流并释放与此流相关联的任何系统资源。
- public int read() : 从输入流读取一个字符。
- public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
public static void main(String[] args) throws IOException {
//创建FileReader对象,构造方法中绑定要读取的数据源
FileReader fr = new FileReader("src\\demo\\ioDemo\\a.txt");
int len =0;
//方式一,一个一个字符读取
/*while ((len = fr.read()) != -1){
//直接打印len是整数,要用char类型强转成字符
System.out.println((char)len);
}*/
//方式二,多个读取
char[] chars = new char[1024];
while ((len=fr.read(chars))!= -1){
//使用String的构造方法读取,从0开始,有效的个数
System.out.println(new String(chars,0,len));
}
//释放资源
fr.close();
}
字符输出流 Writer
java.io.Writer
抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节
输出流的基本共性功能方法。
- 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() 关闭此流,但要先刷新它。
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("src\\demo\\ioDemo\\a.txt",true);
fw.write("找朋友玩");
fw.close();
}
flush()方法和close()方法的区别
- flush方法,刷新缓冲区,流对象可以继续使用;
- close方法,先刷新缓冲区,然后关闭资源,流对象不能再使用了;
IO流的try catch方式
JDK7以后增加了新的格式,不需要写多个繁复的try catch代码,并且代码执行完毕会自动释放资源,不需要再写close方法;
格式:
try(定义流对象,定义流对象…){
//可能会产生异常的代码
}catch(异常类变量 变量名){
异常的处理逻辑
}
public static void main(String[] args) {
//将流对象定义在try的()中
try (FileReader fr = new FileReader("src\\demo\\ioDemo\\a.txt")) {
int len = 0;
char[] chars = new char[1024];
while ((len = fr.read(chars)) != -1) {
System.out.println(new String(chars, 0, len));
}
//代码执行后会自动close资源
} catch (IOException e) {
e.printStackTrace();
}
}