Java笔记6(IO)
只是一些自己认为重点和易错点的笔记
I/O框架相关笔记
1. 分类:
-
按方向:输入输出流,是以内存为参考;
-
按单位:
字节流:字节为单位,可读取所有数据;
字符流:字符为单位,只能读写文本数据;
-
功能:
节点流:传输实际数据的读写功能;
过滤流: 在节点流基础上增强功能。
2. 字节流
-
-
字节流的父类(抽象类)
1.1 InputStream抽象类:字节输入流的超类;
1.2 OutputStream抽象类:字节输出流的超类。
-
子类:
输入流:
public static void main(String[] args) throws Exception { //创建输入流 FileInputStream fis = new FileInputStream("d:\\aaa.txt"); //1.1每次读取一个字节,读取完返回-1 // int date; // while((date = fis.read()) != -1){ // System.out.print((char)date); // } // read()一个一个字节读,返回的就是这个字节的int表示 // read(byte[] b)返回数组字节个数,若数组未满,则返回真实字节个数 //1.2 读取数值存到数组中 byte[] bt = new byte[2]; int count = 0; while((count = fis.read(bt)) != -1){ System.out.println(new String(bt,0,count)); } //关闭 fis.close();输出流:
public static void main(String[] args) throws Exception { //创建输出流,有true参数表示在文件后追加,否则为覆盖 FileOutputStream fos = new FileOutputStream("d:\\bbb.txt",true); fos.write(97); fos.write('b'); fos.write('c'); String s ="helloword"; fos.write(s.getBytes()); fos.close(); System.out.println("执行完毕"); }用字节输入输出流复制图片:
public static void main(String[] args) throws Exception { //创建流 FileInputStream fis = new FileInputStream("d:\\aaa.jpg"); FileOutputStream fos = new FileOutputStream("d:\\bbb.jpg"); //一边读取一边写入 byte[] bu = new byte[1024]; int count=0; while((count = fis.read(bu)) != -1){ fos.write(bu,0,count); } //关闭 fis.close(); fos.close(); System.out.println("复制完毕"); }字节缓冲流
-
输入BufferedInputStream
使用flush()刷新内容;
public static void main(String[] args) throws Exception { //创建字节输入流 FileInputStream fis = new FileInputStream("d:\\aaa.txt"); //创建字节缓冲流 BufferedInputStream bis = new BufferedInputStream(fis); int date = 0; while ((date = bis.read()) != -1){ System.out.println((char)date); } bis.close();
}
* 输出BufferedOutStream ```java public static void main(String[] args) throws Exception { //创建字符输出流 FileOutputStream fos = new FileOutputStream("d:\\buffer.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); for (int i = 0; i < 10; i++) { bos.write("helloword".getBytes()); bos.flush(); } //关闭 bos.close(); } -
-
对象流
* ObjectInputStream/ObjectOutputStream
* 序列化(写入)时被创建对象的类需要实现Serializable接口,标记类的对象可被序列化;
* 在被创建对象的类(Student)中添加**序列化版本号ID**,保证序列化的类和反序列化的类是同一个;
* 添加**transient**修饰属性,此属性不可被序列化;
* 静态属性不可被序列化;
* 一次序列化多个,可将对象放入集合中。
```
//序列化
public static void main(String[] args) throws Exception {
//创建对象流
FileOutputStream fos = new FileOutputStream("d:\\stu.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
//序列化(写入操作)
Student st = new Student("zhangsan",33);
oos.writeObject(st);
//关闭
oos.close();
}
```
```java
//反序列化
public static void main(String[] args) throws Exception {
//创建流
FileInputStream fis = new FileInputStream("d:\\stu.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
Student stu = (Student)ois.readObject();
ois.close();
System.out.println(stu.toString());
}
```
3. 字符流
-
-
字符流父类(抽象类)
Reader/Writer
-
-
- 子类:
FileReader文件字符输入流
public static void main(String[] args) throws Exception { FileReader fr = new FileReader("d:\\aaa.txt"); //读取一个字符 // int data = 0; // while((data = fr.read()) != -1){ // System.out.println((char)data); // } //读取多个字符 char[] ch = new char[10]; int count = 0; while ((count = fr.read(ch)) != -1){ System.out.println(new String(ch,0,count)); } fr.close(); }FileWriter文件字符输出流
public static void main(String[] args) throws Exception { FileWriter fw = new FileWriter("d:\\bbb.txt"); fw.write("好好学习java"); fw.flush(); fw.close(); }//字符流复制文本文件 public static void main(String[] args) throws Exception { FileReader fi = new FileReader("d:\\aaa.txt"); FileWriter fw = new FileWriter("d:\\bbb.txt",true); char[] ch = new char[1024]; int count = 0; while((count = fi.read(ch)) != -1){ fw.write(new String(ch,0,count)); fw.flush(); } fi.close(); fw.close(); System.out.println("复制完毕"); } * 字符流不能用来复制图片或二进制文件,
* 字节流可复制任意文件
字符缓冲流
- 支持输入换行符;
- 读一行,写一行。
//字符输入缓冲流 public static void main(String[] args) throws Exception { //创建对象 FileReader fr = new FileReader("d:\\aaa.txt"); BufferedReader br =new BufferedReader(fr); //读取一行 String st = null; while((st = br.readLine()) != null){ System.out.println(st); } br.close();//字符输出缓冲流 public static void main(String[] args) throws Exception { FileWriter fw = new FileWriter("d:\\bbb.txt",true); BufferedWriter bw = new BufferedWriter(fw); for (int i = 0; i < 10; i++) { bw.write("可太菜了"); bw.newLine(); //相当于换行符 bw.flush(); } bw.close(); }打印流
-
PrintWriter类
-
封装了print()和println()方法,支持写入后换行;
-
支持数据原样打印。
public static void main(String[] args) throws Exception { PrintWriter pw = new PrintWriter("d:\\print.txt"); pw.println(97); pw.println(true); pw.println('a'); pw.println(3.14); pw.close(); System.out.println("执行完毕"); }97 true a 3.14
4.转换流
-
InputStreamReader,字节转换为字符;
-
可指定使用的编码。
public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("d:\\aaa.txt"); InputStreamReader isr = new InputStreamReader(fis,"UTF-8"); int date = 0; while((date = isr.read()) != -1) System.out.print((char)date); isr.close(); } -
OutputStreamWriter,字符转换为字节;
public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("d:\\out.txt",true); OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8"); for (int i = 0; i < 10; i++) { osw.write("java是最好的语言"); osw.flush(); } osw.close(); }
File类
-
代表物理盘符下的文件或文件夹
文件操作
public class FileTest { public static void main(String[] args) throws Exception { //测试分隔符 // separator(); //测试文件操作 fileOpe(); } //分隔符 public static void separator(){ System.out.println("路径分隔符:" + File.pathSeparator); //输出为; System.out.println("名字分隔符:" + File.separator); //输出为\ } //文件操作 public static void fileOpe() throws Exception{ //1、创建文件 File file = new File("d:\\file.txt"); if(!file.exists()){ boolean newf = file.createNewFile(); System.out.println("创建结果:" + newf); } //2、删除文件 // boolean delete = file.delete(); // System.out.println("删除结果:" + delete); //2.1 当JVM 退出时删除 // file.deleteOnExit(); //// Thread.sleep(5000); //3、获取文件绝对路径 System.out.println("绝对路径:" + file.getAbsolutePath()); System.out.println("路径:" + file.getPath()); System.out.println("文件名称:" + file.getName()); System.out.println("父目录:" + file.getParent()); System.out.println("文件长度:" + file.length()); System.out.println("文件创建时间:" + new Date(file.lastModified()).toLocaleString()); //4、判断 System.out.println("是否可写:" + file.canWrite()); System.out.println("是否是文件:" + file.isFile()); System.out.println("是否隐藏:" + file.isHidden()); }文件夹操作
public static void directoryOpe() throws Exception{ //1.创建文件夹 File dir = new File("d:\\aaa\\bbb\\ccc"); if(!dir.exists()){ // dir.mkdir(); //只能创建单级目录 System.out.println("创建结果:" + dir.mkdirs()); } //2.删除文件夹 //2.1直接删除 // System.out.println("删除结果:" + dir.delete()); //只删除ccc,且ccc必须为空 //2.2通过JVM删除 // dir.deleteOnExit(); // Thread.sleep(5000); //3.获取文件夹信息 System.out.println("文件夹绝对路径:" + dir.getAbsolutePath()); System.out.println("路径:" + dir.getPath()); System.out.println("名字:" + dir.getName()); System.out.println("父目录:" + dir.getParent()); System.out.println("创建时间:" + new Date(dir.lastModified()).toLocaleString() ); //4.判断 System.out.println("是否为文件夹:" + dir.isDirectory()); System.out.println("是否隐藏::" + dir.isHidden()); //5.遍历文件夹 File dir1 = new File("d:\\java"); String[] str = dir1.list(); //遍历文件夹名 for (String s : str) { //dir.listFiles() 遍历文件夹路径 System.out.println(s); } //6.过滤,选择想要的文件类型 File[] files = dir1.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if(pathname.getName().endsWith(".jpg")){ return true; }else { return false; } } }); for (File file : files) { System.out.println(file); } }递归遍历和删除多级文件夹
public static void main(String[] args) { listDir(new File("d:\\aaa")); deleteDir(new File("d:\\aaa")); System.out.println("执行成功"); } //递归遍历文件夹 public static void listDir(File dir) { File[] files = dir.listFiles(); if(files!=null&&files.length>0){ for (File file : files) { if(file.isDirectory()){ listDir(file); }else { System.out.println(file); } } } } //递归删除文件夹 public static void deleteDir(File dir){ File[] files = dir.listFiles(); if(files!=null&&files.length>0){ for (File file : files) { if(file.isDirectory()){ deleteDir(file); }else{ file.delete(); } } } dir.delete(); }

浙公网安备 33010602011771号