•InputStream 和 Reader 是所有输入流的基类。
本节内容:
目录
InputStream
OutputStream
分割符的问题:
jdk7的改进写法
InputStream
InputStream输入流,以它的子类FileInputStream来讲解
绝对路径和相对路径,
绝对路径是值在硬盘上存储的真正路径
相对路径 是指相对于某个文件的路径,
java读取文件时,系统默认从项目的根目录开始读取
InputStream抽象类中的常用方法:
- int available() 返回可被读取的字节的长度
- close() 关闭流通道
- int read() 从文件中读取一字节内容,如果读到内容,返回该字节对应的ascii码,可以通过转成char类型打印该字节的内容,中文的话会乱码 ,如果读不到内容,返回-1,读完后指针移动到下个位置
- int read(byte[] b) 每次从文件中读取一定数量的字节放入byte数组中,返回其读到的字节数目,如果没有读到内容,返回-1,读到最后可能读不满,那么最后一次读取不会完全覆盖之前的byte数组,byte数组中存放的是ascii码可使用new String(byte[] b,int offset,int length)根据指定长度将byte数组转成字符串,
- int read(byte[] b, int off, int len)将指定长度的内容读到byte数组中,读不到内容返回-1
import java.io.*;
public class IoTest01 {
public static void main(String[] args){
FileInputStream fi = null;
try {
//绝对路径,加转义字符防止路径不正确
fi=new FileInputStream("E:\\workspace\\javaIo\\test\\test1.txt");
//相对路径
fi=new FileInputStream("./test/test1.txt");
/*
System.out.println(fi.read());//fi.read()每次读取一字节,然后游标会移动到下一个
System.out.println(fi.read());
char c=(char)fi.read();//强转为char类型,保证读出来的不是ascii码
System.out.println(c);
*/
//定义byte数组每次读取三个字节提高效率
/* byte[] bytes=new byte[4];
while (fi.read(bytes)!=-1){
System.out.println( new String(bytes));
}*/
byte[] bytes=new byte[4];
int temp;
while ((temp=fi.read(bytes))!=-1){
//new String (byte[],offset,len)将byte数组按指定索引转换成字符串
System.out.println(new String(bytes,0,temp) );
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fi.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
out:
we m
ust
stud
y ha
rd!
注意:程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源
OutputStream
OutputStream输出流,它的常用子类如下
OutputStream抽象类中常用方法
- void close()关闭输出流,释放系统资源
- void flush()刷新输出流,保证缓存中内容全部写出去
- void write(byte[] b) 一个bytes数组通过输出流写入到输出流
- void write(byte[] b, int off, int len) 将指定起始位置和长度的byte数组写入到输出流
- Writes len bytes from the specified byte array starting at offset off to this output stream.
- abstract void write(int b)写一个byte到输出流,int值的高24位(如果有)被忽略,将int的低8位转换成ascii码写入
OutputStream的子类中常用的有FileOutputStream,它的构造方法有5个,常用的有
FileOutputStream(File file) 创建一个文件输出流,参数可以是文件,也可以是字符串形式的文件地址
FileOutputStream(String name)
FileOutputStream(File file, boolean append) 创建一个文件输出流,第一个参数是文件名,可以是字符串,第2个参数是否覆盖文件内容,如果为true在文件内容的后面直接写(要注意写入换行符),不覆盖原有内容,为false则覆盖
FileOutputStream继承自OutputStream,它的常用方法是重写自父类的方法
注意如果该路径文件不存在,则自动创建该路径下文件
示例:
package io01;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class IoTest02 {
public static void main(String[] args){
FileOutputStream fo=null;
try {
fo=new FileOutputStream("test/test1.txt",true);
fo.write(100);
String msg="hello world";
//调用字符串的getBytes方法,将字符串转换为byte数组
fo.write(msg.getBytes());//write方法不会自动换行
fo.write(msg.getBytes());//再写一遍
fo.write("\n".getBytes());//将换行符转换成byte数组,写入到文件中
fo.write("javase".getBytes());
// 刷新以保证写入
fo.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
分割符的问题:
在windows下路径的分割符是\ ,还要防止转义字符,出现转义字符要多加一个\, 在linux下路径分割符是/ ,为了保证代码的跨平台运行,分割符可以使用File.separator来替代文件路径的分隔符,
fo=new FileOutputStream("test/test1.txt",true);
变成下面这种格式
fo=new FileOutputStream("test"+File.separator+"test1.txt",true);
io操作需要捕获异常.因为不确定文件到底是否存在,在try-catch-finally语句中,try语句块声明的变量不能在finally语句块访问,所以定义输入输出流时在try外部声明,比如FileInputStream f=null
jdk7的改进写法
jdk7之后,InputStream和OutputStream,Reader和Writer实现了Closeable接口,Closeable接口继承自AutoCloseable接口,看下AutoCloseable接口的源码:
public interface AutoCloseable {
//AutoCloseable接口只有一个close抽象方法,
void close() throws Exception;
}
从jdk7之后不需要手动关闭io流了,因为io流都实现了close方法,创建io流对象后,会自动调用这个方法,写法变成了将输出流的初始化放到try后面的小括号中,不需要在finally语句块中调用流对象的close方法
示例
//将test/test.txt文件中的内容打印出来
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class File7 {
public static void main(String[] args){
try (
FileInputStream fis=new FileInputStream("test"+ File.separator+"test.txt");
){
int temp;
while((temp=fis.read())!=-1){
System.out.println( (char)temp);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}