JAVA--IO流

    科技2022-07-10  126

     

    一、java.io.file

    File file = new File("C://1.txt"); //创建file对象,用于创建文件 file.exists();//建议先判断文件是否存在 file.createNewFile();//用于判断是否创建成功,若文件已存在则返回false,若不存在则创建该文件并返回true file.mkdir(); //用于创建单个文件夹 file.mkdirs();//可以创建多个 比如:c://a/b/c File dir = new File("c://test1"); File a = new File(dir,"test2.txt");//创建子文件 File b = new File("c://test1","test3.txt");//效果等同上一个 a.delete();//删除test2.txt文件 b.length();//获取文件大小,按字节计算 dir.list();//获取该路径下所有的文件和目录 dir.listFiles();//获取该路径下所有的文件 File oldFile = new File("c://a.zip"); File newFile = new File("d://b.zip"); oldFile.renameTo(newFile);//把旧的文件放到新的位置去(重命名) System.out.println(File.pathSeparator);//获取路径分隔符 打印结果为: ; 用于跨系统编写,进行替换 System.out.println(File.separator);//获取名称分隔符 打印结果为: \

    二、文件过滤器

    public static void main(String[] args) throws IOException { File e = new File("d://"); listFiles(e); } public static void listFiles(File file){ //创建一个过滤器,过滤avi文件 FileFilter filter = new AVIFileFilter(); //通过文件获取子文件夹 File[] files = file.listFiles(filter); if(files != null && files.length>0) { for (File f : files) { if (f.isDirectory()) { listFiles(f); } else { System.out.println("发现一个avi文件" + f.getAbsolutePath()); } } } } static class AVIFileFilter implements FileFilter{ @Override public boolean accept(File pathname) { if(pathname.getName().endsWith(".avi") || pathname.isDirectory()){ return true; } return false; } }

    三、相对于与绝对路径

    绝对路径:从盘符开始,是一个完整的路径 比如:c://a.txt

    相对路径:在java中是相对于项目目录路径,这是一个不完整的便捷路径,在java开发中很常用,例如:a.txt

    四、IO流

    概述:可以将这种数据传输操作,看做一种数据的流动,按照流动的方向分为输入Input和输出Output。

    IO流的分类:

        按照流的方向来分,可以分为输入流和输出流

        按照流动的数据类型来分,可以分为字节流和字符流

            字节流:一切皆字节

            输入流: 顶级父类InputStream

            输出流:顶级父类OutputStream

     

            字符流:

              输入流:Reader

              输出流:Writer

    后续学习的任何流,在传输时底层都是二进制

    OutputStream(抽象类)

    close​()

     

    关闭此输出流并释放与此流相关联的任何系统资源。 

    flush​()

     

    刷新此输出流并强制任何缓冲的输出字节被写出。 

    write​(byte[] b)

     

    将 b.length字节从指定的字节数组写入此输出流。 

    write​(byte[] b, int off, int len)

     

    从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。  

    write​(int b)

     

    将指定的字节写入此输出流。 不能超过255

    FileoutputStream(具体类)

    FileOutputStream​(File file)

     

    创建文件输出流以写入由指定的 File对象表示的文件。 

    ileOutputStream​(File file, boolean append)

     

    创建文件输出流以写入由指定的 File对象表示的文件。 若append是true则接着写,若是false,则清空再写

    FileOutputStream​(String name)

     

    创建文件输出流以指定的名称写入文件。 

    FileOutputStream​(String name, boolean append)

     

    创建文件输出流以指定的名称写入文件。 若append是true则接着写,若是false,则清空再写

    public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("d://a.txt"); //非追加模式 byte[] bytes = {65,66,67,68,69}; //写入的字节用ASCII码转换 fos.write(bytes); //写入文件 fos.close(); //记得关闭文件输出流 } public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("d://a.txt",true); //追加模式,在原有的基础上再写入 byte[] bytes = "ABCDE".getBytes(); //写入的字节用ASCII码转换 fos.write(bytes); //写入文件 fos.close(); //记得关闭文件输出流 }

     

    public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("d://a.txt",true); //追加模式,在原有的基础上再写入 byte[] bytes = "ABCDE".getBytes(); //写入的字节用ASCII码转换 fos.write(bytes,1,2); //从1下标开始写,写两个 fos.close(); //记得关闭文件输出流 }

    注:只有一个流被重新创建的时候才需要指定是否追加。流关闭后不能再去写。

    FileInputStream

    int

    available​()

     

    返回从此输入流中可以读取(或跳过)的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞。

    void

    close​()

     

    关闭此文件输入流并释放与流相关联的任何系统资源。

    protected void

    finalize​()

     

    已过时。

    finalize方法已被弃用。 为了执行清理而覆盖finalize子类应该修改为使用替代清理机制,并删除覆盖的finalize方法。 当覆盖finalize方法时,其实现必须明确确保按照super.finalize()所述调用super.finalize() 。 有关迁移选项的更多信息,请参阅Object.finalize()的规范。

    FileChannel

    getChannel​()

     

    返回与此文件输入流相关联的唯一的FileChannel对象。

    FileDescriptor

    getFD​()

     

    返回表示与此 FileInputStream正在使用的文件系统中的实际文件的连接的 FileDescriptor对象。

    int

    read​()

     

    从该输入流读取一个字节的数据。

    int

    read​(byte[] b)

     

    从该输入流读取最多 b.length个字节的数据到一个字节数组。

    int

    read​(byte[] b, int off, int len)

     

    从该输入流读取最多 len个字节的数据到字节数组。

    long

    skip​(long n)

     

    跳过并从输入流中丢弃 n字节的数据。

    public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("d://a.txt"); while(true) { byte b = (byte) fis.read(); //读取a.txt文件,每次读取一个字节 if(b==-1){ //如果读取完就退出 break; } System.out.println((char)b); //转换成字符输出 } fis.close(); } public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("d://a.txt"); byte[] bytes = new byte[10]; int len = fis.read(bytes); System.out.println(new String(bytes,0,len)); //读取0到len个字符 len = fis.read(bytes); System.out.println(new String(bytes,0,len)); len = fis.read(bytes); System.out.println(len); fis.close(); }

    五、文件加密解密

    public static void main(String[] args) throws IOException { System.out.println("请输入文件存储的全路径:"); Scanner input = new Scanner(System.in); String fileName = input.nextLine(); //原文件 : a.txt File oldFile = new File(fileName); //加密文件 : mi-a.txt File newFile = new File(oldFile.getParentFile(),"mi-"+oldFile.getName()); FileInputStream fis = new FileInputStream(oldFile); FileOutputStream fos = new FileOutputStream(newFile); while (true){ int b = fis.read(); if(b==-1){ break; } fos.write(b^10); //任何数据^相同的数字两次,结果就是其本身 } System.out.println("加密或解密完成"); }

    六、字符输出

    Writer

    append​(char c)

     

    将指定的字符附加到此作者。

    Writer

    append​(CharSequence csq)

     

    将指定的字符序列附加到此作者。

    Writer

    append​(CharSequence csq, int start, int end)

     

    将指定字符序列的子序列附加到此作者。

    abstract void

    close​()

     

    关闭流,先刷新。

    abstract void

    flush​()

     

    刷新流。

    void

    write​(char[] cbuf)

     

    写入一个字符数组。

    abstract void

    write​(char[] cbuf, int off, int len)

     

    写入字符数组的一部分。

    void

    write​(int c)

     

    写一个字符

    void

    write​(String str)

     

    写一个字符串

    void

    write​(String str, int off, int len)

     

    写一个字符串的一部分。 

    public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("d://a.txt",true); fw.write("巴拉巴拉巴拉"); fw.close(); } public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("d://a.txt"); fw.append("ab").append("cd").append("ef"); fw.close(); }

     注:追加与是否true有关,与append无关

    Reader

    abstract void

    close​()

     

    关闭流并释放与之相关联的任何系统资源。

    void

    mark​(int readAheadLimit)

     

    标记流中的当前位置。

    boolean

    markSupported​()

     

    告诉这个流是否支持mark()操作。

    int

    read​()

     

    读一个字符

    int

    read​(char[] cbuf)

     

    将字符读入数组。

    abstract int

    read​(char[] cbuf, int off, int len)

     

    将字符读入数组的一部分。

    int

    read​(CharBuffer target)

     

    尝试将字符读入指定的字符缓冲区。

    boolean

    ready​()

     

    告诉这个流是否准备好被读取。

    void

    reset​()

     

    重置流。

    long

    skip​(long n)

     

    跳过字符 

    读取单个字符

    FileReader fr = new FileReader("d://a.txt"); int c = fr.read(); System.out.println((char)c);

    读取字符串

    FileReader fr = new FileReader("d://a.txt"); char[] chars = new char[100]; int len = fr.read(chars); String text = new String(chars,0,len); System.out.println(text); System.out.println(text.length()); fr.close();

    文件内容必须要刷新后才能写入。 close()方法在结束时会刷新一次,因此文件才能写入 flush()方法也用于管道刷新

    七、转换流

    字节流‘装饰’为字符流 : 使用了装饰者设计模式

    FileInputStream fis = new FileInputStream("d://a.txt"); //将字节输入流转换为字符输入流 //参数1:要转换的字节流 //参数2:指定编码名称(gbk,utf-8) InputStreamReader isr = new InputStreamReader(fis); while (true){ int c = isr.read(); if(c==-1){ break; } System.out.println((char)c); }

    //缓存字符读取流: 字节输入流-->字符输入流-->缓存字符读取流,可以一次读一行 FileReader fw = new FileReader("d://a.txt"); BufferedReader br = new BufferedReader(fw); String text = br.readLine();//返回到最后会返回null System.out.println(text); text = br.readLine(); System.out.println(text);

    八、收集异常日志

    try{ String s = null; s.toString(); }catch (Exception e){ PrintWriter pw = new PrintWriter("d://bug.txt");//将异常写入文件 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); pw.println(sdf.format(new Date()));//将日期记录 e.printStackTrace(); pw.close(); }

    九、properties

    void

    clear​()

     

    清除此散列表,使其不包含键。 

    Object

    put​(Object key, Object value)

     

    将指定的 key映射到此散列表中指定的 value 。 

    Object

    remove​(Object key)

     

    从此散列表中删除键(及其对应的值)。

    void

    load​(InputStream inStream)

     

    从输入字节流读取属性列表(键和元素对)。

    void

    load​(Reader reader)

     

    以简单的线性格式从输入字符流读取属性列表(关键字和元素对)。 

    void

    store​(OutputStream out, String comments)

     

    将此 Properties表中的此属性列表(键和元素对)以适合于使用 load(InputStream)方法加载到 Properties表格的格式写入输出流。

    void

    store​(Writer writer, String comments)

     

    将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式输出到输出字符流。  

    boolean

    isEmpty​()

     

    测试这个哈希表是否将值映射到值。 

    String

    getProperty​(String key)

     

    使用此属性列表中指定的键搜索属性。 

    Object

    get​(Object key)

     

    返回指定键映射到的值,如果此映射不包含键的映射,则返回 null 。 

    Properties ppt = new Properties(); ppt.put("1","一楼"); //存储Map键值对 ppt.put("2","二楼"); ppt.put("2","三楼"); FileWriter fw = new FileWriter("d://a.properties");//存储为.properties文件 ppt.store(fw,"floor"); //将键值对存储进a.properties里,comments是注释,一般不建议用中文 fw.close();

    读取

    Properties ppt = new Properties(); Reader r = new FileReader("d://a.properties"); ppt.load(r); System.out.println(ppt.getProperty("1")); System.out.println(ppt.getProperty("2")); System.out.println(ppt.getProperty("3"));

    十、try-with-resources

    //1.7时 try(FileReader fr = new FileReader("d://a.txt")){ int c = fr.read(); System.out.println((char)c); }catch (IOException e){ e.printStackTrace(); } //JDK9 FileReader fr = new FileReader("d://a.txt"); PrintWriter pw = new PrintWriter("d://a.txt"); try(fr;pw){ //用;间隔,()中的对象都实现了closeable或autocloseable方法 int c = fr.read(); System.out.println((char)c); }catch (IOException e){ e.printStackTrace(); }

     

    Processed: 0.044, SQL: 8