输入输出流(一)
流的概念和分类
1.按照流的方向分类:
输入流,例如FileInputStream,FileReader,BufferedReader;
输出流,例如FileOutputStream,FileWriter,BufferedWriter;
每一个输入流几乎都能找到一个输出流和它相对应
2.按照流的基本数据单位大小分类
字节流,例如FileInputStream,FileOutputStream,以一个字节或者字节的倍数为单位进行 读写
字符流,例如FileReader,FileWriter,BufferedReader,BufferedWriter,以一个字符或者 字符的倍数为单位进行读写
File类
File类在java.io中,主要用来获取文件本身的一些信息,如文件所在的目录、文件的长度等,不能对文件的内容进行读写
构造方法:
Public File(String name)
File file1=new File("D:\\enjoy\\data1.txt"); File file2=new File("data\\data2.txt"); File file3=new File("data");
Public File(String parent,String child)
File file4=new File("D:\\enjoy", "data"); File file5=new File("D:\\enjoy", "data4.txt");
Public File(File parent, String child)
File file6=new File("D:\\enjoy"); File file7=new File(file6, "data.txt");
成员方法:
1 | //文件名或目录名信息获取: |
public File[] listfiles() 要实现FilenameFilter接口
File类不能实现对文件的读写操作,这时需要用到文件流:文件字节流和文件字符流
文件——>内存:文件输入流
内存——>文件:文件输出流
文件字节流
文件字节输入流 (FileInputStream类,显然是InputStream类的子类)
注意!不允许文件不存在,且文件内容不能为空
构造方法:
FileInputStream in = new FileInputStream(String name);
FileInputStream in = new FileInputStream(File);
例如:
FileInputStream in = new FileInputStream("a.txt");
或者
File f = new File("lianxi1.txt");
FileInputStream in = new FileInputStream(f);
读方法:
FileInputStream类的对象调用read()方法顺序地读取文件,直到文件的末尾或者流被关闭, read()方法如下所示
1 | public int read() throws IOException;//一次读取一个字节,将其转换为该字符在Unicode表的位置,并返回,但汉字不适用,汉字占两个字节,此方法会将一个汉字分开,字符流则不存在这种情况 |
读取位置达到文件末尾,则返回-1
文件字节输出流(FileOutputStream类)
允许文件不存在,不存在时会自动创建
构造方法:
FileOutputStream out = new FileOutputStream(String name);
或
FileOutputStream out = new FileOutputStream(File);
注意:构造方法只有一个参数时,默认为false,新写入的内容会覆盖掉原来的内容,要想在原来的基础上继续写入,需要使用new FileOutputStream(File,true)
写方法:
FileOutputStream类的对象调用write()方法顺序地向文件写入内容,直到流被关闭,输入之初如果文件已经存在,则内容将被刷新;如果文件不存在,则文件将被创建,write()方法如下所示
1 | public void write(byte[ ] b) throws IOException; |
文件字符流
文件字符输入流(FileReader类)
构造方法与字节输入流类似
FileReader类的对象调用read()方法顺序地读取文件,直到文件的末尾或者流被关闭, read()方法如下所示
1 | public int read() throws IOException; |
读取位置达到文件末尾,则返回-1
文件字符输出流(FileWriter类)
构造方法与字节输出流类似
FileWriter类的对象调用write()方法顺序地把字符数据写入文件,write()方法如下所示
1 | public void write(int c) throws IOException;//写一个字符 |
结合字符缓冲流实现读取一行内容
文件——>文件输入流——>缓冲输出流——>内存
内存——>缓冲输出流——>文件输出流——>文件,在这里文件输出流完全可以实现换行,所以输出没必要通过缓冲流
字符缓冲流
字符缓冲输入流BufferedReader类:
构造方法:
1 | public BufferedReader(Reader in); //参数可以是Reader类也可以是Reader类的子类,如FileReader类 |
BufferedReader类读取一行数据的方法:
1 | public String readLine() throws IOException; |
实例:
编写一个Java源程序,其中包含:
编写一个包含主方法main的公共类(访问权限为public的类),主方法main中完成的任务是:
(1)从键盘上输入两个文件的路径名及其文件名。
(2)从键盘上输入若干学生的信息(姓名,数学成绩,计算机成绩,各项之间用空格隔开),以finish结束,将这些学生的信息写入第一个文件。
(3)将第一个文件作为输入流的源,找出姓“张”的学生,将他们的信息写入第二个文件。
1 | import java.util.*; |
字节流、对象流不在考试范围内
线程同步或者联合
随机读写流读取汉字时会有乱码问题,此时是用
byte[] b=s.getBytes(“ISO-8859-1”);
String s1=new String(b);
语句可解决此问题