硬盘==>内存:读(input)
内存==>硬盘:写(output)
2.File类常用方法
新建文件:File file = new File(“D:\aaa\”,“1.txt”);
File file = new File("D:"+System.getProperty("file.separator")+"1.txt"); //下划线可用property键值对替代
文件长度:length();
文件名:getName();
文件所在目录:getParent();
文件路径:getPath(); getAbsolutePath();
上次修改时间:lastModified();
创建文件:createNewFile();
创建目录:mkdir(); mkdirs();(多级目录用后者)
删除文件:delete();
判断是否隐藏文件:isHidden();
判断是否为空:isEmpty();
判断是否文件、目录:isFile(); isDirectory();
获取所有文件名,获取所有文件(包含隐藏文件):list(); listFiles();
- File类实用方法(过滤器,遍历,将txt文件放到一个集合中)
(1).文件名过滤器(FilenameFilter)、文件过滤器(FileFilter)
class IOFilterByName implements FilenameFilter{
private String content;
public IOFilterByName(String content){
this.content = content;
}
public boolean accept(File dir,String name){
return name.contains(content);
}
}
(2).遍历指定目录下的所有文件(递归)
public static void getAllFiles(File file){
File[] files = file.listFiles();
for(File f:files){
if(f.isDirectory()){
getAllFiles(f);
}else{
System.out.println(f);
}
}
}
什么时候用递归:多次用到同样方法但是参数不同的时候
(3).将指定文件夹下后缀为txt的文件放到集合中
public static void main(String[] args){
File dir = new File(“D:\aaa”);
IOFilterByEndName filter = new IOFilterByEndName(“txt”);
List list = new ArrayList();
List list2 = searchDir(dir,filter,list);
for(File f:list2){
System.out.println(f);
}
}
//写文件过滤器
public IOFilterByEndName implements FileName{
private String content;
public IOFilterByEndName(String content){
this.content = content;
}
public boolean accept(File pathName){
return pathName.getName().endWith(content);
}
}
//将所有文件放到list中
public static List<File> searchDir(File dir,IOFilterByEndName filter,List<File> list){
File[] files = dir.listFiles();
for(File f:files){
if(f.isDirectory()) searchDir(f,filter,list);
else{
if(filter.accept(f)) list.add(f);
}
}
return list;
}
4.普通流(重点)
(1).流的基本分类
按流操作的数据:字节流,字符流
按流的流向:输入流(读),输出流(写)
字节流的抽象基类:InputStream,OutputStream
字符流的抽象基类:Reader,Writer
(2).字节流
^1.文件字节流:FileInputStream,FileOutputStream
^2.字节流的读取(2种方法,区别在于有无缓存)
File dir = new File("D:\\aaa");
FileInputStream fis = new FileInputStream(dir);
方法一:
int len = 0;
while((len = fis.read())!=-1){
System.out.println(len);
}
fis.close();
方法二:
Byte[] bs = new Byte[1024];
int len = 0;
while((len = fis.read(bs))!=-1){
System.out.println(new String(bs,0,len));
}
fis.close();
注:方法二可以直接设定缓存区大小为文件大小:Byte[] bs = new Byte[fis.available()];
^3.字节缓存流:BufferedInputStream,BufferedOutputStream
基本上同上,但是在流关闭之前要bos.flush()刷新一下,将缓存区的数据写入到设备里。
(3)字符流
^1.文件字符流:FileReader,FileWriter
将字节流转换成字符流的叫转换流:InputStreamReader,OutputStreamWriter
字符流 = 字节流 + 转换流
^2.字符流的读取:基本同上,唯一不同在于:Char[] chars = new Char[1024];
^3.字符缓存流:BufferedReader,BufferedWriter
读取基本也同上,区别:while((line = br.readline())!=null){}
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
注:加缓存的意义在于提高效率
注:FileOutputStream fos = new FileOutputStream("D:\\1.txt",true); //此处true意思为续写
5.其他流
(1).打印流:PrintStream,PrintWriter
PrintWriter pw = new PrintWriter(System.out,true); //true表示自动刷新
(2).对象序列化流(对象存储到设备上):ObjectOutputStream
实现对象序列化流必须实现接口:implements Serializable(给类提供版本号)
若对象中有属性不想被序列化:private transient int age;
对象反序列化:ObjectInputStream
FileOutputStream fos = new FileOutputStream("D:\\1.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(new Person("aaa",20));
oos.close();
fos.close();
(3).随机流:RandomAccessFile
seek(数字);通过操作指针完成随机写
"r":只读权限 "rw":读写权限都有
RandomAccessFile raf = new RandomAccessFile("D:\\1.txt","rw");
raf.seek(8);
raf.write("aa".getBytes());
raf.writeInt(7);
raf.close();
(4).管道流:PipedInputStream,PipedOutputStream(管道流一般用于多线程,单线程会死锁)
可用connect()连接管道输入输出流
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream();
pis.connect(pos);
new Thread(new PipedInputThread(pis)).start();
new Thread(new PipedOutputThread(pos)).start();
(5).数据流:DataInputStream DataOutputStream
(6).字节数组流:ByteArrayInputStream ByteArrayOutputStream
(7).字符数组流:CharArrayReader CharArrayWriter
(8).字符串流:StringReader StringWriter