IO流知识总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流知识总结相关的知识,希望对你有一定的参考价值。

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();

}

 

}

以上是关于IO流知识总结的主要内容,如果未能解决你的问题,请参考以下文章

IO流知识点总结

IO流相关知识(File,字节流,字符流,特殊操作流(标准输入流,标准输出流,对象序列化与反序列化,properties与IO流结合))相关知识总结

IO流之字符流知识总结

Java IO流基础总结

java IO流集合类部分小知识点总结

Java 基础知识点 笔记总结