IO流:(Input Output) 输入输出流
输入:将文件读到内存中。
输出:将文件从内存输出到其他地方。
IO计数的作用:主要就是解决设备和设备之间的数据传输问题。
比如:硬盘到--->内存,内存数据--->硬盘中 把键盘中的数据写入到内存。
IO的应用场景:
比如:打卡机打出信息表、注册的时候图片的上传、下载 功能、解析XML
数据保存到本地,数据一个永久保存。数据保存到磁盘上是以文件的形式存在的。
java中如何操作文件:
java是通过File文件类来操作文件和文件夹。
File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
java是跨平台的不同的操作系统上都可以运行。
目录分隔符:
不同的系统目录 的分隔符是不一样的。
在Windows系统上目录分隔符: ,但是Linux系统上的目录分隔符是 / 。
注意点:在Windows上 或者 / 都可以作为目录的分隔符,如果你用的反斜杠,
将U盘中的文件拷贝到电脑中:输入流--->读到内存--->通过输出流读到电脑磁盘中。
代码是在内存中运行的。
路径问题:
绝对路径 : 文件在硬盘上的完整路径。绝对路径一般都是以盘符开头 D:\a.txt 绝对路径
相对路径 : 相对路径就是资源文件相对当前程序所在的路径
File中常用的方法:
创建:
CreateNewFile() 在指定位置创建一个空文件,成功就返回true,如果已存在就不创建然后返回false
mkdir() 在指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。
mkdirs() 在指定位置创建目录,这会创建路径中所有不存在的目录。
renameTo(File dest) 重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切,剪切时候不能操作非空的文件夹。移动/重命名成功则返回true,失败则返回false。
删除:
delete() 删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false。
deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除
创建文件的方法:
File file = new File("D:\aa"); System.out.println("通过指定的路径创建一个空的文件"+file.createNewFile()); |
创建文件夹的方法:
File dir = new File("D:\cc"); //1.不能够有同名的文件或文件夹 2.只能创建单级文件夹 System.out.println("创建文件夹成功吗"+dir.mkdir()); File dirs = new File("D:\bb\aa");System.out.println("创建文件夹成功吗?"+dirs.mkdirs()); |
文件夹的重命名:
File file = new File("D:\aa.txt"); System.out.println("是否找到该文件夹?"+file.exists()); File destFile = new File("D:\aabb"); //指的是重命名的名字 System.out.println("重命名成功吗?"+file.renameTo(destFile)); |
文件的重命名:
File file = new File("D:\aa"); System.out.println("重命名成功吗?"+file.renameTo(new File("D:\aa.txt"))); //如果更改盘符 : renameTo 是做剪切的操作。 File file = new File("D:\aa.txt"); System.out.println("重命名成功吗"+file.renameTo(new File("G:\aa.txt"))); |
删除:
//1.delete() : 删除文件或空的文件夹。 直接删除掉 File file = new File("D://a.txt"); System.out.println("删除成功吗?"+file.delete()); file.deleteOnExit();//用来删除临时文件 System.out.println("哈哈"); file.deleteOnExit(); //在jvm退出的时候删除。 |
判断方法:
exists() 文件或文件夹是否存在。
isFile() 是否是一个文件,如果不存在,则始终为false。
isDirectory() 是否是一个目录,如果不存在,则始终为false。
isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。
isAbsolute() 测试此抽象路径名是否为绝对路径名。
获取方法:
getName() 获取文件或文件夹的名称,不包含上级路径。
getPath() 返回绝对路径,可以是相对路径,但是目录要指定
getAbsolutePath() 获取文件的绝对路径,与文件是否存在没关系
length() 获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。
getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。
lastModified() 获取最后一次被修改的时间。
文件夹相关:
staic File[] listRoots() 列出所有的根目录(Window中就是所有系统的盘符)
list() 返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。
list(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
listFiles() 返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。
listFiles(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
获取最后一次被修改的时间:
System.out.println("最后一次修改的时间:"+file.lastModified()); long time = file.lastModified(); Date date = new Date(time); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("最后一次修改的时间:"+dateFormat.format(date)); |
文件夹的操作;
File[] files = File.listRoots(); // 获取windows电脑中所有的盘符 for (File file : files) { System.out.println("盘符:"+file); } |
//获取指定文件夹下文件和子目录的字符串名称 ,子目录中的东西是获取不到的。 File file = new File("D:\java "); String[] nameStrings = file.list(); for (String string : nameStrings) { System.out.println(string); } /*File file = new File("D:\java "); File[] files = file.listFiles(); for (File file2 : files) { System.out.println("name:"+file2.getName()); //判断file2指的是文件还是文件夹 if(file2.isDirectory()){ //从子目录中在次获取值 File[] nextFiles = file2.listFiles(); for (File file3 : nextFiles) { System.out.println("subname:"+file3.getName()); } } }*/ |
查找指定的后缀名的文件:
File file = new File("D:\java课件及资料"); //定义一个过滤器 //FilenameFilter 一个接口 String[] strings = file.list(new MyFilter()); for (String string : strings) { System.out.println(string); } |
IO流的分类:
流按照操作数据的类型分为两种:字节流,字符流
字节流:读取的是文件的二进制数据,不会对二进制做处理。不会解析成看得懂的数据。
字符流:读取的也是二进制数据,他会将这个二进制的数据转化为我们能够识别的字符(解码)。字符流是以字符为单位的。
字符流 = 字节流 + 解码。
按照流的方向可以分为:输入流,输出流
判断流是输入还是输出:以当期的应用程序为参考,观察出具是流入还是流出,如果流入就是输入流,如果流出就是输出流。
字节流:
InputStream:此抽象类是表示字节输入流的所有类的超类,抽象的类。
如何判断一个流是字节输入流:
判断一下他的类名是否是以InputStream结尾。
使用 FileInputStream: 是InputStream的子类
读取文件的四种方式:
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Demo1 { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub // getFile(); // getFile2(); // getFile3(); getFile4(); } //方式四:通过创建缓冲区和循环的方式来读取 public static void getFile4() throws IOException{ //1.找目标文件 File file = new File("D:\java课件"); //2.建立通道 FileInputStream fileInputStream = new FileInputStream(file); //3.创建一个缓冲区 byte[] b = new byte[1024]; // 一般写1024倍数 //4.读取数据 int count = 0; while((count = fileInputStream.read(b))!=-1){
System.out.println(new String(b,0,count)); } //5.关闭资源 fileInputStream.close(); } //方式三:创建缓冲区来读取数据 缺陷不能够读取一个完整的文件 public static void getFile3() throws IOException{ //1.找目标文件 File file = new File("D:\a.txt"); //2.建立通道 FileInputStream fileInputStream = new FileInputStream(file); //3.创建一个缓冲区 byte[] b = new byte[1024]; //4.读数据 //缓冲区来读数据 : 数据存在哪里 //数据是存在缓存区字节数组中的 //返回值就是文件的大小。 int count = fileInputStream.read(b); System.out.println(count); //String里面帮我们做了解码功能 System.out.println(new String(b, 0, count)); //5.关闭资源 fileInputStream.close(); } //方法二:用循环来读取字节数 缺点读取的效率不高 public static void getFile2() throws IOException{ //1.找目标文件 File file = new File("D:\a.txt"); //2.建立通道 FileInputStream fileInputStream = new FileInputStream(file); //3.读数据 /*for(int i = 0;i<file.length();i++ ){//有多少个字节就去多少次 char c = (char)fileInputStream.read(); System.out.print(c); }*/ int content = 0; //通过while循环调用read()的方法 ,如果返回的值以-1表示文件没有内容了。 while((content = fileInputStream.read())!= -1){ System.out.print((char)content); } //4.关闭资源 fileInputStream.close(); } //方法一:每次只读取一个字节 public static void getFile() throws IOException{ //1.找到目标文件 File file = new File("D:\a.txt"); //2.建立通道 FileInputStream fileInputStream = new FileInputStream(file); //3.读取文件中的数据 //read() 只获取一个字节 int data = fileInputStream.read(); //a 第一个字节 int data2 = fileInputStream.read(); System.out.println("获取的数据:"+data2); //4.关闭资源(释放资源) fileInputStream.close(); } } |
字节输出流 :
OutPutStream : 他也是所有字节输出流的超类 ,也是一个抽象的类 ,使用子类
-----FileOutputStream 文件输出流
FileOutputStream 的使用步骤:
1.找到目标文件
2.建立通道
3.写入数据
4.关闭资源
FileOutputStream的使用注意事项:
1.使用FileOutputStream写数据的时候,如果目标文件不存在,那么就会自己创建一个目标文件对象。
2.使用FileOutputStream写数据的时候,如果目标文件存在,先将里面的数据清空,在写入数据。
3.使用FileOutputStream写数据的时候,如果目标文件存在,想将数据在原有的基础上追加,这个
时候就应该使用FileOutputStream(File file, boolean append) 构造方法, append如果为true表示
可以追加数据,反之不信。
4..使用FileOutputStream写数据的时候,用write(int a)方法写数据,虽然接收的是int ,但实际上只有一个字节的数据,
操作的是低八位的二进制 ,其他的24位全部丢掉。
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; public class Demo2 {
/** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub writeData();
//writeData2();
FileInputStream inp = new FileInputStream(new File("D:\a.txt")); byte[] b = new byte[1024]; inp.read(b); System.out.println(Arrays.toString(b));
}
//方式二: public static void writeData2() throws IOException{ //1.找目标文件 File file = new File("D:\a.txt"); //2.创建一个通道 FileOutputStream outputStream = new FileOutputStream(file,true); // 在这一步创建的文件。 //3.创键一个字节数组 String str = "hello word"; //将字符串变为字节数组 byte[] b = str.getBytes(); //4.写入数据 outputStream.write(b); //5.关闭资源 outputStream.close(); } //方式一 public static void writeData() throws IOException{ //1.找目标文件 File file = new File("D:\a.txt"); //2.创建一个通道 FileOutputStream outputStream = new FileOutputStream(file); //3.开始写入数据 /*int a = 10; // 4个字节 outputStream.write(a); //每次输出一个字节 outputStream.write('b'); outputStream.write('c');*/ // 0000-0000 0000-0000 0000-0001 1111-1111 == 511 int a = 127; outputStream.write(a); // 255 //4.关闭资源 outputStream.close(); } } |