开发者经常会使用到读写文件的功能,java中使用流来实现文件的读写。
1、字符输入流
读取一个文件,先使用逐个字符读取的方式,代码如下:
package com.fileReaderDemo.cc;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
//读取字符经常会用到FileReader,构造方法中传入文件的路径
FileReader fr = new FileReader("E://demo.txt");
//该变量接收read()方法返回的ASCII码
int c;
//使用循环将其逐个打印出来,
while((c = fr.read())!=-1){
//这里,需要将c强制转换成char类型
System.out.print((char)c);
}
/*
* 关闭流资源,关闭后该对象与内存的关联就取消了,
* 如果后面还要用的话,可以使用fr.flush()方法,
* 先将数据保存,然后继续使用该对象。
*/
fr.close();
}
}
当然,在字符很多的时候,逐个读取的话,会非常浪费时间,所以我们用到FileReader类的read(char[])方法
public class FileReaderUseArrayDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("E:\\demo.txt");
/*
* 该数组存储字符,每次存3个
* 通常会将数组的长度定义为1024
* 此处定义了3个是为了演示一个问题
*/
char[] ch = new char[3];
while(fr.read(ch)!=-1){
System.out.print(ch);
}
fr.close();
}
}
demo.txt中存了1234567890 一共十个字符,而打印出来的结果是:123456789089,原因是因为数组每次存3个字符,第三次存了{7,8,9},第四次的时候,只把ch[0]修改为0,后面两个字符是没有变的,所以多打印了8和9。所以我们将其修改一下。
package com.fileReaderDemo.cc;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderUseArrayDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("E:\\demo.txt");
// 该数组存储字符,每次存3个
char[] ch = new char[3];
//该变量存储读取有效位的长度
int len;
//每次存储读取到的有效位
String str = null;
//fr.read(ch)会返回读取到的有效位的长度
while((len=fr.read(ch))!=-1){
//使用str存储有效位,String的构造方法,读取数组指定位置
str = new String(ch,0,len);
System.out.print(str);
}
fr.close();
}
}
修改之后,最后一次打印,就只打印了读取到的有效位:0。
2、字符输出流
将字符写入一个文本文件,经常使用FileWriter类,该类与FileReader类对象,一个读一个写。
package com.demo.cc;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//新建FileWriter对象,并传入文件地址
FileWriter fw = new FileWriter("E:\\demo.txt");
//写入Hello World!
fw.write("Hello World!");
//刷新流
fw.flush();
//关闭流,每次流关闭的时候也会先刷新流
fw.close();
}
}
使用该方法新建的输出流,每次都会将原有的文件覆盖,然后重新写入数据,所以每次运行该程序,demo.txt文件中都只有一个Hello World,如果不想覆盖文件,则需要使用另一个构造方法 FileWriter(String file,Boolean bool)
使用方法如下:
package com.demo.cc;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//新建FileWriter对象,并传入文件地址
FileWriter fw = new FileWriter("E:\\demo.txt",true);
//写入Hello World!
fw.write("Hello World!");
//刷新流
fw.flush();
//关闭流,每次流关闭的时候也会先刷新流
fw.close();
}
}
突然不知道该说什么了,脑子里冒出来一个想法,就是遇到不熟悉的东西,好多人都直接在网上搜索,比如,刚刚我不想让它直接覆盖文件,我上网搜索可能一下就找到了答案,但是除了答案之外,我好想什么都没学到,但是下载一个jdk的API文档,找到FileWriter类的使用,你可能会有意想不到的收获。所以,还是不要贪图快捷的小便宜,能学到更多才是重要的。
好了,接下来开始复制文本文件,过程就是在目标目录下创建一个文件,将内容完全的复制到该文件中就可以了
package com.demo.cc;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileCopyDemo {
public static void main(String[] args) throws IOException {
//新建输出流,指定目录下应该存在该文件,否则会发生异常
FileReader fr = new FileReader("E:\\demo.txt");
//新建输入流
FileWriter fw = new FileWriter("E:\\demoCopy.txt");
//该变量存储有效位的长度
int len;
char[] ch = new char[10];
//循环读取,直到返回-1
while((len=fr.read(ch))!=-1){
//该方法是将数组的有效位写入文件中
fw.write(ch, 0, len);
}
//关闭流资源
fr.close();
fw.close();
}
}