java 对文件内存的读取与写入是通过 流 的操作完成的。从java内存容器的角度去看数据的流的入(Input)与出(Output)。对处理的数据类型区分出字节流与字符流。
在java.io下有一组以File 开头的Stream类实现再对文件的内容写入与读出。
类 | 说明 |
---|---|
FileOutputStream | 字节流方式写入文件内容 |
FileInputStream | 字节流方式读取文件内容 |
下面两个类能对字符(串)对文件完成写入与读出,对中文处理实际上更为方方便。 | |
FileWriter | 以字符流写入文件内容(允许直接字符串写入文件) |
FileReader | 字符流方式读取文件内容 |
上面4个共公类继承于下面4个抽象类:
类 | 类定义 | 说明 |
---|---|---|
java.io.OutputStream | public abstract class OutputStream extends Object implements Closeable, Flushable | 流输出类 |
java.io.InputStream | 流输入类 | |
java.io.Reader | public abstract class Reader extends Object implements Readable, Closeable | 字符输入流 |
java.io.Writer | public abstract class Writer extends Object | 字符输出流 |
IO中的文件读写类
类 | 类定义 | 说明 |
---|---|---|
java.io.FileInputStream | public class FileInputStreamextends InputStream | 读文件类 |
java.io.FileOutputStream | public class FileOutputStream extends OutputStream | 写文件类 |
java.io.FileWriter | public class FileWriter extends OutputStreamWriter | 字符串写文件类 |
java.io.OutputStream 主要方法
返回类型 | 方法 | 说明 |
---|---|---|
void | close() | 关闭 |
void | write(byte[] b) | 输出到 byte 数组 b |
void | write(byte[] b, int off, int len) | 指定位置和长度 输出到byte 数组 ,实现部份输出。 |
类 | 说明 |
---|---|
public class FileOutputStream extends OutputStream | 父类:OutputStream ,文件输出类 |
FileOutputStream 构造方法
构造方法 | 参数说明 |
---|---|
public FileOutputStream(File file) throws FileNotFoundException | File file :文件路径实例对象 |
public FileOutputStream(File file, boolean append) throws FileNotFoundException | File file:文件路径, boolean append :是否追加内容 |
例1:使用FileOutputStream类 写入文本文件的例程
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 修改一个文本文件的内容
*
* @author wyh
*
*/
public class FileOutputStreamDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
File file = new File("D:"+ File.separator+"java"+File.separator+"temp"+File.separator+"info.txt" ); // 文件对象
File pare = file.getParentFile() ; //返回父目录
if (!pare.exists()) {
pare.mkdirs(); // 当目录不存在时,建立新的目录
}
String strinfo = "系统说明";
try {
FileOutputStream outstream = new FileOutputStream(file);
outstream.write(strinfo.getBytes()); // 写入文件
outstream.close(); // 关闭资源
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
java.io.InputStream 主要方法
返回类型 | 方法 | 说明 | 参数 |
---|---|---|---|
int | public int available() throws IOException | 返回可用的字节数量 | |
int | public abstract int read() throws IOException | 抽象方法。从输入流中读取一个数据字节。 | 返回值>0指读取的字节个数, -1,已全部读取; |
int | public int read(byte[] b) throws IOException | 读取字节数组。 | 主要方法. b 读取数据的目标字节数组. |
int | public int read(byte[] b, int off, int len) throws IOException | 从一个字节数组中读取部份数据 | 参数:b - 读取的数据返回的目标数组.off - 起始位置.len - 最大的读取数量. |
FileInputStream构造方法
构造方法 | 参数 |
---|---|
FileInputStream(File file) | File file 要处理的文件路径对象 |
FileInputStream(FileDescriptor fdObj) | fdObj文件描述符类实例 |
FileInputStream(String name) | String name 要处理的字符串文件名 |
例2:使用 FileInputStream 类,把文件内存读入内存例子:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author
*
*/
public class FileInputStreamDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
// 以下准备一个文件
File file = new File("D:" + File.separator + "java" + File.separator + "temp" + File.separator + "info.txt"); // 文件对象
File pare = file.getParentFile(); // 返回父目录
if (!pare.exists()) {
pare.mkdirs(); // 当目录不存在时,建立新的目录
}
String strinfo = "系统说明";
try {
FileOutputStream outstream = new FileOutputStream(file);
outstream.write(strinfo.getBytes()); // 写入文件
outstream.close(); // 关闭资源
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
// 以下使用 FileInputStream 读取上面准备的文本文件内容
File file2 = new File("D:" + File.separator + "java" + File.separator + "temp" + File.separator + "info.txt"); // 文件对象
if (!file2.exists()) {
System.out.println("文件:" + file2.toString() + " 不存在!");
return;
}
int len = (int) file2.length();// 文件的长度
System.out.println("文件的长度是:" + len);
FileInputStream input;
try {
input = new FileInputStream(file2);
byte data[] = new byte[len]; // 以文件的长度创建一个字节数组
int i = input.read(data); // 把文件内空读入内存中的 data字节数组
System.out.println("文件长度:" + i + " 内容:[" + new String(data).trim() + "]");
input.close(); // 关闭
// System.out.println(input.available());
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public abstract class Writerextends Objectimplements Appendable, Closeable, lushable
返回类型 | 方法 | 说明 | 参数 |
---|---|---|---|
writer | public Writer append(char c) throws IOException | 将指定的字符追加到此写入器。 | |
Writer | public Writer append(CharSequence csq, int start, int end) | 将指定字符串序列追加到此写入器。 | |
void | public void write(char[] cbuf) | 输出一个字符数组 | char[] cbuf :方法的目标输出的字符数组空间 |
void | public void write(String str) | 输出字符串 | String str: 接收的字符串对象 |
FileWriter类继承关系
java.lang.Object
|-- java.io.Writer
|-- java.io.OutputStreamWriter
|-- java.io.FileWriter
FileWriter类构造方法
构造方法 | 说明 | 参数 |
---|---|---|
public FileWriter(File file) throws IOException | File file : 文件路径对象 | |
public FileWriter(File file, boolean append) throws IOException | 追加写入 | File file : 文件路径对象;boolean append : true 时追加写入 |
从 java.io.Writer 类继承的方法:
append, write
方法 | 说明 | 参数 |
---|---|---|
write(String str) | 向文件写入数据 | |
append(String str) | 追加写入数据 |
例3:使用FileWriter类写入字符串类型的数据到一个文本文件
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* @author
*
*/
public class FileWriterDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO 自动生成的方法存根
File file = new File("D:" + File.separator + "java" + File.separator + "temp" + File.separator + "info.txt"); // 文件对象
// 保证存在父路径
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
FileWriter writer = new FileWriter(file);
//FileWriter writer = new FileWriter(file,true); // 追加方式
String info = "这是我的程序信息文件! ";
writer.write(info); // 对文件写入内容
writer.append("\r\n"); // 换行 // 插入文本
writer.append("程序参数1:1080\r\n"); //
writer.append("程序参数2:720\r\n");
writer.close(); // 关闭,实际上文件的写入是在关闭时才进行,建议使用手动关闭的方式
System.out.println("完成!");
}
}
重点说明:close(); // 关闭,实际上文件的写入是在关闭时才进行,建议使用手动关闭的方式,我们使用其他流类时也建议采用手动关闭(写上close()关闭方法行)
java.io.Reader类
public abstract class Reader extends Object implements Readable, Closeable
用于读取字符流的抽象类。
返回类型 | 方法 | 说明 |
---|---|---|
int | public int read(char[] cbuf) throws IOException | 读字符流至字符数组 |
int | public int read(CharBuffer target) throws IOException | 读字符流至字符缓冲器 |
java.io.FileReader 文件字符流读取
继承关系
java.lang.Object
|-- java.io.Reader
|-- java.io.InputStreamReader
|–java.io.FileReader
public class FileReader extends InputStreamReader
FileReader 构造方法
构造方法 | 参数说明 |
---|---|
public FileReader(File file) throws FileNotFoundException | File file: 文件路径对象 |
public FileReader(String fileName) throws FileNotFoundException | String fileName :文件名字符串 |
从 java.io.Reader 类继承过来的方法:
mark, markSupported, read, read, reset, skip
例4:使用 FileReader 类从文件读取内容例子
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* @author wyh
*
*/
public class FileReaderDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO 自动生成的方法存根
// 文件路径对象
File file = new File("D:" + File.separator + "java" + File.separator + "temp" + File.separator + "info.txt"); // 文件对象
// 保证文件是存在的
if (!file.exists()) {
return;
}
// 创建文件字符流读取对象
FileReader reader = new FileReader(file);
char cbuf [] = new char[ (int) file.length()]; // 以文件长度创建字符数组
reader.read(cbuf); // 把文件内存读入字符数组 cbuf
String str= new String(cbuf); //字符数组转字符串
System.out.println(str); // 打印输出
reader.close(); // 关闭流对象
}
}
以上通过 字节流 和字符流读取与写入文本文件的测试完成。