## IO流 数据持久化 程序(缓存)===》硬盘中 OutputStream Writer 写出 程序中操作数据 硬盘中===》程序中 InputStream Reader 读入 ### File文件类 java提供了一套专门操作本机文件、文件夹的API #### 构造方法 new File(String path) new File(File file) new File(String parentPath,String childPath) new File(File parentFile,String childPath) 注意:参数位路径信息 可以是错误的 父级路径 保证正确 #### 常用方法 boolean mkdir() 创建一个文件夹(保证父级路径正确 否则返回false) boolean mkdirs() 创建一串文件夹 从不正确的地方开始创建文件夹 boolean createNewFile() 创建一个文件(1.抛一个编译期异常2.保证父级路径正确3.注意重名忽略大小写) boolean delete() 删除最后一个文件\\文件夹 boolean isFile() 判断路径是否指向的是一个文件对象 boolean isDirectory() 判断路径是否指向的是一个文件夹 boolean exists() 判断路径是否是真实路径 long length() 获取某个文件的字节数目 void renameTo(File newFile) 将文件名称修改 String toString() 返回完整路径 String getPath() 返回完整路径 String getParent() 返回父级路径 File getParentFile() String getName() 返回文件名称 String\[\] list() 返回该路径下所有文件\\文件夹的名字构成的数组 File\[\] listFiles() 返回该路径下所有文件\\文件夹的对象构成的数组 #### 案例 判断某个路径下有多少java文件 \`\`\`java File file = new File("xxxx\\\\xx\\\\xx"); File\[\] fs = file.listFiles(); int num = 0;//java文件数量 int num1 = 0;//文件数量 int num2 = 0;//文件夹数量 for(File f : fs){ if(f.isFile()){ //排除掉文件夹 num1++; String name = f.getName();//获取当前文件的文件名称 if(name.endsWith(".java")){ //判断后缀名是否是.java num++; } }else{ num2++; } } syso("总共有"+num+"个java文件"); syso("总共有"+num1+"个文件"); syso("总共有"+num2+"个文件夹"); \`\`\` #### 练习 1.使用String集合 循环输入保存五个不重复的虚拟路径 (每获得一个则创建成为真实路径) 如果路径重复 给出提示 并且重新输入 完成后 以流形式输出.txt文件的路径 2.提前在一个路径下 存放多个文件和文件夹 代码判断输出该路径下有多少个文件 多少个文件夹 多少个java文件 ### 读入写出流 【读入】流 【写出】流 字节 InputStream OutputStream 字符 Reader Writer #### 字节写出流 FileOutputStream new FileOutputStream(File file) 参数表示写出的目的地 (父级路径必须正确 最后一个文件可以是假的) new FileOutputStream(File file,boolean bool) 第二个参数默认为false 覆盖原文件内容 true为追加 'a' ASCII 97 "a".getBytes() \[97\] "a".hashCode() 97 '中' ASCII 20013 "中".getBytes() \[-42,-48\] "中".hashCode() 20013 "中国".hashCode() //642672 write(int b) 写出参数int值作为字节对应的字符 write(byte\[\] bs) 写出字节数组 会自动拼接为字符串 注意记事本的字符编码集 write(byte\[\] bs,int startIndex , int len) 将字节数组中的某部分 拼接 注意不能截取汉字全角符号的一半 flush() 刷新 close() 关闭对象 也带刷新功能 \`\`\`\`java File toFile = new File("...."); FileOutputStream fos = new FileOutputStream(toFile); String str = "中国你好"; byte\[\] bs = str.getBytes(); //\[-42, -48, -71, -6, -60, -29, 44, -70, -61\] fos.write(bs); fos.write(bs,4,5); //写出 你,好 fos.write("97".getBytes()); //97 fos.write("\\n".getBytes());//写出换行 10 13 \`\`\`\` #### 字节读入流 FileInputStream new FileInputStream(File file) 参数表示读入的文件来源 必须是真实存在的文件对象 'a' (int)'a' ==\>97 "a".getBytes() \[97\] "a".hashCode(); 97 "中" 只能读到中的两个字节的第一个字节 int read() 每次读一个字节 返回int类型的字节值 没有读到 返回-1 int read(byte\[\] bs) 每次读入最多参数数组长度的字节 并存入整个数组 返回本次实际读入了几个字节 参数数组称为 缓冲区 void close() \`\`\`java abcd //建议用于读入单字节文本 图片 视频 音频等非文本数据 必须使用字节流 File fromFile = new File("..."); //该路径必须真实 FileInputStream fis = new FileInputStream(fromFile); //int b = fis.read(); //读入一个字节 97 //syso((char)b); //a for(int i = 0;i
评论