Io流
流是指一连串流动的字符,是以先进先出的方式发送信息的通道
总结:(写在前面)
java流的分类
按流向区分:
输出流 | 输入流 |
---|---|
OutputerStream 和Writer作为基类 | InputStream和Reader作为基类 |
按照处理数据单元划分:
字节流 | 字符流 |
---|---|
字节输入流InputStream | 字符输入流Reader |
字节输出流OutputStream | 字符输出流Writer |
可以处理所有文件,但在处理字符上速度不如字符流 | 只能处理字符流,但是速度很快 |
有关文件的操作(类File)
常见操作方法:
package Day16_Test;
import java.io.File;
import java.io.IOException;
public class FileTest {
public static void main(String[] args) {
File file = new File("D:\\a.txt");
System.out.println("判断文件是否存在"+file.exists());
if (!file.exists()) {
if (!file.isFile()) {//错误的判断方式,仅展示创建文件目录
try {
boolean flag = file.createNewFile();
if (flag) {
System.out.println("文件创建成功");
} else {
System.out.println("失败");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {//如果接受的是目录
boolean flag = file.mkdirs();
if (flag) {
System.out.println("路径创建成功");
}else {
System.out.println("路径创建失败");
}
}
}
System.out.println("判断当前路径是否是一个文件"+file.isFile());
System.out.println("判断当前路径是否是一个目录"+file.isDirectory());
System.out.println("文件的 大小"+file.length());
System.out.println("绝对路径"+file.getAbsolutePath());//从系统磁盘根目录开始的路径都是绝对路径
System.out.println("相对路径"+file.getPath());//从当前文件开始的路径
System.out.println("文件的名称:"+file.getName());
}
}
FileInputStream (类)、
字节流用来读取
package Day16_Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
/**
* 文件的读取,FileinputStream
* @author Administrator
*
*/
public class IOStream {
public static void main(String[] args) {
try {
FileInputStream is = new FileInputStream("D:\\FileTest.txt");
// FileOutputStream os = new FileOutputStream("D:\\FileTest.txt",true);
//is.read();一次读取一字节
int num = 0;
do {
num = is.read();
System.out.print((char)num);
} while (num!=-1);
//is.read(ch); 一次读取数组的length的字节数
byte[] ch = new byte[3];
int length = 0;
while (length!=-1) {
length = is.read(ch);
for (byte b : ch) {
System.out.print(b+" ");
}
}
//isread(ch,off,len)
byte[] ch = new byte[2];
int length = 0;
length = is.read(ch, 0, ch.length);
while (length!= -1) {
System.out.println("字节数: "+length);
String s = new String(ch);//这里调用String的构造方法,将数组转换为字符串
System.out.println(s);
length = is.read(ch, 0, ch.length);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
FileOutputStream(类)
字节流,用于写入
package Day16_Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
/**
* 文件的读取,FileinputStream
* @author Administrator
*
*/
public class IOStream {
public static void main(String[] args) {
try {
// FileInputStream is = new FileInputStream("D:\\FileTest.txt");
//这个构造函数的第二个参数 true代表在原来文件的基础上追加操作
//false表示先清空原文件,在进行写操作,不写默认为false
FileOutputStream os = new FileOutputStream("D:\\FileTest.txt",true);
byte[] b = {'a','c'};
String str = "快乐学习";
os.write('a');
os.write(b);
os.write(b, 0, b.length);
byte[] c = str.getBytes();//利用String的方法讲字符串转换为byte[];
os.write(c);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
FileReader (类) 字符流
使用字符数组接受流中数据
简单的使用:(出现的方法参考API)
package Day16_Test;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class ReadFile {
public static void main(String[] args) {
try {
//锟侥硷拷锟街凤拷锟斤拷取锟斤拷
FileReader fr = new FileReader("D:\\FileTest.txt");
//这是第一种方式:read(int num);
// int ch = fr.read();//锟斤拷取一锟斤拷锟街凤拷
// System.out.println(ch);
// fr.close();
// char[] c = new char[2];
// int ch = fr.read(c);
// while (ch!=-1) {
// System.out.println(ch);
// System.out.println(c);
// ch =fr.read(c);
// }
// fr.close();
//按照字符数组读取
//出现乱码请按照下面出现编码的格式修改本身工程的编码格式,以及所操作的文档
char[] ch = new char[2];
int c = fr.read(ch, 0, ch.length);
while (c!=-1) {
System.out.println(ch);//new String(new String(ch).getBytes(),"GBK")
c = fr.read(ch, 0, ch.length);
}
fr.close();
System.out.println("成功");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
FileWriter类 (字符流)
对文件原有内容的替换:
package Day16_Test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Day16_Job {
public static void main(String[] args) {
File file = new File("D:\\DayJob.txt");
try {
//思路:先读取文本内容,使用字符数组存储,
//并使用String类的构造方法将其转换为字符串
//涉及多个字符串,使用String.append方法合并字符串
FileReader fr = new FileReader(file);
char[] ch = new char[1024];
int c = fr.read(ch, 0, ch.length);
String str = new String(ch);
System.out.println(str);
str = str.replace("name", "小李");
str = str.replace("sex", "男");
str = str.replace("hobby", "打篮球");
fr.close();
FileWriter fw = new FileWriter(file);
fw.write(str);
fw.flush();
fw.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
循环写法
缓冲流
能对字符或者字节流的读写更加的高速,又称:增强IO流
要求:必须对基本流进行包装
(结合上一个字符流来看)
package Day16_Test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileWirterT {
public static void main(String[] args) {
File file = new File("D:\\FileWirter.txt");
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
BufferedWriter bw = null;
try {
fr = new FileReader(file);
//添加缓冲流,使文件读写更高效
br = new BufferedReader(fr);
fw = new FileWriter("D:\\FileWirter2.txt",true);
bw = new BufferedWriter(fw);
//char[] ch = new char[2];
//int length = 0;
String str = new String();
//特有方法,可以读取一行,
str = br.readLine();
StringBuffer sb = new StringBuffer();
while (str!=null){
bw.write(str);
bw.newLine();
bw.flush();
sb.append(str);
str =br.readLine();
//缓冲流的缺点:必须对每行手动增加换行
}
System.out.println("!!!");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//正确的关闭方式,按照使用开启的顺序关闭,一定要做非空判断
try {
if (br!= null) {
br.close();
}
if (fr!=null) {
fr.close();
}
if (bw!=null) {
bw.close();
}
if (br!=null) {
br.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
PrintWriter 输出流
不需要缓冲流,直接使用
特有方法:
PrintWriter pw = new PrintWriter(“文件名”);
pw.println();//输出自动带换行
pw.newline();//输出换行