Java文件处理(二):文件读写
读/写文件前请保证文件存在。
文件读取
InputStream
InputStream
是基本的输入流,它是一个抽象类(不是接口)
最基本的方法是int read()
,作用是读取输入流的下一个字节,并返回字节的int
值,返回-1
代表已读到结尾。
按字节读取一个文件流:
public void readFile() throws IOException{
try(InputSteam ins=new FileInputStream("文件路径")){
//FileInputStream是常见的InputStream实现类
int n;
while((n=ins.read())!=-1)
System.out.println(n);
}
//finally{ins.close();}//关闭流,此处编译器已自动添加
}
这里用到了
try(resource)
写法,能让编译器自动关闭资源。不这么写的话请务必加上
close()
。
Reader
Reader
是另一个输入流接口,但它以一个字节(char
)为单位进行读取。Reader
的read()
方法(不用try(resource)
版本):
public void readFile() throws IOException {
// 创建一个FileReader对象:
Reader fr = new FileReader("文件路径");
for (;;) {
int n = reader.read();
if (n == -1) {
break;
}
System.out.println((char)n);
}
reader.close(); // 关闭流
}
文本出现中文时可能有乱码问题,所以需要在创建FileReader
时指定编码:
Reader reader = new FileReader("src/readme.txt", StandardCharsets.UTF_8);
Windows系统的默认编码可能是
GBK
,打开一个UTF-8
编码的文本文件就会出现乱码。
如果需要按行读的话,可以利用Scanner
:
public static void printFile(String file){
//保证文件存在!
Scanner sc= null;
try {
FileReader fr=new FileReader(file);
sc = new Scanner(fr);//给sc提供一个文件对象
while(sc.hasNextLine()){
String line=sc.nextLine();//注意下nextline()不会读取末尾的换行符
System.out.println(line);
}
fr.close();//养成关闭文件流的好习惯
} catch (IOException e) {//抛出异常
System.out.println("File operation failed");
}
}
文件写入
OutputStream
这是基本的输出流,和InputStream
一样也是抽象类,它最基本的方法是void write(int b)
,会写一个字节到输出流。(注意只会写int
的最低8位表示的字节)。
当然更常用的是它的重载方法void write(byte[])
,一次写入多个字节:
public void writeFile() throws IOException {
try (OutputStream output = new FileOutputStream("文件路径")) {
output.write("Hello".getBytes("UTF-8"));
}
}
这里同样利用了try(resource)
写法,让编译器自动关闭资源。
Writer
与Reader
对应,Writer
以字符为单位进行输出。
Writer
是所有字符输出流的超类,它提供的方法主要有:
- 写入一个字符(0~65535):
void write(int c)
; - 写入字符数组的所有字符:
void write(char[] c)
; - 写入String表示的所有字符:
void write(String s)
。
FileWriter
类:属于Writer
的子类。它的使用方法和FileReader
类似:
try (Writer writer = new FileWriter("readme.txt", StandardCharsets.UTF_8)) {
writer.write('H'); // 写入单个字符
writer.write("Hello".toCharArray()); // 写入char[]
writer.write("Hello"); // 写入String
}
构造FileWriter
时可选择写入方式:
FileWriter fileWriter=new FileWriter(file,append);
其中append
为boolean
值,若为true
则保留现有的内容,将新内容附加在该文件的末尾;为false
则使用新内容替换现有内容。
默认情况下为append
为false
。
BufferedWriter
BufferedWriter
和 BufferedReader
为带有默认缓冲的字符输出输入流。
利用BufferedWriter
进行写操作,写入的内容会放在缓冲区内,直到遇到close()
、flush()
的时候才会将内容一次性写入文件。
构造方法:
FileWriter fileWriter=new FileWriter(file,append);
BufferedWriter bf = new BufferedWriter(fileWriter);
主要方法:
void write(char ch);//写入单个字符。
void write(char []cbuf,int off,int len)//写入字符数据的某一部分。
void write(String s,int off,int len)//写入字符串的某一部分。
void newLine()//写入一个行分隔符。
void flush();//刷新该流中的缓冲。将缓冲数据写到目的文件中去。
void close();//关闭此流,再关闭前会先刷新他。
实例代码:
public static void writeFile(String fileName,String content,boolean append) throws IOException {
File file =new File(fileName);
/*没有文件就创建文件*/
File fileParent=file.getParentFile();
if(!fileParent.exists()){
fileParent.mkdirs();
}
if(!file.exists()){
file.createNewFile();
}
FileWriter fileWriter=new FileWriter(file,append);//附加or重写
BufferedWriter bw=new BufferedWriter(fileWriter);
bw.write(content);
bw.close();
}
另外注意close()
的顺序,一定要先关闭BufferedWriter
,再关闭Writer
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)