什么是IO?
Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据
IO的分类
数据的流向分为:输入流和输出流。
输入流 :把数据从其他设备上读取到内存中的流。
输出流 :把数据从内存中写出到其他设备上的流。
数据的类型分为:字节流和字符流。
字节流 :以字节为单位,读写数据的流。
字符流 :以字符为单位,读写数据的流。
顶级父类
字节输出流(OutputStream)
FileOutputStream是OutputStream的一个子类,文件输出流,作用是向文件中写入数据
构造方法
public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。
public static void main(String[] args) throws IOException {
//第一种构造方法
File file = new File("a.txt");
FileOutputStream fos = new FileOutputStream(file);
//第二种构造方法
FileOutputStream fos1 = new FileOutputStream("a.txt");
}
注意:建立文件的时候,如果没有文件,会创造这个文件,如果有,会覆盖这个文件。
写入字节/字节数组
- 写出字节: write(int b) 方法
- 写出字节数组: write(byte[] b) ,如果字节是一些字符,如汉字,可以使用getBytes()方法写入
- 流操作完毕必须调用close释放资源
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("a.txt");
fos.write(97); //写入一个字节
byte [] bytes = {98,99,100};
fos.write(bytes); //写入三个字节
fos.write("我爱java".getBytes()); //使用getBytes()方法
fos.close(); //释放资源
}
打开文件查看结果
文件续写
上述写完发现,如果想在a.txt中继续写东西,可以用write方法,但文件会被重新创建,下面介绍文件如何续写,
public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的 文件
public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件
public static void main(String[] args) throws IOException {
//第二种方法文件续写
FileOutputStream fos = new FileOutputStream("a.txt",true);
fos.write("我更爱生活".getBytes()); //续写内容
fos.close(); //释放资源
}
续写前:abcd我爱java
续写后:abcd我爱java我更爱生活
换行
Windows系统里,换行符号是 \r\n 。
public static void main(String[] args) throws IOException {
//第二种方法文件续写
FileOutputStream fos = new FileOutputStream("a.txt",true);
for(int i = 0;i<=2;i++){
fos.write(100);
fos.write("\r\n".getBytes());
}
fos.close(); //释放资源
}
文件查看结果:
abcd我爱java我更爱生活d
d
d
字节输入流(InputStream)
FileInputStream是InputStream的一个子类,文件输出流,作用是读取文件中的内容
构造方法
FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系 统中的 File对象 file命名。
FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件 系统中的路径名 name命名。
当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出 FileNotFoundException 。
读取字节/字节数组
读取字节用read()方法,返回值是一个int型的值,每次读取一个字节
public static void main(String[] args) throws IOException {
//构造方法
FileInputStream fis = new FileInputStream("a.txt"); //a.txt内容是abcd
int read = fis.read(); //读取一个字节
System.out.println((char)read);
}
打印结果:a
利用循环多次读取并且输出
public static void main(String[] args) throws IOException {
//构造方法
FileInputStream fis = new FileInputStream("a.txt"); //a.txt内容是abcd
int read;
while((read = fis.read())!=-1){
System.out.println((char)read);
}
}
打印结果:
a
b
c
d
读取字节数组
public static void main(String[] args) throws IOException {
//构造方法
FileInputStream fis = new FileInputStream("a.txt"); //a.txt内容是abcd
byte[] bytes = new byte[2]; //先定义一个长度为2的字节数组
fis.read(bytes); //读取2个字节的内容
System.out.println(new String(bytes)); //将读取的字节数组转化为字符串输入
fis.close();
}
打印结果:ab
利用循环读取
public static void main(String[] args) throws IOException {
//构造方法
FileInputStream fis = new FileInputStream("a.txt"); //a.txt内容是abcd
byte[] bytes = new byte[2]; //先定义一个长度为2的字节数组
int len; //作为读取的有效个数
while((len = fis.read(bytes))!=-1){
System.out.println(new String(bytes));
}
fis.close();
}
打印结果:
ab
cd