Java I/O流操作基础

简介: Java I/O流操作基础

一  流的基本概念

 一个流(Stream)是一个有序的字节序列。当进行输入和输出数据操作时,数据从信息源流向目的地。流中的字节具有严格的顺序,按先进先出的要求操作。因此流式输入/输出(流式I/O)是一种顺序存取方式。

Java中的流式I/O类都在java.io包中。有各种不同的流类来满足不同性质的输入/输出需求。

按数据流向分为:输入/输出

按操作方法分为:字节(0/1)/字符流

字符流:Reader(抽象类) : (实现类)FileReader(普通输入)  BufferedReader(高效输入)(缓冲)

              Writer : FileWriter(普通输出)  BufferedWriter(高效输出)

字节流:InputStream: FileInputStream(普通输入)  BufferedInputStream(高效输入)

             OutputStream:FileOutputStream(普通输出)  BufferedOutnputStream(高效输出)

二  File  文件或文件夹

构造方法:

File(String pathname) //根据字符串形式的路径
File(String parent , String child) // 根据父目录与子目录
Flie(File parent , String child) //父目录是file的对象

成员方法:

创建功能://如果不存在,就创建返回true,否则就不创建,返回false
creatNewFile();  //创建文件  使用时需要注意异常:路径可能错误  可用throws在方法名后抛出异常
mkdir 或 mkdirs();  //创建目录(文件夹)mkdir : make directory的缩写
//mkdir 创建单级目录  //mkdirs  创建多级目录(也可以单级目录)
判断功能:
isDirectory();  //判断File对象是否为目录(文件夹)
isFile();  //判断file对象是否为文件
exists();  //判断file对象是否存在的
获取功能:
getAbsolutePath();  //获取绝对路径  绝对路径:以盘符开头的路径是固定死的  例如:D:/1.txt
getPath();  //获取相对路径  相对路径:一般指相对于当前项目的路径  例如 1.txt
getName();  //获取文件名
list();  //获取指定目录下所有文件(夹)名称数组
listFiles();  //获取指定目录下所有文件(夹)file数组
注意:  list() 的返回值是  String[] 字符串数组  在输出时需要使用for
    例:String[] name = file2.list();
        for(String names: name){
            System.out.println(names);
        } 
        listFiles()的返回值是  file[] File数组  相当于返回了File对象 即可调用file方法
    例:File[] files = file2.listFiles();
        for (File file : files) {
            System.out.println(file);
        }

注意:

  1. 盘符不区分大小写。
  2. Java中的 " \ "有特殊作用(被称为转义字符:转义后面一个字符所以在写路径时要写        “  \\ "  或是 “ / ”。

三  字符流读写文件

字符流读数据--按单个字符读取

创建字符流读文件对象:
   Reader  reader = new FileReader("文件路径"); //Reader为抽象类 不能实例化
调用方法读取数据:
   int date = reader.read();  //读取一个字符返回该字符代表的整数,若是达到末尾则返回 -1
异常处理:
   throws IOExpection //也可try catch
关闭资源:
   reader.close(); 
使用while简化
        int a = reader.read();
        while (a != -1){
            System.out.println(a);
            a = reader.read();  //输出的是Unicode码值
        }
注意:reader 每读取一次字符,指针向后移动一位。所以一次while里面只能读一次。

字符流读数据--按字符数组读取

创建字符流读文件对象:
    Reader reader = new FileReader("文件路径");
调用方法读取数据
    char[] a = new a[];
    int len = reader.read(a); //读取字符到数组中,返回读取的有效字符数,读不到有效则返回-1
异常处理:
    throws IOException
关闭资源:
    reader.close();
使用while 简化代码:
        char[] a = new char[1];
        while ((reader.read(a) != -1)){
            System.out.print(a);
        }
可得到全部文本

字符流写数据--按单个字符写入

创建字符流写文件对象:
    Writer writer = new FileWriter("路径");
调用方法写入数据:
    char x = '中';
    writer.write(x);
异常处理:
    throws IOException;
关闭资源:
    writer.close();

字符流写数据--按字符数组写入

创建字符流写文件对象:
    Writer writer = new FileWriter("路径");
调用方法写入数据:
    char[] chs = {'中' , '国' ,‘好’};
    writer.write(chs);
异常处理:
    throws IOException;
关闭资源:
    writer.close();

字符流写数据--按字符串写入

创建字符流写文件对象:
    Writer writer = new FileWriter("路径");
调用方法写入数据:
    String s = "  "
    writer.write(s);
异常处理: 
    throws IOException;
关闭资源:
    writer.close();

注意:使用新对象写入文件后会将原文件内容覆盖

若想要内容不被覆盖,在构造函数时 : Writer writer = new FileWriter("路径" ,  true); 可实现文件追加,因为默认是false会覆盖

字符流拷贝文件--按单个字符写入

先创建字符流读文件对象:
    Reader reader = new FileReader("数据源文件的路径");
再创建字符流写文件对象:
    Writer writer = new FileWriter(“目的地文件的路径”);
调用方法读取文件:
    int date = reader.read();
调用方法写文件:
    writer.write("date"); //需要while循环   
        int len = reader.read();
        while (len != -1){
            writer.write(len);
            len = reader.read();
        }
异常类处理:
    throws IOExpection;
关闭资源:
    reader.close();
    writer.close();
核心6步:
1 创建输入流对象,关联数据源文件。
2 创建输出流对象,关联目的地文件。
3 定义变量,记录读取到的内容。
4 循环读取,只要条件满足,就一直读,并将读取到的内容赋值给变量。
5 将读取到的内容,写入目的地文件。
6 资源释放。
注意:当目的地文件不存在时可自动创建。

字符流拷贝文件--按字符数组写入

先创建字符流读文件对象:
    Reader reader = new FileReader("数据源文件的路径");
再创建字符流写文件对象:
    Writer writer = new FiLeWriter(“目的地文件的路径”);
调用方法读取文件:
    char[] chs = new char[2048]; //长度定义为1024的整数倍
调用方法写文件:
    int len;
    while(len = reader.read(chs) != -1){
        writer.write(chs , 0 , len);
    }
异常类处理:
    throws IOExpection;
关闭资源:
    reader.close();
    writer.close();

四  字符缓冲流读写文件

字符缓冲流拷贝文件的标准代码

先创建字符流读文件对象:
    Reader reader = new BufferedReader(new FileReader(“数据源文件的路径”));
再创建字符流写文件对象:
    Writer writer = new BufferedWriter(new FileWriter(“目的地文件的路径”));
调用方法读取文件:
调用方法写文件:
        int len = reader.read();
        while (len != -1){
            writer.write(len);
            len = reader.read();
        }
异常类处理:
    throws IOExpection;
关闭资源:
    reader.close();
    writer.close();
注意:字符缓冲区的大小为16KB,底层按照字符数组读写

字符缓冲流拷贝文件的独有方法:一次读一行

BufferReader:
成员方法: public String readLine(); //一次读取一行并返回读取内容,读不到就返回null
BufferWriter:
成员方法: public void newLine(); //根据当前操作系统给出对应的换行符
        //使用BufferedReader声明,调用其特有方法
        BufferedReader br = new BufferedReader(new FileReader("lib/1.txt"));                     
        BufferedWriter bw = new BufferedWriter(new FileWriter("lib/3.txt"));
        String s;
        while ((s = br.readLine()) != null){
            bw.write(s);
            bw.newLine();
        }
        br.close();
        bw.close();

注意:字符流只能拷贝纯文本文件 txt

五  字节流读写文件:

字节流拷贝文件--按单个字节读写:

创建字节流读文件对象:
   InputStream  is = new FileInputStream("文件源路径"); //InputStream为抽象类 不能实例化
创建字节流写文件对象:
   OutputStream os = new FileOutputStream("目的地路径");
异常处理:
   throws IOExpection 
使用while循环读写数据
        int a;
        while ((a = is.read()) != -1){
            os.write();
        }
关闭资源:
    is.close();
    os.close();
注意:reader 每读取一次字节,指针向后移动一位。所以一次while里面只能读一次。

字节流拷贝文件--按字节数组读写:

创建字节流读文件对象:
   InputStream  is = new FileInputStream("文件源路径"); //InputStream为抽象类 不能实例化
创建字节流写文件对象:
   OutputStream os = new FileOutputStream("目的地路径");
异常处理:
   throws IOExpection 
定义字节数组:
   byte[] b = new byte[1024];
使用while循环读写数据
        int len;
        while ((len = is.read(b)) != -1){
            os.write(b , 0 ,len);
        }
关闭资源:
    is.close();
    os.close();

六  字节缓冲流读写文件

创建字节流读文件对象:
   BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件源"));
创建字节流写文件对象:
   BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("目的地"));
异常处理:
   throws IOExpection 
使用while循环读写数据
        int a;
        while ((a = bis.read()) != -1){
            bos.write(a);
        }
关闭资源:
    bis.close();
    bos.close();
字节缓冲区大小为8kb,底层按照字节数组读写

总结:拷贝文件txt使用字符流,其他(图片,音频,视频)使用字节流


目录
相关文章
|
2天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
24天前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
57 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
5月前
|
存储 缓存 Java
Java中的缓冲流提升I/O性能,通过内存缓冲区减少对硬件访问
【6月更文挑战第22天】Java中的缓冲流提升I/O性能,通过内存缓冲区减少对硬件访问。`BufferedInputStream`和`BufferedOutputStream`用于字节流,缓存数据批量读写。`BufferedReader`和`BufferedWriter`处理字符流,支持按行操作。使用后务必关闭流。
62 3
|
5月前
|
Java
【Java基础】输入输出流(IO流)
Java基础、输入输出流、IO流、流的概念、输入输出流的类层次结构图、使用 InputStream 和 OutputStream流类、使用 Reader 和 Writer 流类
162 2
|
6月前
|
存储 监控 Java
深入探索Java语言的NIO(New I/O)技术
深入探索Java语言的NIO(New I/O)技术
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
4月前
|
存储 缓存 Oracle
可能是最漂亮的Java I/O流详解
大家有什么思路吗?评论区一起讨论讨论。我需要使用 Java 逐行读取大约 5-6 GB 的大型文本文件。我怎样才能快速完成此操作?最高赞的回答是叫Peter Lawrey的老哥回答的。大家好,我是南哥。一个Java学习与进阶的领路人,今天指南的是Java I/O流,跟着南哥我们一起在Java之路上成长。本文收录在我开源的《Java学习进阶指南》中,涵盖了想要学习Java、成为更好的Java选手都在偷偷看的核心知识、面试重点。
121 1
可能是最漂亮的Java I/O流详解
|
4月前
|
Java Linux
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
|
4月前
|
Java API 开发者
Java中的文件I/O操作详解
Java中的文件I/O操作详解
|
5月前
|
安全 Java