1、什么是IO流?
输入:硬盘的数据读取到内存中;
输出:内存的数据写入到硬盘中;
流:数据 —— 字符或字节;
输入输出的主人公是内存;
2、FileOutputStream如何使用?
通过构造方法构造对象;
调用对象中的write()写入数据, close()释放资源方法;
FileOutputStream(String str)构造方法代码演示:
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("a.txt");
fos.write(97);
fos.close();
}
}
FileOutputStream(File file)构造方法代码演示:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest {
public static void main(String[] args) throws IOException {
File f = new File("a.txt");
FileOutputStream fos = new FileOutputStream(f);
fos.write(98);
fos.close();
}
}
3、内存写入数据到硬盘的原理是什么?
Java程序 → JVM → OS(操作系统) → OS调用写数据的方法 → 把数据写入到文件中
4、既然write()中写入的是字节,那么如何在硬盘文件中写入字符串?
将字符串变为字节数组;
字符串有getbytes()方法;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest {
public static void main(String[] args) throws IOException {
File f = new File("a.txt");
FileOutputStream fos = new FileOutputStream(f);
byte[] bytes = "你好".getBytes();
fos.write(bytes);
fos.close();
}
}
5、fos.write() 的参数可以输入哪些参数?
字节;
字节数组;
6、如何实现文件中的追加写而不是覆盖写?
使用不同的FileOutputStream的构造方法;
new FileOutputStream(File file 或 String str, boolean append);
append = true 则是追加写;false 则是覆盖写;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest {
public static void main(String[] args) throws IOException {
File f = new File("a.txt");
FileOutputStream fos = new FileOutputStream(f,true);
byte[] bytes = ",蛋卷".getBytes();
fos.write(bytes);
fos.close();
}
}
7、fos.write()如何换行?
将“\r\n”变为bytes数组;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest {
public static void main(String[] args) throws IOException {
File f = new File("a.txt");
FileOutputStream fos = new FileOutputStream(f,true);
fos.write("\r\n好久不见。".getBytes());
fos.close();
}
}
8、如何使用FileInputStream类读取数据?
重点:
while 循环以实现连续读取;
用一个变量接受读取的数据;
(char)len 使得字节变为字符;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("a.txt");
int len = 0;
while((len = fis.read()) != -1){
System.out.println((char)len);
}
}
}
9、第8题在while循环里面一次读取一个字节,如何一次读取多个字节?
用字节数组;
重点:
fis.read()中传入字节数组;
fis.read(byte[] bytes)返回读取的字节长度;
String的新构造方法 String(byte[] bytes, index, len)
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("a.txt");
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
}
}
10、fis.read()的返回值和fis.read(byte[] bytes)的返回值有何不同?
fis.read()的返回值返回的是读取的字节;
fis.read(byte[] bytes)的返回值返回的是读取的字节长度;
11、如何使用字节流实现文件复制?
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");
int len = 0;
while ((len = fis.read()) != -1){
fos.write(len);
}
fos.close();
fis.close();
}
}
12、字节流和字符流的命名区别是什么?
字节流的命名规则是以OutputStream,InputStream 结尾;
字符流的命名规则是以Reader, Writer 结尾;
13、如何使用字节流读取文件数据?
FileReader类;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderTest {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("a.txt");
int len = 0;
while ((len = fr.read())!= -1){
System.out.print((char)len);
}
fr.close();
}
}
使用字符数组的代码演示:
import java.io.FileReader;
import java.io.IOException;
public class FileReaderTest {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("a.txt");
char[] cs = new char[1024]; // 这里是字符流,所以数组得是字符数组
int len = 0;
while ((len = fr.read(cs))!= -1){
System.out.print(new String(cs,0,len));
}
fr.close();
}
}
14、fw.flush() 和 fw.close() 方法的相同点和区别?
flush 和 close() 都能把缓冲区的内容送到文件中;
区别是 flush后流对象可以继续使用,close后流对象无法继续使用;
15、fw.write() 里面的参数可以有哪些格式?
将光标放在write()中的空括号中,编译器会有提示;
16、fw.write() 如何续写?
构造方法,选择续写的构造方法:
FileWriter fw = new FileWriter(String name, boolean append);