File:它是文件和目录路径的抽象表示
import javax.imageio.stream.FileCacheImageOutputStream; import java.io.File; public class Main { public static void main(String[] args) { //将给定路径的名字字符串转换为抽象路径名来创建新的File实例 File f1 = new File("C:\\WayToSuccess\\ItCast\\java.txt"); System.out.println(f1); //C:\WayToSuccess\ItCast\java.txt 证明是抽象路径的表示形式,且重写了toString()方法 //从父路径名字字符串和子路径名字字符串创建新的File实例 File f2 = new File("C:\\WayToSuccess\\ItCast","java.txt"); System.out.println(f2); //C:\WayToSuccess\ItCast\java.txt //从父路径和子路径名字符串创建新的File实例 File f3 = new File("C:\\WayToSuccess\\ItCast"); File f4 = new File(f3,"java.txt"); System.out.println(f4); //C:\WayToSuccess\ItCast\java.txt } }
import java.io.File; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { //在C:\WayToSuccess\ItCast目录下创建一个文件:java.txt File f1 = new File("C:\\WayToSuccess\\ItCast\\java.txt"); System.out.println(f1.createNewFile()); //true //在C:\WayToSuccess\ItCast目录下创建一个目录JavaSE File f2 = new File("C:\\WayToSuccess\\ItCast\\JavaSE"); System.out.println(f2.mkdir()); //true //在C:\WayToSuccess\ItCast目录下创建一个多级目录JavaWEB\\HTML File f3 = new File("C:\\WayToSuccess\\ItCast\\JavaWEB\\HTML"); System.out.println(f3.mkdirs()); //true } }
创建结果如下:
绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:C:\WayToSuccess\ItCast
相对路径:必须使用取自其他路径名的信息进行解释。例如:WayToSuccess\ItCast
import java.io.File; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { //当前模块目录下创建java.txt文件 File f1 = new File("FileIO\\java.txt"); System.out.println(f1.createNewFile()); //删除模块目录下java.txt文件 System.out.println(f1.delete()); //当前模块目录下创建ItCast目录 File f2 = new File("FileIO\\ItCast"); System.out.println(f2.mkdir()); //删除模块目录下ItCast目录 System.out.println(f2.delete()); //当前模块目录下创建ItCast目录,然后在该目录下创建一个文件java.txt File f3 = new File("FileIO\\ItCast"); System.out.println(f3.mkdir()); File f4 = new File("FileIO\\ItCast\\java.txt"); System.out.println(f4.createNewFile()); //删除当前模块下的目录ItCast,必须一级一级删除 System.out.println(f4.delete()); System.out.println(f3.delete()); } }
public class Main { public static void main(String[] args) throws IOException { File f1 = new File("FileIO\\java.txt"); System.out.println(f1.isDirectory()); //判断是否是目录 false System.out.println(f1.isFile()); //判断是否是文件 true System.out.println(f1.exists()); //判断存在 true System.out.println(f1.getAbsolutePath()); //获取绝对路径 C:\WayToSuccess\File\FileIO\java.txt System.out.println(f1.getPath()); //获取相对路径 FileIO\java.txt System.out.println(f1.getName()); //获取文件名 java.txt File f2 = new File("C:\\WayToSuccess\\ItCast"); //返回目录中所有的文件和目录 String[] strArray = f2.list(); for (String str : strArray){ System.out.println(str); //java.txt JavaSE JavaWEB } File[] fileArray = f2.listFiles(); for (File file : fileArray){ /* C:\WayToSuccess\ItCast\java.txt C:\WayToSuccess\ItCast\JavaSE C:\WayToSuccess\ItCast\JavaWEB */ System.out.println(file); //绝对路径 重写了toString方法 System.out.println(file.getName()); //相对路径 java.txt JavaSE JavaWEB } } }
我的文件列表:
IO 流概述:
IO 流分类:
① 按照数据的流向
② 按照数据类型来分
这两种流在什么情况下使用:
用Windows自带的记事本软件打开,读得懂就用字符流,读不懂就用字节流。
字节流抽象基类
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; public class Main { public static void main(String[] args) throws IOException { //创建字节输入流对象 FileOutputStream fos = new FileOutputStream("FileIO\\java.txt"); //一次写一个字节的数据,写入的是 a(a的ASCII码为97) fos.write(97); //a fos.write(98); //b fos.write(99); //c //写入字节数组 byte[] bytes1 = {100,101,102}; //def fos.write(bytes1); //getBytes():返回字符串对应的字节数组 byte[] bytes2 = "qwert".getBytes(); fos.write(bytes2); //qwert //bytes3字节数组,从下标1开始,写3个字节 byte[] bytes3 = "asdfg".getBytes(); fos.write(bytes3,1,3); //sdf //IO流必须关闭!释放与此流相关的任何系统资源 fos.close(); } }
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; public class Main { public static void main(String[] args) throws IOException { //创建字节输出流对象,有追加写入 FileOutputStream fos = new FileOutputStream("FileIO\\java.txt",true); //写数据 for (int i = 0; i < 10; i++) { fos.write("hello".getBytes()); fos.write("\n".getBytes()); } //追加写入,true表示允许追加写入到末尾,一刷新就会多写一遍在末尾 FileOutputStream fos2 = new FileOutputStream("FileIO\\java.txt",true); for (int i = 0; i < 10; i++) { fos2.write("world".getBytes()); fos2.write("\n".getBytes()); } //释放资源 fos.close(); fos2.close(); } }
把文件中的数据读取在控制台输出。
注意字符类型的转换!
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { //创建字节输入流对象 FileInputStream fis = new FileInputStream("FileIO\\java.txt"); //调用字节输入流的读取方法 int by; while ( (by=fis.read()) != -1){ System.out.print((char) by); //不强制类型转换的话,会输出97 98 99 100 101 } //释放资源 fis.close(); } }
输出结果:
abcde
文本文件内容:
思路:把文件中的内容读出来(数据源),再写入新文件(目的地)。
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { //创建文件输入流对象 FileInputStream fis = new FileInputStream("FileIO\\java.txt"); //c创建文件输出流对象 FileOutputStream fos = new FileOutputStream("FileIO\\Output.txt"); //读写数据(一次只读一个,一次只写一个 int by; while ((by = fis.read()) != -1){ fos.write(by); } //释放资源 fis.close(); fos.close(); } }
java.txt(源文件):
Output.txt(目标文件):
字节缓冲流:
为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
写数据:
import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { //创建文件输出流对象 FileOutputStream fos = new FileOutputStream("FileIO\\bos.txt"); //创建字节缓冲输出流对象 BufferedOutputStream bos = new BufferedOutputStream(fos); //写数据 bos.write("Hello\n\r".getBytes()); bos.write("World\n\r".getBytes()); //释放资源 bos.close(); } }
读数据(一次只读一个字节、一次读一个字符型数组两种方式):
import java.io.*; public class Main { public static void main(String[] args) throws IOException { //创建文件输入流对象(合并) BufferedInputStream bis = new BufferedInputStream(new FileInputStream("FileIO\\bos.txt")); //一次读一个字节 int by; while ( (by=bis.read()) != -1 ){ System.out.print((char) by); } //一次读一个数组 byte[] bytes = new byte[1024]; int len; while ((len=bis.read(bytes)) != -1){ System.out.print(new String(bytes,0,len)); } //释放资源 bis.close(); } }
汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数,所以底层操作能识别中文汉字!
按照某种规则,将字符存储到计算机中,称为编码;将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。
重点:GBK、UTF-8
小结:采用何种规则编码,就要采用对应规则解码,否则会出现乱码!!!
import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.Arrays; public class Main { public static void main(String[] args) throws UnsupportedEncodingException { //定义一个字符串 String str = "中国"; //编码 byte[] bys1 = str.getBytes(); System.out.println(Arrays.toString(bys1)); //[-28, -72, -83, -27, -101, -67] 三个字节表示一个汉字,这里默认为utf-8 //指定编码 byte[] bys2 = str.getBytes("GBK"); System.out.println(Arrays.toString(bys2)); //[-42, -48, -71, -6] //解码 String ss = new String(bys1,"UTF-8"); System.out.println(ss); //中国 } }
字符流中和编码解码相关的两个类:
import java.io.*; public class Main { public static void main(String[] args) throws IOException { //写入 FileOutputStream fos = new FileOutputStream("FileIO\\osw.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8"); osw.write("中国"); osw.close(); //读取 FileInputStream fis = new FileInputStream("FileIO\\osw.txt"); InputStreamReader isr = new InputStreamReader(fis,"UTF-8"); //一次读一个字符数据 int ch; while ((ch=isr.read()) != -1){ System.out.print((char) ch); //中国 } } }
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class Main { public static void main(String[] args) throws IOException { OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("FileIO\\CharStream")); //写一个字符 osw.write(97); //a //刷新 osw.flush(); //再写一个字符 osw.write(98); //b //写一个字符数组 char[] chs = {'a','b','c','d','e'}; osw.write(chs); //abcde //写一个数组的一部分 osw.write(chs,1,3); //bcd //写一个字符串 osw.write("abcde"); //abcde //写一个字符串的一部分 osw.write("abcde",1,3); //bcd //释放资源 osw.close(); } }
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream("FileIO\\bos.txt")); //一次读一个字符数据 int ch1; while ((ch1 = isr.read()) != -1){ System.out.print((char) ch1); } //一次读一个字符数组数据 char[] chs = new char[1024]; int len; while ((len = isr.read(chs)) != -1){ System.out.println(new String(chs,0,len)); } //释放资源 isr.close(); } }
字符缓冲流:
import java.io.*; public class Main { public static void main(String[] args) throws IOException { //字符缓冲输入流 BufferedWriter bw = new BufferedWriter(new FileWriter("FileIO\\CharStream.txt")); bw.write("Hello\r\n"); bw.write("World\r\n"); bw.close(); //字符缓冲输出流 BufferedReader br = new BufferedReader(new FileReader("FileIO\\CharStream.txt")); //一次读一个字符数据 int ch; while ((ch = br.read()) != -1){ System.out.print((char) ch); } //一次读一个字符数组数据 char[] chs = new char[1024]; int len; while ((len = br.read(chs)) != -1){ System.out.print(new String(chs,0,len)); } br.close(); } }
BufferedWriter:
import java.io.*; public class Main { public static void main(String[] args) throws IOException { //创建字符缓冲输出流 BufferedWriter bw = new BufferedWriter(new FileWriter("FileIO\\CharStream.txt")); //写数据 for (int i = 0; i < 10; i++) { bw.write("Hello" + i); bw.newLine(); //自定义换行 bw.flush(); //刷新 } //释放资源 bw.close(); //创建字符缓冲输入流 BufferedReader br = new BufferedReader(new FileReader("FileIO\\CharStream.txt")); //读取数据 String line; while ((line=br.readLine()) != null){ System.out.println(line); //只读内容,不读换行符号 } //释放资源 br.close(); } }
图 from 黑马程序员
后记:
这周有些怠惰了,学习速度慢了许多。下周不会了!继续努力!