JAVA输入/输出(一)-----File类和节点流(字节流、字符流)
一、File类
1、访问文件和目录
package com; import java.io.File; import java.io.IOException; public class File1 { public static void main(String[] args) throws IOException { //以当前路径来创建一个File对象 File file = new File("."); //返回File对象的文件名 System.out.println(file.getName()); //获取File对象对应目录的父目录名 System.out.println(file.getParent()); //获取绝对路径(返回File对象) System.out.println(file.getAbsoluteFile()); //获取绝对路径(返回字符串) System.out.println(file.getAbsolutePath()); //获取上一级路径 System.out.println(file.getAbsoluteFile().getParent()); //在file路径下创建一个临时文件 File tmpFile = File.createTempFile("aaa", ".txt",file); //当JVM退出时删除该文件 tmpFile.deleteOnExit(); //以系统当前时间为新文件名来创建新文件 File newFile = new File(System.currentTimeMillis() + ""); System.out.println("newFile对象是否存在: " + newFile.exists()); //以指定newFile对象来创建一个文件 newFile.createNewFile(); //以newFile对象来创建一个目录,因为已存在newFile,返回false。 newFile.mkdir(); String[] fileList = file.list(); System.out.println("=====当前路径下所有文件和路径如下====="); for(String fileName : fileList) { System.out.println(fileName); } File[] roots = File.listRoots(); System.out.println("=====系统所有根路径如下====="); for(File root : roots) { System.out.println(root); } } }
2、文件过滤器
在File的list()中可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件。
FilenameFilter接口里包含了一个accept(File dir, String name)方法,是一个函数式接口。
import java.io.File; public class FilenameFilterTest { public static void main(String[] args) { File file = new File("."); //如果文件以.java结尾或文件对应一个目录,返回true String[] nameList = file.list((dir,name) -> name.endsWith(".java") || new File(name).isDirectory()); for(String name : nameList) { System.out.println(name); } } }
二、字节流和字符流
1、InputStream和Reader
int read():读取单个字节/字符
int read(byte[] b) int read(char[] b):读取最多b.length个字节/字符数据,存储在字节/字符数组b中
int read(byte[] b, int off, int len) int read(char[] b, int off, int len):从off位置开始,读取最多len个字节/字符数据,存储在字节/字符数组b中
import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamTest { public static void main(String[] args) throws IOException { //创建字节输入流 FileInputStream fis = new FileInputStream("aaa.java"); byte[] bbuf = new byte[1024]; int hasRead = 0; while((hasRead = fis.read(bbuf)) > 0) { //将bbuf字节数组从0开始的hasRead长度,转为字符串 System.out.println(new String(bbuf, 0 , hasRead)); } fis.close(); } }
Java7改写了所有IO资源类,它们都实现了AutoCloseable接口,因此都可通过自动关闭资源的try语句来关闭这些IO流。
import java.io.FileReader; import java.io.IOException; public class FileInputStreamTest { public static void main(String[] args) throws IOException { try(FileReader fr = new FileReader("aaa.java")){ char[] cbuf = new char[32]; int hasRead = 0; while((hasRead = fr.read(cbuf)) > 0) { //将cbuf字符数组从0开始的hasRead长度,转为字符串 System.out.println(new String(cbuf, 0 , hasRead)); } }catch(IOException ex){ ex.printStackTrace(); } } }
2、OutputStream和Writer
void write(int c):将指定的字节/字符输出到输出流中,c可代表字节或者字符。
void write(byte[]/char[] b) :将字节/字符数组中的数据输出到指定输出流中。
void write(byte[]/char[] buf, int off, int len):将字节/字符数组从off位置开始,长度为len的字节/字符输出到输出流中。
因为字符流直接以字符为操作单位,所以Writer可以用字符串来代替字符数组
void write(String str) :将str字符串里包含的字符输出到指定输出流中。
void write(String str, int off, int len):将str字符串从off位置开始,长度为len的字符输出到输出流中。
实现复制文件的功能:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamTest { public static void main(String[] args) { try(FileInputStream fis = new FileInputStream("aaa.java"); FileOutputStream fos = new FileOutputStream("aaa2.java")) { byte[] bbuf = new byte[32]; int hasRead = 0; while((hasRead = fis.read(bbuf)) > 0) { fos.write(bbuf, 0, hasRead); } }catch(IOException ex){ ex.printStackTrace(); } } }
直接输出字符串内容:
import java.io.FileWriter; import java.io.IOException; public class FileWriterTest { public static void main(String[] args) { try(FileWriter fw = new FileWriter("aaa3.java")) { fw.write("11111111111111\r\n"); fw.write("2222222222\r\n"); }catch(IOException ex){ ex.printStackTrace(); } } }
浙公网安备 33010602011771号