文件内容的读写分为读写字符与读写字节,他们使用的是不同的类与方法.
字节流
InputStream
InputStream是读取抽象类,对文件进行写入需要使用FIleInputStream.FIleInputStream中的部分方法如下:
| 修饰符及返回值类型 | 方法名 | 说明 |
| FileInputStream(FIle file) | 利用file构造文件输入流 | |
| FileInputStream(String name) | 利用文件路径构造输入流 | |
| int | read() | 读取一个字节,返回-1表示文件已读完. |
| int | read(byte[] b) | 最多读取b.length字节的数据到b中,返回实际读到的数量,-1代表 文件已读完. |
| int | read(byte[] b,int off,int len) | 最多读取len字节的数据到b中,从b[off]开始填充数据,返回实际独到的数量,-1代表文件已读完. |
| void | close() | 关闭字节流 |
在使用构造方法时,未找到文件则抛出FileNotFoundException异常,如果找到了文件则打开文件.在使用完毕FIleInputStream后需要调用close来关闭文件,也可以将构造方法放入try(){}中,让代码块执行完毕后自动关闭文件.
InputStream inputStream = new FileInputStream("./Test.txt");
inputStream.close();
try(InputStream inputStream = new FileInputStream("./Test.txt");){
}
read的使用(Test文件中的内容为"Hello"):
try(InputStream inputStream = new FileInputStream("./Test.txt");){
while (true) {
int b = inputStream.read();
if (b == -1) {
break;
}
System.out.printf("%c", (char) b);
}
}

try(InputStream inputStream = new FileInputStream("./Test.txt");) {
while (true) {
byte[] b = new byte[1024];
int n = inputStream.read(b);
if (n == -1) {
break;
}
System.out.print(new String(b, 0, n));
}
}

try(InputStream inputStream = new FileInputStream("./Test.txt");) {
while (true) {
byte[] b = new byte[10];
int n = inputStream.read(b,3,2);
if (n == -1) {
break;
}
System.out.println(new String(b,3,n));
}
}

利用Scanner进行字符的读取
在此处Scanner的构造方法中不再传入System.in,而是使用FileInputStream对象来构造Scanner对象,这样就可以通过scanner来访问文件.
public static void main(String[] args) throws FileNotFoundException {
try(InputStream inputStream = new FileInputStream("./Test.txt");
Scanner scanner = new Scanner(inputStream)) {
while(scanner.hasNext()){
System.out.print(scanner.next());
}
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}

OutputStream
与InputStream相对应OutputStream在操作文件时也需要使用FileOutputStream.FileOutPutStream的部分方法如下:
| 修饰符及返回值类型 | 方法名 | 说明 |
| FileoutputStream(String name) | 利用文件路径构造输出流,默认清空打开文件的内容 | |
| FileoutputStream(String name,boolean append) | 利用文件路径构造输出流,append传入true不清空打开文件的内容,传入false清空文件内容. | |
| FileoutputStream(File file) | 利用file对象构造输出流,默认清空打开文件的内容 | |
| FileoutputStream(File file,boolean append) | 利用file对象构造输出流,append传入true不清空打开文件的内容,传入false清空文件内容. | |
| void | write(int b) | 写入单个字节数据 |
| void | write(byte[] b) | 将b数组中的内容写入文件 |
| void | write(byte[] b,int off,int len) | 将b这个数组中从off开始写入len个字符到文件中. |
| void | close() | 关闭字节流 |
| void | flush() | 刷新缓冲区 |
write的使用:
try(OutputStream outputStream = new FileOutputStream("./Test.txt",true);){
outputStream.write('A');
} catch (IOException e) {
throw new RuntimeException(e);
}

try(OutputStream outputStream = new FileOutputStream("./Test.txt",true);){
byte[] flush = {'N','i','H','a','o'};
outputStream.write(flush);
} catch (IOException e) {
throw new RuntimeException(e);
}

try(OutputStream outputStream = new FileOutputStream("./Test.txt",true);){
byte[] flush = {'N','i','H','a','o'};
outputStream.write(flush,2,3);
} catch (IOException e) {
throw new RuntimeException(e);
}

字符流
与字节流相对应,字符流每次读取都是以字符为单位进行的.
Reader
Reader是字符流的读取抽象类,在操作文件时需要实例化File Reader对象.
| 修饰符及返回值类型 | 方法名 | 说明 |
| FileReader(FIle file) | 利用file构造文件输入流 | |
| FileInputStream(String name) | 利用文件路径构造输入流 | |
| int | read() | 读取一个字节,返回-1表示文件已读完. |
| int | read(char[] b) | 最多读取b.length字符的数据到b中,返回实际读到的数量,-1代表 文件已读完. |
| int | read(char[] b,int off,int len) | 最多读取len字符的数据到b中,从b[off]开始填充数据,返回实际独到的数量,-1代表文件已读完. |
| void | close() | 关闭字节流 |
此处的read方法的使用与InputStream相似,但是读取是以字符为单位进行.
try (Reader reader = new FileReader("./Test.txt")) {
while(true){
int n = reader.read();
if(n == -1){
break;
}
System.out.print((char)n);
}
} catch (IOException e) {
throw new RuntimeException(e);
}

Writer
Writer是字符流的读取抽象类,在操作文件时需要实例化FileWriter对象.
| 修饰符及返回值类型 | 方法名 | 说明 |
| Writer(String name) | 利用文件路径构造输出流,默认清空打开文件的内容 | |
| Writer(String name,boolean append) | 利用文件路径构造输出流,append传入true不清空打开文件的内容,传入false清空文件内容. | |
| Writer(File file) | 利用file对象构造输出流,默认清空打开文件的内容 | |
| Writer(File file,boolean append) | 利用file对象构造输出流,append传入true不清空打开文件的内容,传入false清空文件内容. | |
| void | write(int b) | 写入单个字节数据 |
| void | write(byte[] b) | 将b数组中的内容写入文件 |
| void | write(byte[] b,int off,int len) | 将b这个数组中从off开始写入len个字符到文件中. |
| void | close() | 关闭字节流 |
| void | flush() | 刷新缓冲区 |
此处writer的使用与OutpuStream类似,以字符为单位.
try (Writer writer = new FileWriter("./Test.txt",true)) {
char[] flush = {'J','a','v','a'};
writer.write(flush);
}


被折叠的 条评论
为什么被折叠?



