版权声明:啥是版权,感觉都是侵权必究。我也会究的。 https://blog.csdn.net/Scan_13286/article/details/87862917
IO流的使用
IO流 即 InputStream 和OutputStrean
File类
File的构造
//表示创建一个文件类,而所需参数为 文件的地址
File file = new File("e:"+File.separator+"abc.txt");
File的方法
File.separator //表示一个目录的分隔符“/”(斜杠)
file.isDirectory() //判断file对象是否是目录
file.isFile() //判断file对象是否是文件
file.length() //获取file内容长度;如果是目录的话返回0
file.getName() //获取file的文件名或目录名
file.exists() //判断File对象对应的文件或文件夹是否存在
file.getAbsolutePath() //获取file的绝对路径
file.listFiles() //获取当前file下的子文件夹或子文件【以数组形式】
file.createNewFile() //创建文件file
file.delete() //删除文件file(删除文件夹不一定成功,依赖于系统规定)
遍历某个目录下的文件和文件夹
public static void Print(File file){
if(file.isDirectory()){
if(file.listFiles() != null){
for(File files:file.listFiles()){
System.out.println((files.isFile()?"子文件:":"子文件夹:")+files.getName());
Print(files);
}
}
}
}
InputStream对象和OutputStream对象
这两个对象属于字节流,以字节的方式读取和写入
构造:
//InputStream创建一个输入流,参数可用File对象或path(文件地址)
InputStream is = new FileInputStream(file);
//OutputStream创建一个输出流,参数可用File对象或path(文件地址)
OutputStream os = new FileOutputStream("f:"+File.separator+"temp.txt");
方法
InputStream的方法:
is.read() //按照一个一个字节的方式读取文件,直到读到结束返回 -1.
is.read(byte[]) //按照byte的大小读取文件,直到读到结束返回 -1
is.read(byte[] ,off,len) //按照byte的大小读取文件,中间的值表示偏移量,最后的值表示读取长度
is.close() //关闭流
OnputStream的方法
os.write() //按照一个一个字节的方式写文件到目标文件
os.write(byte[]) //将byte的内容写到目标文件
os.write(byte[],off,len) //将byte的内容写到目标文件,参数意义同上
os.close() //关闭流
实现将目标文件进行复制
public static void exp3(){
String fileName = "f:"+File.separator+"abc.txt";
String fileName2 = "f:"+File.separator+"temp.txt";
FileInputStream is = null;
FileOutputStream os = null;
try{
is = new FileInputStream(fileName); //创建输入流对象
os = new FileOutputStream(fileName2); //创建输出流对象
int data = -1;
while((data=is.read())!= -1){
os.write(data);
}
is.close();
os.close();
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
Reader对象和Writer对象
这两个对象属于字符流,以字符的方式读取和写入
构造
//创建一个输入字符流,参数可为File对象,以可为path(文件路径)
Reader reader = new FileReader(fileName);
//创建一个输出字符流,参数可为File对象,以可为path(文件路径)
Writer writer = new FileWriter(filename);
方法
//Reader的方法
reader.read() //按照两个个字节(一个字符)的方式读取文件,直到读到结束返回 -1.
reader.is.read(char[]) //按照char的大小读取文件,直到读到结束返回 -1
reader.read(char[] ,off,len) //按照char的大小读取文件,中间的值表示偏移量,最后的值表示读取长度
reader.close() //关闭流
//Writer的方法
writer.write(str) //将字符串直接写入到目标文件
writer.write(char[]) //将char[]内容直接写入到目标文件
writer.write(char[],off,len) //将char[]内容直接写入到目标文件,参数意义同上
writer.write(str,off,len) //将字符串直接写入到目标文件,参数意义同上
writer.close() //关闭流
替换文件中的内容:
原文件内容
public static void ChangeStr(){
String filename = "f:" + File.separator + "abc.txt";
try {
Reader reader = new FileReader(filename);
char[] cbuf = new char[2];
String str = "";
while(reader.read(cbuf) != -1){
str += String.copyValueOf(cbuf);
}
str = str.replace("{name}","admin");
str = str.replace("{sex}","no");
str = str.replace("{city}","地球");
//System.out.println(str);
Writer writer = new FileWriter(filename);
writer.write(str);
reader.close();
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
执行ChangeStr()方法后 - ->
BufferedReader对象和BufferedWriter对象
输入字符缓冲流和输出字符缓冲流
构造方法
//创建输入字符缓冲流,参数要是Reader对象
BufferedReader br = new BufferedReader(new FileReader(filename))
//创建输出字符缓冲流,参数要是Writer对象
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
方法
//BufferedReader的方法
br.readLine() //按照读取行的方式读取文件内容,放在内存中
br.skip(n) //跳过n个字符后读取,返回实际跳过的字符数
br.read() //按照读取字符的方式读取文件内容,放在内存中
br.read(char[]) //同Reader,读取内容放在内存中
br.close() //关闭流
//BufferedWriter的方法
bw.write(str) //将str写入内存中
bw.write(char[]) //将char中内容写入内存中
bw.newLine() //写入换行符
bw.flush() //刷新流,真实写入文件中。
bw.close() //关闭流
替换文件内容:
原文件内容
public static boolean exp2(String name,String sex,String city){
try {
BufferedReader br = new BufferedReader(new FileReader(filename));
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
String str = null;
while ((str = br.readLine()) != null){ //读取文件行
str = str.substring(0,str.indexOf(":")+1)+(str.substring(3,str.indexOf(":")).equals("姓名")?name:((str.substring(2,str.indexOf(":")).equals("性别"))?sex:city));
bw.write(str);
bw.newLine();
}
bw.flush();
br.close();
bw.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
执行exp2("aaa","男","火星");
小结:
字节流和字符流的区别:
字节流表示每次只读取一个字节,字符流表示每次读取两个字节(也就是一个字符),中文字符都是以两个字节组成的,如果使用字节流来读取中文,则会先读取一半,再读取另一半,可能造成乱码。
从两者read()方法也可以看出,一个可以将读取的内容放在byte[]中,而一个是放在char[]中。
字符流和字符缓冲流的区别:
字符流是从硬盘中一个一个读取,【而缓冲流是将文件内容放在内容中,从内存中读取】,相比较而言,缓冲流的速度是比字符流快的。
缓冲流有readLine()方法,可以直接按行读取,而字符流没有。
缓冲流的注意点:
缓冲流写入后,要调用flush()方法,对流进行刷新,将流中的内容传输到文件中。
要避免错误调用flush()方法造成的文件覆盖。