File对象

  1. // 路径
  2. /*
  3. getPath() 返回构造方法传入的路径
  4. getAbsolutePath() 返回绝对路径
  5. */
  6. // 构造一个file对象,即使传入的文件或者目录不存在,代码也不会报错,因为构造对象并不会导致任何磁盘操作
  7. // java中文件用\\代替\连接文件路径
  8. // 文件
  9. /*
  10. isFile() 判断该File对象是否是一个已存在的文件
  11. isDirectory() 判断该File对象是否是一个已存在的目录
  12. canRead() 是否可读
  13. canWrite() 是否可写
  14. canExection() 是否可执行
  15. length() 文件字节大小
  16. */
  17. // createNewFile() 创建一个新文件
  18. // delete() 删除该文件
  19. // 有的时候我们需要创建临时文件
  20. // createTempFile() 创建临时文件
  21. // deleteOnExit() 在JVM退出时自动删除该文件
  22. // 遍历文件和目录;如果File对象是一个目录时
  23. File f = new File("C:\\Windows");
  24. // File[] fs1 = f.list(); // 列出所有文件
  25. File[] fs1 = f.listFiles(); // 列出所有文件和子目录
  26. // 遍历文件夹下的所有文件
  27. import java.io.File;
  28. import java.util.ArrayList;
  29. import java.util.List;
  30. public class IoStudy {
  31. public static void showDirectory(File file){
  32. File[] files = file.listFiles();
  33. for(File a:files){
  34. System.out.println(a.getAbsolutePath());
  35. if(a.isDirectory()){
  36. showDirectory(a);
  37. }
  38. }
  39. }
  40. public static void main(String[] args) {
  41. File file = new File("F:\\Documents");
  42. showDirectory(file);
  43. }
  44. }
  45. /*
  46. mkdir():创建当前File对象表示的目录;
  47. mkdirs():创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来;
  48. delete():删除当前File对象表示的目录,当前目录必须为空才能删除成功
  49. exists():判断目录是否存在
  50. */

InputStream(输入流)

  1. // InputStream并不是一个接口,而是一个抽象类,它是所有输入流的超类,这个抽象类定义的一个最重要的方法就是int read()
  2. public abstract int read() throws IOException;
  3. // 这个方法会读取输入流的下一个字节,并返回int值(0~255),如果已读到末尾,则返回-1就是不能继续读取了
  4. // InputStream和OutputStream都是通过close()方法来关闭流。关闭流就会释放对应的底层资源。
  5. //可能因为Io操作错误导致资源没法即使释放,我们需要用try...finally来确保是否发生Io错误都能够正常关闭
  6. // try(resource)主需要编写try语句,让编译器自动为我们关闭资源。
  7. // InputStream实现类
  8. import java.io.ByteArrayInputStream;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11. public class IoStudy {
  12. public static void main(String[] args) throws IOException {
  13. byte[] data = { 72, 101, 108, 108, 111, 33 };
  14. try (InputStream input = new ByteArrayInputStream(data)) {
  15. int n;
  16. while ((n = input.read()) != -1) {
  17. System.out.println((char)n);
  18. }
  19. }
  20. }
  21. }

OnputStream(输出流)

  1. // 和InputStream类似,OutputStream也是抽象类,它是所有输出流的超类。这个抽象类定义的一个最重要的方法就是void write(int b)
  2. public abstract void write(int b) throws IOException;
  3. // OutputStream还提供了一个flush()方法,它的目的是将缓冲区的内容真正输出到目的地
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7. public class IoStudy{
  8. public static void main(String[] args) throws IOException{
  9. try (OutputStream output = new FileOutputStream("F://readme.txt")) {
  10. output.write("Hello".getBytes("UTF-8")); // Hello
  11. } // 编译器在此自动为我们写入finally并调用close()
  12. }
  13. }
  14. // OnputStream实现类
  15. import java.io.ByteArrayOutputStream;
  16. import java.io.IOException;
  17. public class IoStudy {
  18. public static void main(String[] args) throws IOException {
  19. byte[] data;
  20. try (ByteArrayOutputStream output = new ByteArrayOutputStream()) {
  21. output.write("Hello ".getBytes("UTF-8"));
  22. output.write("world!".getBytes("UTF-8"));
  23. data = output.toByteArray();
  24. }
  25. System.out.println(new String(data, "UTF-8"));
  26. }
  27. }
  28. // 读取input.txt,写入output.txt:
  29. try (InputStream input = new FileInputStream("input.txt");
  30. OutputStream output = new FileOutputStream("output.txt"))
  31. {
  32. input.transferTo(output); // transferTo的作用是?
  33. /*
  34. 此方法允许从对象调用方法表示的输入流中轻松传输(复制)字节到提供给该方法的输出流
  35. 此方法不关闭任何流
  36. 强烈建议,如果发生I/O错误,那么输入输出两个流都应该立即关闭。
  37. */
  38. }

Reader

  1. // Reader是Java的IO库提供的另一个输入流接口。下列是Reader与InputStream的区别
  2. InputStream Reader
  3. 字节流,以byte为单位 字符流,以char为单位
  4. 读取字节(-10~255): 读取字符(-10~65535):
  5. int read() int read()
  6. 读到字节数组:int read(byte[] b) 读到字符数组:int read(char[] c)
  7. public class IoStudy{
  8. public static void main(String[] args) throws IOException {
  9. try (Reader reader = new FileReader("f://readme.txt", StandardCharsets.UTF_8)) {
  10. // 缓冲区
  11. char[] buffer = new char[1000];
  12. int n;
  13. while ((n = reader.read(buffer)) != -1) {
  14. System.out.println("read " + n + " chars.");
  15. }
  16. }
  17. }
  18. }
  19. // CharArrayReader 它的作用实际上是一个char[]数组变成一个Reader
  20. try (Reader reader = new CharArrayReader("Hello".toCharArray())) {}
  21. // StringReader可以直接把String作为数据源
  22. try (Reader reader = new StringReader("Hello")) {}

Writer

  1. WriterOutputStream的区别如下:
  2. OutputStream Writer
  3. 字节流,以byte为单位 字符流,以char为单位
  4. 写入字节(0~255): 写入字符(0~65535):
  5. void write(int b) void write(int c)
  6. 写入字节数组:void write(byte[] b) 写入字符数组:void write(char[] c)
  7. 无对应方法 写入Stringvoid write(String s)
  8. // FileWriter
  9. try (Writer writer = new FileWriter("readme.txt", StandardCharsets.UTF_8)) {
  10. writer.write('H'); // 写入单个字符
  11. writer.write("Hello".toCharArray()); // 写入char[]
  12. writer.write("Hello"); // 写入String
  13. }
  14. // CharArrayWriter
  15. try (CharArrayWriter writer = new CharArrayWriter()) {
  16. writer.write(65);
  17. writer.write(66);
  18. writer.write(67);
  19. char[] data = writer.toCharArray(); // { 'A', 'B', 'C' }
  20. }
  21. // StringWriter
  22. try (Writer writer = new OutputStreamWriter(new FileOutputStream("readme.txt"), "UTF-8")) {
  23. // TODO:
  24. }
  25. // PrintWriter
  26. // PrintStream和OutputStream相比,除了添加了一组print()/println()方法,可以打印各种数据类型,而且不会抛出IOException
  27. public class IoStudy {
  28. public static void main(String[] args) {
  29. StringWriter buffer = new StringWriter();
  30. try (PrintWriter pw = new PrintWriter(buffer)) {
  31. pw.println("Hello");
  32. pw.println(12345);
  33. pw.println(true);
  34. }
  35. System.out.println(buffer.toString());
  36. }
  37. }

使用Files

  1. public class IoStudy{
  2. public static void main(String[] args) throws IOException {
  3. // 读文件
  4. // 把全部内容读取为一个byte[]
  5. //byte[] data = Files.readAllBytes(Paths.get("f://readme.txt"));
  6. // 默认使用UTF-8编码读取:
  7. //String content1 = Files.readString(Paths.get("f:/readme.txt"));
  8. // 可指定编码:
  9. //String content2 = Files.readString(Paths.get("f:/readme.txt"), StandardCharsets.ISO_8859_1);
  10. // 按行读取并返回每行内容
  11. //List<String> lines = Files.readAllLines(Paths.get("f://readme.txt"));
  12. // 写文件
  13. // java7开始提供的写法
  14. // 写入文本并指定编码 覆盖原本内容
  15. //Files.write(Paths.get("f://readme.txt"), "无敌最俊朗".getBytes(StandardCharsets.UTF_8));
  16. // 可以追加写
  17. //Files.write(Paths.get("f://readme.txt"),"无敌最俊朗666".getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND);
  18. // java8开始提供的写法
  19. String fileName = "F:\\readme.txt";
  20. Path path = Paths.get(fileName);
  21. // 使用newBufferedWriter创建文件并写文件
  22. // 这里使用了try-with-resources方法来关闭流,不用手动关闭
  23. try (BufferedWriter writer =
  24. Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
  25. writer.write("无敌最俊朗!");
  26. }
  27. //追加写模式
  28. try (BufferedWriter writer =
  29. Files.newBufferedWriter(path,
  30. StandardCharsets.UTF_8,
  31. StandardOpenOption.APPEND)){
  32. writer.write("每天进步亿点点!");
  33. }
  34. }
  35. }