能对文件进行内容操作的只有两种途径“字符流”和“字节流”
1.通过File类定义一个要操作的文件的路径; //如果操作不是文件,那么没有这一步
2.通过字节流或字符流的子类对象为父类对象实例化;
3.进行数据的读(输入),写(输出)操作;
4.数据流属于资源操作,资源操作必须关闭
java.io包 | 定义的流 |
---|---|
字节流(JDK1.0) | InputStream、OutputStream |
字符流(JDK1.1) | Reader、Writer |
OutputStream类是专门进行字节数据输出的一个类
//定义
public abstract class OutputStream
extends Object
implements Closeable,Flushable
可以注意到上面实现了两个接口:Closeable,Flushable
//Closeable接口,JDK1.5之后才提供
public interface Closeable
/*
JDK1.7引入自动关闭机制AutoCloseable
这个父接口定义如下:
public interface AutoCloseable {
public void close() throws Exception ;
}
*/
extends AutoCloseable {
public void close() throws IOException;
}
//Flushable接口,JDK1.5之后
public interface Flushable {
public void flush() throws IOException;
}
但是要注意的是,OutputStream类是在JDK1.0的时候就有提供的,
这个类原本就定义了close()与flush()两个操作方法
所以以上的两个接口几乎可以忽略了
//Outputstream类里面一共提供了三个输出方法
public abstract void write(int b) throws IOException; //输出单个字节
public void write(byte[] b) throws IOException; //输出全部字节数组
public void write(byte[] b,int off,int len) throws IOExeption; //输出部分字节,重点!
要注意的是,OutputStream本身是一个抽象类,如果实例化操作,那么就要使用抽象类的子类,我们文件操作可以使用FileOutputStream子类:
//创建或覆盖已有文件:
public FileOutputStream(File file) throws FileNotFoundException;
//文件内容追加:
public FileOutputStream(File file,boolean append) throws FileNotFoundException;
//例子:
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
//略
public static void main(String args[]) throws Exception { //抛出
File file = new File("文件路径");
//是否存在此路径,否则应先创建目录
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs(); //创建目录
}
//使用OutputStream和其他子类进行对象实例化,此时目录存在,文件还不存在
OutputStream output = new FileOutputStream(file); //如果要进行追加,那么就写成(file,true),就可以追加了
//进行文件内容的输出
String str = "good good study!";
//1.输出单个字节
byte data [] = str.getBytes() ; //将字符串变成字符数组
for (int x=0 ; x < data.length ; x++) {
output.write(data[x]); //将内容输出
}
//2.输出全部字节
byte data [] = str.getBytes() ; //将字符串变成字符数组
output.write(data); //将内容输出
//3.输出部分字节
byte data [] = str.getBytes() ; //将字符串变成字符数组
output.write(data,5,6) ;
//资源操作最后,一定要进行关闭
output.close();
}
/*
多说一句,如果追加换行,只要在字符串后面加上"\r、\n、\r\n"
根据不同操作系统,不一样
mac \r
unix/linux \n
windows \r\n
*/
程序需要进行数据的读取操作,可以利用InputStream类实现功能
//定义
public abstract class InputStream
extends Object
implements Closeable
虽然有接口Closeable,但是不用去考虑此接口的存在
在InputStream类里面,也有数据读取的方法
//读取单个字符:
public abstract int read() throws IOException;
//返回值:返回读取的字节内容,如果现在没有内容了,那么返回 -1
//将读取的数据保存在字节数组里:
public int read(byte[] b) throws IOException;
//返回值:返回读取的数据长度,但是读取到结尾,那么返回 -1
//将读取的数据保存在部分字节数组中:
public int read(byte[] b,int off,int len) throws IOexception;
//返回值:每次读取部分数据长度,如果已经读取到结尾了,返回 -1
InputStream是一个抽象类,所以如果进行文件的读取使用FileInputStream子类
构造方法:public FileInputStream(File file) throws FileNotFoundException;
//读取实例:
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
//略
public static void main(String args[]) throws Exception {
File file = new File("文件路径");
//判断文件是否存在
if (file.exists()) { //文件存在
//使用InputStream读取
InputStream input = new FileInputStream(file);
byte data[] = new byte[1024] ; //准备一个数组
int len = input.read(data) ; //将内容保存到字节数组里面
//关闭输入流
input.close();
System.out.println("[" + new String(data,0,len) + "]");
}
}
//单个字符读取实例:(使用while循环)
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
//略
public static void main(String args[]) throws Exception {
File file = new File("文件路径");
//判断文件是否存在
if (file.exists()) { //文件存在
//使用InputStream读取
InputStream input = new FileInputStream(file);
byte data[] = new byte[1024] ; //准备一个数组
int foot = 0; //数组脚标
int temp = 0; //每次接收读取的字节数据
while ((temp = input.read()) != -1) { //read()方法将读取的字节内容给temp变量
data[foot ++] = (byte) temp ; //有内容时进行保存
}
//关闭输入流
input.close();
System.out.println("[" + new String(data,0,foot) + "]");
}
}