文件流的操作:
Java中主要的流:
按数据流向:输入流和输出流
输入和输出都是从程序的角度来说
输入流:数据流向程序
输出流:数据从程序流出
按处理单位(宽度):字节流和字符流,
字节流:一次读入或者读出是8位二进制
字符流:一次读入或者读出是16位二进制
JDK中后缀是Stream的是字节流,后缀是Write和Reader是字符流,字符流主要是让人能看懂的。
按照功能分:节点流和处理流
节点流:直接与数据源相连,读入或者写出,
也就是对应资源的流:
- 文件资源:FileInputStream,FileOutputStream。。。。等等。
- 内存资源:ByteArrayInputStream,CharArrayReader.
- 进程间通讯(对管道进行操作):PipedOutStream(字节输出流),Piped…等等。
- 网络通讯:从套接字得到
- 键盘输入:
处理流:与节点流一块使用,在节点流的基础上,在套接一层。
- Bufferd缓冲流。
- 转换流:InputStreamReader,OutputStreamWritre.
- 数据流:DataInputStream。DataInputStream
- 打印流:PrintStream。PrintWrite。
最根本的四大类:
InputStream(字节输入流)
public class InoutTest {
public static void main(String[] args) throws IOException {
File file=new File("resource/test1.txt");
InputStream inputStream=new FileInputStream(file);
int input;
while((input=inputStream.read())!=-1) {
System.out.println((char)input);
}
inputStream.close();
}
}
OutputStream(字节输出流)
public class OutputStraem {
public static void main(String[] args) throws IOException {
// test1();
// test2();
// test3();
test4();
}
private static void test1() throws IOException {
// 文件输出流,会自动创建文件,不能创建目录
OutputStream outputStream=new FileOutputStream("resource/test2.txt");
int a=97;
outputStream.write(a);
outputStream.close();
System.out.println("写入成功");
}
private static void test2() throws IOException {
// 文件输出流,会自动创建文件,不能创建目录
// 构造参数append,为true是追加模式,false是覆盖模式(默认)
OutputStream outputStream=new FileOutputStream("resource/test2.txt",true);
// int a=97;
byte[] array= {98,99,100};
outputStream.write(array);
outputStream.close();
System.out.println("写入成功");
}
private static void test3() throws IOException {
// 文件输出流,会自动创建文件,不能创建目录
// 构造参数append,为true是追加模式,false是覆盖模式(默认)
OutputStream outputStream=new FileOutputStream("resource/test2.txt",false);
// int a=97;
byte[] array= {98,99,100};
outputStream.write(array);
outputStream.write(array, 1, 2);
outputStream.flush();//flusf的作用:把缓冲区内容写入资源
outputStream.close();//close会flush,在close前应该强制flush,保护性写法
System.out.println("写入成功");
}
private static void test4() throws IOException {
// 文件输出流,会自动创建文件,不能创建目录
// 构造参数append,为true是追加模式,false是覆盖模式(默认)
OutputStream outputStream=new FileOutputStream("resource/test2.txt",false);
// int a=97;
// byte[] array= {98,99,100};
// outputStream.write('立');一个汉字有两个字节,值写入了前半个,所以显示不出来。
// outputStream.write(array, 1, 2);
outputStream.flush();//flusf的作用:把缓冲区内容写入资源
outputStream.close();//close会flush,在close前应该强制flush,保护性写法
System.out.println("写入成功");
}
}
Reader(字符输入流)
public class ReadTest {
@Test
public void test() {
String name="resource/test1.txt";
try(Reader reader=new FileReader(name)) {
int i=0;
while((i=reader.read())!=-1) {
System.out.println((char)i);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
Write(字符输出流)
public class WriteTest {
@Test
public void test() {
String name="resource/test3.txt";
try(Writer writer=new FileWriter(name)) {
writer.write("能写进去");
writer.write('a');
writer.flush();
writer.close();
System.out.println("写入成功");
} catch (Exception e) {
// TODO: handle exception
}
String name1="resource/test4.txt";
try(Writer writer=new FileWriter(name1)) {
writer.write("能写进去");
writer.write("\r\n");
writer.write("能写进去2");
writer.write("\r\n");
writer.write("能写进去3");
writer.write("\r\n");
writer.write("能写进去4");
// writer.write('a');
writer.flush();
writer.close();
System.out.println("写入成功");
} catch (Exception e) {
// TODO: handle exception
}
}
}
缓冲流的读和写:
public class BufferedReaderTest {
public static void main(String[] args) throws IOException {
FileReader fileReader=new FileReader("resource/test4.txt");
BufferedReader bufferedReader=new BufferedReader(fileReader);
FileWriter fileWriter=new FileWriter("resource/test4.txt");
BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
bufferedWriter.write("新写入的内容1");
bufferedWriter.newLine();
bufferedWriter.write("新写入的内容2");
bufferedWriter.close();
System.out.println(bufferedReader.readLine());
System.out.println(bufferedReader.readLine());
// System.out.println(bufferedReader.readLine());
// System.out.println(bufferedReader.readLine());
// System.out.println(bufferedReader.readLine());
bufferedReader.close();
}
}