西安建设网站公司,桂林论坛网app,石家庄网站开发与优化,网页微信登录首页目录
文件类型
File概述
属性
构造方法
常用方法
Reader
Writer
InputStream
OutputStream
字节流转字符流
通过Scanner读取InputStream
通过PrintWriter转换outputstream
示例 文件类型
从编程的角度看#xff0c;文件类型主要就是两大类
文本#xff08;文…目录
文件类型
File概述
属性
构造方法
常用方法
Reader
Writer
InputStream
OutputStream
字节流转字符流
通过Scanner读取InputStream
通过PrintWriter转换outputstream
示例 文件类型
从编程的角度看文件类型主要就是两大类
文本文件中保存的数据都是字符串保存的内容都是合法的字符二进制文件中保存的数据仅仅是二进制数据不要求保存的内容是合法的字符
File概述
属性
修饰符及类型属性说明static StringpathSeparator依赖于系统的路径分隔符String类型表示static charpathSeparator依赖于系统的路径分隔符char类型表示 D:\ 如上所示“\”就是一个路径分隔符
构造方法
签名说明FileFile parentString child根据父目录孩子文件路径创建一个新的File实例FileString pathname根据文件路径创建你一个新的File实例路径可以是绝对路径或者相对路径FileString parent,String chile根据父目录孩子我呢见路径创建一个新的File实例父目录用路径表示
常用方法
修饰符及返回类型方法签名说明StringgetParent()返回File对象的父目录文件路径StringgetName()返回File对象的纯文本名称String getPath()返回File对象的文件路径StringgetAbsolutePath()返回File对象的绝对路径StringgetCanonicalPath()返回File对象修饰过的绝对路径booleanexists()判断File对象描述的文件是否真实存在booleanisDirectory()判断File对象代表的文件是否是一个目录booleanisFile()判断File对象代表的文件是否是一个普通文件booleancreateNewFile()根据File对象自动创建一个空文件成功创建返回truebooleandelete()根据File对象,删除该文件voiddeleteOnExit()根据File对象标注文件将被删除删除动作会到JVM运行结束时才删除String[]list()返回File对象代表的目录下所有文件名File[]listFiles()返回File对象代表的目录下的所有文件以File对象表示booleanmkdir()创建File对象代表的目录booleanmkdirs()创建File对象代表的目录如果必要会创建中间目录booleanrenameTo(File dest)进行文件改名也可以视为平时的剪切、粘贴操作booleancanRead()判断用户是否对文件有可读权限booleancanWrite()判断用户是否对文件有可写权限
在标准库中提供的读写文件的流对象有很多个类可以归结为两个大的类别中
1、字节流对应着二进制文件每次读/写的最小单位都是“字节”
InputStreamOutputStream
2、字符流对应着文本文件 每次读/写的最小单位是“字符”一个字符可能对应多个字节跟当前字符集编码方式有关本质上是针对字节流进行了又一层封装
ReaderWriter
上述四种是抽象类不能直接new实例 无参数read一次读取一个字符一个参数read一次读取若干个字符会把参数指定的buf数组给填充满三个参数read一次读取若干个字符会把参数执行的cbuf数组中从off这个位置开始到len这么长的范围尽量填满
使用示例
Reader
一次read一个字符 try(Reader reader new FileReader(D:/data.txt);){ while (true) { int c reader.read(); if (c -1) { //读取完毕 break; } char ch (char) c; System.out.println(ch); } } catch (IOException e) { throw new RuntimeException(e); } read方法一次读取一个字符返回数字当返回值为-1时代表读取到文件末尾
一次read多个字符 Reader readernew FileReader(D:/data.txt); try{ while(true){ char[] chnew char[1024]; int n reader.read(ch); if(n-1) { //读取完毕 break; } System.out.println(读取长度n); System.out.println(Arrays.toString(ch)); } } catch (IOException e) { throw new RuntimeException(e); } finally { try { reader.close(); } catch (IOException e) { throw new RuntimeException(e); } } 这样写虽然能够解决中途抛异常导致reader不能正常释放但是不够优雅我们可以采取try with resources方法 ,Reader readernew FileReader(D:/data.txt)在出了作用域后会自动调用close方法 try(Reader readernew FileReader(D:/data.txt)){ while(true){ char[] chnew char[1024]; int n reader.read(ch); if(n-1) { //读取完毕 break; } System.out.println(读取长度n); System.out.println(Arrays.toString(ch)); } } catch (IOException e) { throw new RuntimeException(e); } Writer try(Writer writernew FileWriter(D:/data.txt)) { writer.write(你好你好); } catch (IOException e) { throw new RuntimeException(e); } Writer写入文件默认情况下会将原来的数据清空掉如果不想清空需要在构造函数中再传入一个参数 这样就能实现追加写 Writer writernew FileWriter(D:/data.txttrue) utf8编码一个中文字符是3个字节在Java标准库内部
如果是只使用char此时使用的字符集固定就是unicode如果是使用String此时就会自动的把每个字符的unicode转换utf8
InputStream
字节流与字符流不同的是传入的数组是byte类型的read返回值是int其实是byte0-255之间的值-1表示到达文件末尾 try(InputStream inputStreamnew FileInputStream(D:/data.txt)) { byte[] buffernew byte[1024]; int ninputStream.read(buffer); System.out.println(n n); for(int i0;in;i) { System.out.printf(%x\n,buffer[i]); } } catch (IOException e) { throw new RuntimeException(e); } OutputStream
OutputStream和Writer类似打开一个文件默认就会清空文件的原有内容 try(OutputStream outputStreamnew FileOutputStream(d:/data.txt)) { String str你好; outputStream.write(str.getBytes()); } catch (IOException e) { throw new RuntimeException(e); } 若要使用追加的方式写入可以在构造方法的第二个参数中传入true OutputStream outputStreamnew FileOutputStream(d:/data.txttrue) 字节流转字符流
当提供的是字节流对象但实际数据内容是文本数据我们可以将字节流转换成字符流
通过Scanner读取InputStream try(InputStream inputStreamnew FileInputStream(d:/data.txt)) { Scanner scannernew Scanner(inputStream); String strscanner.next(); System.out.println(str); } catch (IOException e) { throw new RuntimeException(e); } 通过PrintWriter转换outputstream try(OutputStream outputStreamnew FileOutputStream(d:/data.txt)) { PrintWriter writernew PrintWriter(outputStream); writer.println(hello); } catch (IOException e) { throw new RuntimeException(e); } PrintWriter这样的类在进行写入的时候不一定是直接写硬盘而是先把数据写入到一个内存构成的缓冲区中当我们写入缓冲区之后如果还没来得及把缓冲区的数据写入硬盘中进程就结束了此时数据就丢失了为了能够确保数据确实被写入硬盘就应该在合适的时机使用flush方法手动刷新缓冲区因此上述的代码需要修改一下 try(OutputStream outputStreamnew FileOutputStream(d:/data.txt)) { PrintWriter writernew PrintWriter(outputStream); writer.println(hello); writer.flush(); } catch (IOException e) { throw new RuntimeException(e); } 示例
扫描指定目录并找到名称中包含指定字符的所有普通文件不包括目录并且后续询问用户是否要删除该文件 public static void main(String[] args) throws FileNotFoundException {Scanner scanner new Scanner(System.in);System.out.println(请输入搜索路径);String direcory scanner.next();File sourceFile new File(direcory);if (!sourceFile.isDirectory()) {System.out.println(搜索路径有误);return;}System.out.println(请输入要删除文件的关键词);String wordscanner.next();scanDir(sourceFile,word);}public static void scanDir(File rootPath, String word){File[] files rootPath.listFiles();if(filesnull)return;for (File file : files) {System.out.println(当前扫描的文件 file.getAbsolutePath());if (file.isFile()) {checkDelete(file,word);} else {scanDir(file,word);}}}public static void checkDelete(File rootPath, String word){if(!rootPath.getName().contains(word)){//不必删除直接方法结束return ;}//需要删除Scanner scanner new Scanner(System.in);System.out.println(是否需要删除Y/N:);String choicescanner.next();if(choice.equals(Y)||choice.equals(N)){rootPath.delete();System.out.println(删除完毕);}}