1.File类
1.1 访问文件和目录
File类用于新建、删除、重命名文件或者目录,但不能够访问其内容,访问内容需要使用输入/输出流。File类用路径字符串来创建File实例,路径可以是绝对或相对路径,系统通过用户的工作路径来解释相对路径(通常为运行Java虚拟机是所在的路径)。
public class FileTest { public static void main(String[] args) throws IOException { // 以当前路径来创建一个File对象 File file = new File("."); // . System.out.println(file.getName()); // 获取相对路径的父路径,null System.out.println(file.getParent()); // E:\javaworkplace\20210509\. System.out.println(file.getAbsolutePath()); // E:\javaworkplace\20210509 System.out.println(file.getAbsoluteFile().getParent()); // 当前路径下创建一个临时文件 File tmpFile = File.createTempFile("aaa", ".txt", file); // delete when JVM exit tmpFile.deleteOnExit(); File newFile = new File(System.currentTimeMillis() + ""); // Does new File exists:false System.out.println("Does new File exists:" + newFile.exists()); newFile.createNewFile(); // Does new File exists:true System.out.println("Does new File exists:" + newFile.exists()); // newFile exists,can't use newFile to generate dictory, return false. System.out.println(newFile.mkdir()); String[] fileList = file.list(); System.out .println("==all files and dictories under contemporary path=="); for (String fileName : fileList) { System.out.println(fileName); } File[] roots = File.listRoots(); System.out.println("==all system root path=="); // C:\ // D:\ // E:\ for (File root : roots) { System.out.println(root); } } }
1.2 文件过滤器
File类的List()方法可以接受一个FilenameFilter参数,通过该参数可以对文件过滤。
public class FilenamFilterTest { public static void main(String[] args) { File file = new File("."); String[] nameList = file.list((dir, name) -> name.endsWith(".java") || new File(name).isDirectory()); //list all java file and directories under contemporary path for (String name : nameList) { System.out.println(name); } } }
2.输入流InputStream和Reader
java把输入/输出源称为流。流可分为输入流(只能从中读取数据)和输出流(只能向其写入数据)。输入、输出都是站在内存的角度来划分的,比如从程序运行所在内存写数据到磁盘,通常称为输出流。流又可分为字节流(所操作的数据单元是8位字节)、字符流(所操作的数据单元位16位字符)。流还可分为节点流和处理流,节点流和数据源直接相连,处理流将已存在的流根据数据源类型进行封装,可以采用相同的输入/输出代码访问不同的数据源。处理流还可提供缓存提高输入、输出效率,允许批量输入、输出数据。
InputStream和Reader是所有输入流的基类,它们分别有两个对应的实现类:FileInputStream,FileReader。
public class FileInputStreamTest { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("E:/wz.txt"); byte[] buff = new byte[1024]; int hasRead = 0; // while read end,read() return -1 while ((hasRead = fis.read(buff)) > 0) { System.out.print(new String(buff, 0, hasRead)); } //I/O resource is not internal memory,as a result,it can not collection by GC fis.close(); } }
IO资源需要手动进行关闭,java7对其进行了改进,可以通过try语句对其进行自动关闭。
public class FileReaderTest { public static void main(String[] args) throws IOException { try (FileReader fr = new FileReader("E:/wz.txt")) { char[] buff = new char[1024]; int hasRead = 0; while ((hasRead = fr.read(buff)) > 0) { System.out.println(new String(buff, 0, hasRead)); } } catch (IOException ex) { ex.printStackTrace(); } } }
3.输出流OutputStream和Writer
OutputStream和Writer也很类似,其中Writer是以字节作为数据传输单位,允许使用String作为参数。
```java
public class FileOutputTest {
public static void main(String[] args) {
try (FileInputStream in = new FileInputStream(
“src/inputandoutput/FileOutputTest.java”);
FileOutputStream out = new FileOutputStream(“newFile.txt”)) {
byte[] buff = new byte[1024];
int hasRead = 0;
while ((hasRead = in.read(buff)) > 0) {
out.write(buff, 0, hasRead);
}
} catch (IOException e) { e.printStackTrace(); } } }
如果想要直接输出字符串的内容,使用Writer会有更好的效果。 java
public class FileWriterTest {
public static void main(String[] args) {
try (FileWriter fw = new FileWriter(“fw.txt”)) {
fw.write(“我是鸭鸭\r\n”);
fw.write(“I can fly!”);
} catch (IOException e) { e.printStackTrace(); } } }
```
4.处理流
只使用节点流操作数据比较繁琐,可以借助处理流解决这一问题。处理流只关心输入,输出功能,节点流与底层的IO设备,文件进行交互。识别节点流、处理流很简单,只要构造器参数是一个直接的物理IO节点,它就是节点流,如果构造器参数是一个已经存在的流,那么它就是处理流。
public class PrintStreamTest { public static void main(String[] args) { try (FileOutputStream out = new FileOutputStream("test.txt"); PrintStream ps = new PrintStream(out)) { ps.println("normal string"); ps.println(new PrintStreamTest()); } catch (IOException e) { e.printStackTrace(); } } }
上面用处理流PrintStream打印了一个PrintStreamTest()对象,PrintStream的功能很强大,我们常用的System.out的类型就是PrintStream.在使用了处理流后,关闭输入,输出资源只需关闭最上层的处理流,被该处理流包装的节点流会被系统自动关闭。
5.IO流体系举例:StringReader、StringWriter
由于计算机中的数据都是二进制的,通常来说字节流比字符流功能更加强大,但对于文本文件使用字节流还需考虑怎么用合适的方式把字节转换为字符。因此对于文本文件一般采用字符流,对于二进制内容输入输出通常采用字节流。Java中有各种输入/输出流,下面程序演示了一种把字符串作为物理节点的输入/输出流的用法。
public class StringNodeTest { public static void main(String[] args) { String src = "从明天起,做一个幸福的人\n" + "喂马、劈柴、周游世界\n" + "我有一所房子,面朝大海,春暖花开\n" + "告诉它们我的幸福"; char[] buffer = new char[32]; int hasRead = 0; try (StringReader sr = new StringReader(src)) { while ((hasRead = sr.read(buffer)) > 0) { System.out.println(new String(buffer, 0, hasRead)); } } catch (IOException e) { e.printStackTrace(); } try (StringWriter sw = new StringWriter()) { sw.write("有一个姑娘"); sw.write("它有一些任性"); System.out.println(sw.toString()); } catch (IOException e) { e.printStackTrace(); } } }
这篇文章就介绍到这里了。