IO流是实现Java数据输入和输出的基本手段,换而言之,Java是通过IO流与各种输入输出设备建立连接的。
IO流分为两种:字节流(byte stream)和字符流(char stream)
字节流:使用字节流读入或写出二进制数据
①文件创建
public static void createFile() throws IOException{
/**创建文件输出流
* 第二种构造方法:
* new FileOutputStream("path",boolean append);
* append 如果为true,则将字节写入文件末尾处,而不是写入文件开始处
*/
FileOutputStream fos = new FileOutputStream("D:/file/test1.txt");
//写入文件的字符串
String str = "这里可以是中文字符串";
//将字符串还原成字节数组
byte array[] = str.getBytes();
//将字节数组写入目标文件
fos.write(array);
//关闭文件输出流
fos.close();
}
②文件读取与文件复制
/**
* 读入与写出同时操作,即复制一个文件
* @throws IOException
*/
public static void copyFile() throws IOException{
//创建文件输入流,目标文件
FileInputStream fis = new FileInputStream("D:/all/pdf/testcopy.txt");
//创建文件输出流,复制文件
FileOutputStream fos = new FileOutputStream("C:/testcopy.txt");
//计算字节数
int size = fis.available();
/**
* fis.read()为字节
*/
for(int i = 0; i < size; i++){
fos.write(fis.read());
System.out.println(i);
}
fis.close();
fos.close();
}
上面是一种以字节的方式读取,并写入,速度太慢,缓冲区优化:
/**
* 使用缓冲流进行读取和写入
* @throws IOException
*/
public static void copyFile2() throws IOException{
//创建文件输入流,目标文件
FileInputStream fis = new FileInputStream("D:/all/pdf/testcopy.txt");
//创建文件输出流,复制文件
FileOutputStream fos = new FileOutputStream("C:/testcopy.txt");
//输入缓冲流
BufferedInputStream bis = new BufferedInputStream(fis);
//输出缓冲流
BufferedOutputStream bos = new BufferedOutputStream(fos);
//byte缓冲区:大小1M
byte array[] = new byte[1024*10];
int len = -1; //读取字节数标记变量
/**
* bis.read==-1表示文件读取完毕
*/
while((len=bis.read(array)) != -1){
//将缓冲区中的数据写入文件
bos.write(array,0,len);
}
//刷新缓冲区
bos.flush();
//关闭所有资源
fis.close();
fos.close();
bos.close();
bis.close();
}
③文件写入格式化
public void printFormat2() throws IOException{
String arry[] = new String [3];
arry[0] = "这是第一行|111";
arry[1] = "这是第二行|222";
arry[2] = "这是第三行|333";
//文件写入地址
FileOutputStream fos = new FileOutputStream("D:/nicai/arry.txt");
//文件格式化
PrintWriter pw = new PrintWriter(fos,true);
for(String a:arry){
pw.println(a);
}
fos.close();
pw.close();
}
字符流:为字符的输入和输出
注:在底层,所有的输入输出都是字节形式的,字符流只是为处理字符提供方便的方法
①文件创建
public static void createFile2() throws IOException{
//创建文件输出流
FileOutputStream fos = new FileOutputStream("path");
//写入文件的字符串,必须是英文
String str = "There must be English!";
//将字符串转换成字符数组
char array[] = str.toCharArray();
//将字符数组以字符方式写入目标文件
for(char a : array){
fos.write(a);
}
//关闭文件输出流
fos.close();
}
FileWriter
public static void fileWriter() throws IOException{
String str = "这里可以是中文的";
int len = str.length();
//缓冲区
char buff[] = new char[len];
//将字符串赋值到缓冲区
str.getChars(0, len, buff, 0);
//写入对象
FileWriter fw = new FileWriter("C:/fw.txt");
fw.write(buff);
fw.close();
}
②文件读取
read:一次读取一个字符
public static void readFile() throws IOException{
//创建文件输入流
FileInputStream fis = new FileInputStream("path");
//估算输入文件的字节数
int size = fis.available();
//以字符方式,读取每个字节的数据
char c;
for(int i = 0; i < size; i++){
c = (char) fis.read();
System.out.print(c);
}
//关闭输入流
fis.close();
}
readLine:一次读取一行字符
/**
* 字符流文件读取
* 文件内容必须为英文
*/
public static void readFile2() throws IOException{
//字符流文件对象
FileReader fr = new FileReader("path");
//缓冲流
BufferedReader br = new BufferedReader(fr);
//每行数据
String str = null;
/**
* readLine没有读到数据返回null
*/
while((str=br.readLine()) != null){
System.out.println(str);
}
br.close();
fr.close();
}
③文件写入格式化
public void printFormat() throws IOException{
String arry[] = new String [3];
arry[0] = "这是第一行|111";
arry[1] = "这是第二行|222";
arry[2] = "这是第三行|333";
//文件写入地址
FileWriter fw = new FileWriter("D:/nicai/arry.txt");
//文件格式化
PrintWriter pw = new PrintWriter(fw,true);
for(String a:arry){
pw.println(a);
}
fw.close();
pw.close();
}
自动生成目录
<span style="font-size:14px;"> //自动生成文件目录
public void createDir() throws IOException{
//自动生成的目录地址
String path = "D:/nicai/";
File file = new File(path);
//判断地址是否存在
if(!file.exists()){
file.mkdir();
}
FileOutputStream fos = new FileOutputStream(path + "test.txt");
fos.close();
}</span>