Com.Java.Basis 第十四课 《File类 +IO流》简称字节的Ctrl+A Ctrl+C Ctrl+V.这篇文章我无法创造出经典:但是我可以编写出自己经典的文章。十六个小案例带你走进Java的IO流
第一部分:基础知识的积累:
1 初识Java IO
IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。
Java 中是通过流处理IO 的,那么什么是流?
流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。
当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。
一般来说关于流的特性有下面几点:
先进先出:最先写入输出流的数据最先被输入流读取到。
顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)
只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。
总结:以自己为中心看流是流入还是流出
2 IO流分类
IO流主要的分类方式有以下3种:
按数据流的方向:输入流、输出流
按处理数据单位:字节流、字符流
按功能:节点流、处理流
3 IO流方法
3.1 字节流方法
字节输入流InputStream主要方法:
read() :从此输入流中读取一个数据字节。
read(byte[] b) :从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
read(byte[] b, int off, int len) :从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
close():关闭此输入流并释放与该流关联的所有系统资源。
字节输出流OutputStream主要方法:
write(byte[] b) :将 b.length 个字节从指定 byte 数组写入此文件输出流中。
write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
write(int b) :将指定字节写入此文件输出流。
close() :关闭此输入流并释放与该流关联的所有系统资源。
3.2 字符流方法
字符输入流Reader主要方法:
read():读取单个字符。
read(char[] cbuf) :将字符读入数组。
read(char[] cbuf, int off, int len) : 将字符读入数组的某一部分。
read(CharBuffer target) :试图将字符读入指定的字符缓冲区。
flush() :刷新该流的缓冲。
close() :关闭此流,但要先刷新它。
字符输出流Writer主要方法:
write(char[] cbuf) :写入字符数组。
write(char[] cbuf, int off, int len) :写入字符数组的某一部分。
write(int c) :写入单个字符。
write(String str) :写入字符串。
write(String str, int off, int len) :写入字符串的某一部分。
flush() :刷新该流的缓冲。
close() :关闭此流,但要先刷新它。
另外,字符缓冲流还有两个独特的方法:
BufferedWriter类newLine() :写入一个行分隔符。这个方法会自动适配所在系统的行分隔符。
BufferedReader类readLine() :读取一个文本行。
4 加点扩展的内容
4.1 位、字节、字符
字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。
字符(Character)计算机中使用的字母、数字、字和符号,比如’A’、‘B’、’$’、’&'等。
一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。
字节与字符:
ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。
第二部分:进入主题IO流:十六个小案例带你走进Java的IO流
案例Demo展示的内容
案例一
概述:文件和目录(文件夹)路径名的抽象表示形式
路径的分类:
绝对路径:带有盘符号的路径
相对路径:没有带盘符号的路径,默认在根目录下
构造方法
File(String pathname):根据一个路径得到File对象
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和子文件/目录得到File对象
判断功能
public boolean isDirectory(): 判断是否是目录
public boolean isFile(): 判断是否是文件
public boolean exists(): 判断是否存在
public boolean canRead(): 判断是否可读
public boolean canWrite(): 判断是否可写
public boolean isHidden(): 判断是否隐藏
获取功能
public String getAbsolutePath(): 获取绝对路径
public String getPath(): 获取相对路径
public String getParent() 获取上一级路径,返回字符串,没有返回null
public File getParentFile() 获取上一级路径,返回File类型,没有返回nul
public long getTotalSpace() 返回总容量 单位字节
public long getFreeSpace() 返回剩余容量 单位字节
public String getName(): 获取名称
public long length(): 获取长度。字节数
public long lastModified(): 获取最后一次的修改时间,毫秒值
package com.JavaBasicsDemo9; import java.io.File; /** * 概述:文件和目录(文件夹)路径名的抽象表示形式 * 路径的分类: * 绝对路径:带有盘符号的路径 * 相对路径:没有带盘符号的路径,默认在根目录下 * 构造方法 * File(String pathname):根据一个路径得到File对象 * File(String parent, String child):根据一个目录和一个子文件/目录得到File对象 * File(File parent, String child):根据一个父File对象和子文件/目录得到File对象 */ public class Demo1Test { public static void main(String[] args) throws Exception { // 1 File(String pathname) //创建的文件目录在的路径 File file = new File("E:\\demo\\nopainsnogains.ppt"); System.out.println(file);//打印文件路径 /** * (4)判断功能 * public boolean isDirectory(): 判断是否是目录 * public boolean isFile(): 判断是否是文件 * public boolean exists(): 判断是否存在 * public boolean canRead(): 判断是否可读 * public boolean canWrite(): 判断是否可写 * public boolean isHidden(): 判断是否隐藏 */ //判断文件夹是否有目录 System.out.println(file.isDirectory()); //判断是否有文件 System.out.println(file.isFile()); //判断是否存在 System.out.println(file.exists()); //判断是否可读 System.out.println(file.canRead()); //判断是否可以写 System.out.println(file.canWrite()); //判断是否隐藏 System.out.println(file.isHidden()); /** * 5)获取功能 * public String getAbsolutePath(): 获取绝对路径 * public String getPath(): 获取相对路径 * public String getParent() 获取上一级路径,返回字符串,没有返回null * public File getParentFile() 获取上一级路径,返回File类型,没有返回null * public long getTotalSpace() 返回总容量 单位字节 * public long getFreeSpace() 返回剩余容量 单位字节 * public String getName(): 获取名称 * public long length(): 获取长度。字节数 * public long lastModified(): 获取最后一次的修改时间,毫秒值 */ //获取绝对路径 System.out.println(file.getAbsolutePath()); //获取相对路径 System.out.println(file.getPath()); //获取上一级路径,返回字符串,没有返回null System.out.println(file.getParent()); //获取上一级路径,返回File类型,没有返回null System.out.println(file.getParentFile()); System.out.println(file.getCanonicalPath()); System.out.println("返回总容量 单位字节" + file.getTotalSpace()); System.out.println("返回剩余容量 单位字节" + file.getFreeSpace()); System.out.println(file.getName()); System.out.println(file.length()); System.out.println(file.lastModified()); //创建文件 file.createNewFile(); //创建目录文件夹 //File file1 =new File("E:\\demo\\hello"); //file1.mkdir(); //创建文件多及目录 File file2 = new File("E:\\demo\\aa\\ba\\ca\\da\\ea\\fa\\ga"); file2.mkdirs(); File f = new File("E:\\demo\\HelloWord.text"); System.out.println(f); f.mkdir(); System.out.println(f.isDirectory()); System.out.println(f.isFile()); } }
案例二:
package com.JavaBasicsDemo9; import java.io.FileOutputStream; import java.io.IOException; public class Demo1Test2 { public static void main(String[] args) { // TODO Auto-generated method stub FileOutputStream fos=null; try { //创建 fos =new FileOutputStream("E:\\demo\\File.txt" ,true); for (int i = 0; i <=5; i++) { System.out.println("ctrl+c ctrl+v"); fos.write("窗前明月光意识地上床酒托人生能坎区因".getBytes()); fos.write("\r\n".getBytes()); } } catch (Exception e) { e.printStackTrace(); }finally { //释放资源 try { if(fos!=null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
案例三:
package com.JavaBasicsDemo9; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo1Test3 { public static void main(String[] args) throws IOException { //输入流中的ctrl+A ctrl+C FileInputStream fis=new FileInputStream("E:\\demo\\File.txt"); //输出 //Ctrl+v FileOutputStream fos =new FileOutputStream("E:\\demo\\ctrlV.txt",true); int by; while((by=fis.read())!=-1) { fos.write(by); } fis.close(); fos.close(); } }
Java程序员的ctrl+A ctrl+c ctrl+v
案例四:
package com.JavaBasicsDemo9; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo1Test4 { public static void main(String[] args) throws IOException { //输入 FileInputStream fis=new FileInputStream("E:\\demo\\AAA.txt"); //输出 FileOutputStream fos =new FileOutputStream("E:\\demo\\BBB.txt",true); int by; while((by=fis.read())!=-1) { fos.write(by); } fis.close(); fos.close(); } }
案例五:
package com.JavaBasicsDemo9; import java.io.File; public class Demo1Test5 { public static void main(String[] args) throws Exception{ // 1 File(String pathname) File file =new File ("E:\\demo\\AAA.text"); System.out.println(file); //判断文件夹 System.out.println(file.isDirectory()); //判断文件 System.out.println(file.isFile()); //file文件路径 System.out.println(file.exists()); System.out.println(file.getAbsolutePath()); System.out.println(file.getName()); System.out.println(file.getPath()); System.out.println(file.getCanonicalFile()); //创建文件 file.createNewFile(); //多及目录 File file2 =new File("E:\\demo\\aa\\ba\\ca\\da\\ea\\fa\\ga"); file2.mkdirs(); File f =new File ("E:\\demo\\hellow.text"); System.out.println(f); f.mkdir(); System.out.println(f.isDirectory()); System.out.println(f.isFile()); } }
File file =new File ("E:\\demo\\AAA.text"); 创建文件的方式
案例六:
package com.JavaBasicsDemo9; import java.io.FileOutputStream; import java.io.IOException; public class Demo1Test6 { public static void main(String[] args) { // TODO Auto-generated method stub FileOutputStream fos=null; try { //创建 fos =new FileOutputStream("E:\\demo\\AAA.txt" ,true); for (int i = 0; i <=10; i++) { // System.out.println("NO PAINS"); fos.write("我是转入的数据ctrl ".getBytes()); fos.write("\r\n".getBytes()); } } catch (Exception e) { e.printStackTrace(); }finally { //释放资源 try { if(fos!=null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
案例七:
package com.JavaBasicsDemo9; import java.io.File; public class Demo1Test7 { public static void main(String[] args) throws Exception{ // 1 File(String pathname) //文件名 File file =new File ("E:\\demo\\heerllo.text"); System.out.println(file); //创建文件 file.createNewFile(); //创建目录文件夹 File file1 =new File("E:\\demo\\hello"); file1.mkdir(); File file22 =new File("E:\\dem\\hert"); //多及目录 File file2 =new File("E:\\demo\\a\\b\\c"); file2.mkdirs(); File f =new File ("E:\\demo\\heerllowert.text"); System.out.println(f); f.mkdir(); System.out.println(f.isDirectory()); System.out.println(f.isFile()); } }
案例八:
package com.JavaBasicsDemo9; import java.io.File; /** * File的删除文件 */ public class Demo1Test8 { public static void main(String[] args) { File file =new File ("E:\\demo\\hello"); //删除路径的文件夹 file.delete(); //不能伤处多及目录 File file1 =new File ("E:\\demo\\hello"); //删除路径的文件夹 file.delete(); // File file2 =new File ("E:\\demo\\a\\b\\c\\d\\e\\f"); //删除路径的文件夹 file2.delete(); } }