File类
我们可以把计算机中所有的文件,文件夹封装成一个File对象
public class File implements Serializable, Comparable<File> { //有参构造方法,参数为该文件的路径 public File(String pathname) { if (pathname == null) { throw new NullPointerException(); } this.path = fs.normalize(pathname); this.prefixLength = fs.prefixLength(this.path); } //是否存在 public boolean exists(){} //是否是文件 public boolean isFile() {} //是否是文件夹 public boolean isDirectory() {} //创建该文件夹 public boolean mkdir() {} //创建该文件 public boolean createNewFile() throws IOException {} public File[] listFiles() {} public String getName() {} public boolean delete() {} public boolean renameTo(File dest) {} }
流
我们可以通过流,来写入或者读取文件中信息。
分类
按照方向
无论输入,输出相对的都是程序
输入流
(1,0)流入到程序中,读取文件
输出流
流从程序中流出,相当于写入文件
按照单位
字节流
一次读取一个字节,字节流 byte
字符流
一次读取一个字符,字符流
字节输入流
InputStream 字节输入流使用来读取文件,一次读取一个字节
//一次读取一个字节 public abstract int read() throws IOException; //一次读取一个字节,然后放入到数组中 public int read(byte b[]) throws IOException { return read(b, 0, b.length); }
package com.qfedu; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class Demo03 { public static void main(String[] args) throws IOException { /* * 字节输入流 读取文件 一次读取一个字节 */ //待读取的文件 File file = new File("D:\\java2203\\first.txt"); //创建该文件的字节输入流 InputStream is = new FileInputStream(file); /* //读取文件 一次读取一个字节 abcdefg int b1 = is.read(); // a 97 int b2 = is.read(); // b 98 int b3 = is.read(); // c 99 int b4 = is.read(); // d 100 int b5 = is.read(); // e 101 int b6 = is.read(); // f 102 int b7 = is.read(); // g 103 int b8 = is.read(); //-1 System.out.print((char)b1); System.out.print((char)b2); System.out.print((char)b3); System.out.print((char)b4); System.out.print((char)b5); */ int b; while((b = is.read()) != -1) { System.out.print((char)b); } is.close(); } }
package com.qfedu; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class Demo03_2 { public static void main(String[] args) throws IOException { /* * 把读取到的字节放入一个数组中 */ File file = new File("D:\\java2203\\first.txt"); InputStream is = new FileInputStream(file); byte[] bs = new byte[3]; //abcdefg a b c, d e f, g 0 0 /* int n1 = is.read(bs); System.out.println(Arrays.toString(bs)+ n1); System.out.println(new String(bs, 0, 3)); int n2 = is.read(bs); System.out.println(Arrays.toString(bs)+n2); System.out.println(new String(bs, 0, 3)); int n3 = is.read(bs); System.out.println(Arrays.toString(bs)+n3); System.out.println(new String(bs, 0, 1)); int n4 = is.read(bs); System.out.println(n4); */ int n; //读取的字节数 while((n = is.read(bs)) != -1) { System.out.print(new String(bs, 0, n)); } } }
字节输出流
OutputStream 字节输出流使用来写入文件,一次写入一个字节
//一次写入一个字节 public abstract void write(int b) throws IOException; //一次写入一个字节数组 public void write(byte b[]) throws IOException {} //一次写入一个字节数组指定位置的字节 public void write(byte b[], int off, int len) throws IOException {}
package com.qfedu; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Demo04 { public static void main(String[] args) throws IOException { //待写入的文件 File file = new File("D:\\java2203\\your.txt"); /* * 创建该文件对象的输出流 * 如果定义添加参数true,则为追加 * 没有参数true,则为替换 * */ OutputStream os = new FileOutputStream(file, true); //每次写入一个字节 os.write(97); //a os.write(98); //b os.write('c'); byte[] bs = {100,101,102,103}; os.write(bs); byte[] bs2 = new byte[10]; bs2[0] = 104; bs2[1] = 105; os.write(bs2, 0, 2); os.close(); } }
复制文件
复制文件思路:
把使用字节输入流读取到的字节,写入到指定文件中,边读取边写入,达到一个复制的效果。
package com.qfedu; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class Demo05_copy { /* * 使用字节输入,输出,完成复制功能 */ public static void main(String[] args) throws IOException { //定义待复制的文件 File file = new File("D:\\java2203\\apache-maven-3.3.9-bin.zip"); //定义复制到的目标文件 File targetFile = new File("D:\\java2203\\apache-maven-bin.zip"); targetFile.createNewFile(); //读取待复制文件 获取他的输入流 InputStream is = new FileInputStream(file); //写入到目标文件 获取他的输出流 OutputStream os = new FileOutputStream(targetFile); int b; byte[] bs = new byte[1024]; while((b = is.read(bs)) != -1) { os.write(bs, 0, b); } //关闭资源 is.close(); os.close(); } }
缓冲字节输入流
内部做了优化,减少了和磁盘的交互,提高了字节读取的效率
方法的使用和字节输入流一模一样
package com.qfedu; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class Demo06 { /* * 缓冲字节输入流 */ public static void main(String[] args) throws IOException { //字节输入流 InputStream is = new FileInputStream("D:\\java2203\\first.txt"); //字节输入流,才能创建缓冲字节输入流 BufferedInputStream bis = new BufferedInputStream(is); int b; byte[] bs = new byte[4]; while((b = bis.read(bs)) != -1) { System.out.print(new String(bs, 0, b)); } is.close(); bis.close(); } }
缓冲字节输出流
内部做了优化,减少了和磁盘的交互,提高了字节读取的效率
方法的使用和字节输出流一模一样
注意:在最后flush()一下,确保缓存中的数据都写入到磁盘中
package com.qfedu; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Demo07 { public static void main(String[] args) throws IOException { //待写入的文件 File file = new File("D:\\java2203\\your.txt"); //字符输出流 OutputStream os = new FileOutputStream(file, true); //通过字符输出流 获取缓冲字节输出流 BufferedOutputStream bos = new BufferedOutputStream(os); String str = "hello world"; byte[] bytes = str.getBytes(); bos.write(bytes); bos.flush(); // 抖一抖,把缓冲数据全部写入磁盘中 os.close(); } }
字符输入流
字符输入流读取数据,每次读取一个字符
package com.qfedu; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class Demo08 { /* * 字符输入流 : 读取文件,一次读取一个字符 */ public static void main(String[] args) throws IOException { File file = new File("D:\\java2203\\his.txt"); //获取该文件的字符输入流 Reader reader = new FileReader(file); //你自横刀向天笑,去留肝胆两昆仑。 int c; while((c = reader.read()) != -1) { System.out.print((char)c); } reader.close(); } }
package com.qfedu; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class Demo08_2 { /* * 字符输入流 : 读取文件,一次读取一个字符 */ public static void main(String[] args) throws IOException { File file = new File("D:\\java2203\\his.txt"); //获取该文件的字符输入流 Reader reader = new FileReader(file); //你自横刀向天笑,去留肝胆两昆仑。 int n; char[] cs = new char[3]; while((n = reader.read(cs)) != -1) { System.out.print(new String(cs, 0, n)); } reader.close(); } }
字符输出流
字符输出流写入数据,每次写入一个字符
package com.qfedu; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class Demo09 { /* * 字符输出流,写入到这个文件, 每次写入一个字符 */ public static void main(String[] args) throws IOException { File file = new File("D:\\java2203\\her.txt"); //获取该文件的字符输出流,写入到这个文件中 Writer writer = new FileWriter(file); writer.write(97); //写入一个字符 char[] arr = {98,99}; writer.write(arr); //写入一个字符数组 writer.write("defg"); // 直接写入字符串 writer.close(); } }
缓冲字符输入流
用法和缓冲字符输入流是一样的
多了一个读取一行数据的方法
package com.qfedu; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class Demo10 { /* * 字符输入流 : 读取文件,一次读取一个字符 */ public static void main(String[] args) throws IOException { File file = new File("D:\\java2203\\his.txt"); //获取该文件的字符输入流 Reader reader = new FileReader(file); //缓冲字符输入流 BufferedReader br = new BufferedReader(reader); //你自横刀向天笑,去留肝胆两昆仑。 int c; while((c = br.read()) != -1) { System.out.print((char)c); } reader.close(); br.close(); } }
package com.qfedu; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class Demo11 { /* * 字符输入流 : 读取文件,一次读取一个字符 */ public static void main(String[] args) throws IOException { File file = new File("D:\\java2203\\his.txt"); //获取该文件的字符输入流 Reader reader = new FileReader(file); /* * 缓冲字符输入流 * * 可以一次读取一行 */ BufferedReader br = new BufferedReader(reader); //你自横刀向天笑,去留肝胆两昆仑。 String str; while ((str=br.readLine()) != null) { System.out.println(str); } reader.close(); br.close(); } }
缓冲字符输出流
缓冲字符输出流和字符输出流的用法是一样的
多了一个nextLine()方法,换行方法
package com.qfedu; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class Demo12 { /* * 字符输出流,写入到这个文件, 每次写入一个字符 */ public static void main(String[] args) throws IOException { File file = new File("D:\\java2203\\her.txt"); //获取该文件的字符输出流,写入到这个文件中 Writer writer = new FileWriter(file); //获取该文件的字符输出缓冲流 BufferedWriter bw = new BufferedWriter(writer); bw.write(97); //写入一个字符 char[] arr = {98,99}; bw.write(arr); //写入一个字符数组 bw.newLine(); //换行 bw.write("呵呵哒"); // 直接写入字符串 bw.flush(); writer.close(); bw.close(); } }