栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java IO流

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java IO流

IO流

流的分类:

  • 文件流:FileInputStream / FileOutputStream / FileReader / FileWriter
  • 缓冲流:BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter
File类
  • java.io.File类:文件和目录路径名的抽象表示形式,与平台无关。
  • File能新建、删除、重命名文件和目录,但File不能访问文件本身内容。如果需要访问文件内容本身,则需要使用输入/输出流。
  • File对象可以作为参数传递给流的构造函数。

File类的常见构造方法:

  1. public File(String pathname): 以pathname为路径创建File对象,可以使绝对路径或相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
  2. public File(String parent,String child): 以parent为父路径,child为子路径创建File对象。

File的静态属性String separator存储了当前系统的路径分隔符,在UNIX中,此字段为‘/’,在Windows中,为‘’。

  • 访问文件名
    • getName()
    • getPath()
    • getAbsoluteFile()
    • getAbsolutePath()
    • getParent()
    • renameTo(File newName)
  • 文件检测:
    • exists()
    • canWrite()
    • canRead()
    • isFile()
    • isDirectory()
  • 获取常规文件信息
    • lastModify()
    • Length()
  • 文件操作相关
    • createNewFile()
    • delete()
  • 目录操作相关
    • mkDir()
    • list()
    • listFiles()
Java IO原理

IO流用来处理设备之间的数据传输。Java程序中,对于数据的输入/输出操作以“流(stream)”的方式进行。java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

流的分类
  • 按操作数据单位不同分为:字节流(8bit),字符流(16bit)
  • 按数据流的流向不同分为:输入流,输出流
  • 按流的角色的不同分为:节点流,处理流

Java的IO流共涉及40多个子类,实际上非常规则,都是从如下4个抽象基类派生的。由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

(抽象基类)字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter
分类字节输入流字节输出流字符输入流字符输出流
抽象基类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderFileWriter
访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
访问管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
访问字符串StringReaderStringWriter
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamWriter
对象流ObjectInputStreamObjectOutputStream
FilterInputStreamFilterOutputStreamFilterReaderFilterWriter
打印流PrintStreamPrintWriter
推回输入流PushbackInputStreamPushbackReader
特殊流DataInputStreamDataOutputStream
文件字节输入流
package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class StreamTest1 {
    public static void main(String[] args) {
//        try{
//            FileInputStream in=new FileInputStream("C:\Users\Administrator\documents\JavaSE\test\abc\test1.txt");
//            byte[] b=new byte[10];  //设置一个byte数组,接收读取的文件的内容
//
//            int len=0; //设置一个读取数据的长度
//
//            //in.read(b); //in.read()方法的返回值是读取数据的长度,如果读取到最后一个数据,还会向后读一个,此时返回值为-1
//            //即当in.read()返回值为-1时,文件读取完毕
//            while ((len=in.read(b))!=-1){
//                System.out.println(new String(b,0,len));
//            }
//            System.out.println(new String(b));
//            in.close();  //注意,流在使用完毕后一定要关掉
//        }catch (Exception e){
//            e.printStackTrace();
//        }
        //testFileOutputStream();
        String in = "C:\Users\Administrator\documents\JavaSE\test\abc\ubuntu-18.04.5-live-server-amd64.iso";
        String out = "C:\Users\Administrator\documents\JavaSE\test\abc\cc\ubuntu-18.04.5-live-server-amd64-copy.iso";
        copyFile(in, out);

    }

    
    public static void testFileOutputStream(){
        try {
            FileOutputStream out=new FileOutputStream("C:\Users\Administrator\documents\JavaSE\test\abc\test2.txt");
            String str="hello java!";
            out.write(str.getBytes()); //把数据写到内存
            out.flush();  //把内存中的数据写到硬盘
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void copyFile(String inPath, String outPath){
        try {
            //FileInputStream in = new FileInputStream("C:\Users\Administrator\documents\JavaSE\test\abc\test1.txt");
            //FileOutputStream out = new FileOutputStream("C:\Users\Administrator\documents\JavaSE\test\abc\test2.txt");
            FileInputStream in = new FileInputStream(inPath);
            FileOutputStream out = new FileOutputStream(outPath);
            byte[] b = new byte[100000];
            int len = 0;
            while (((len = in.read(b)) != -1)){
                out.write(b,0, len);  //参数1是写的缓冲数组,参数2是从数组的哪个位置开始,参数3是写的长度
            }
            out.flush();
            out.close();
            in.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
文件字符输入流

读取文件操作步骤:

  1. 建立一个流对象,将已存在的一个文件加载进流。
    FileReader fr = new FileReader("Test.txt");
  2. 创建一个临时存放数据的数组。
    char[] ch = new char[1024];
  3. 调用流对象的读取方法将流中的数据读入到数组中。
    fr.read(ch)
package io;


import java.io.*;

public class FileReaderTest {
    public static void main(String[] args) {
        String path = "C:\Users\Administrator\documents\JavaSE\test\abc\test1.txt";
        testFileReader(path);

        testFileWriter("Hello Java!","C:\Users\Administrator\documents\JavaSE\test\abc\cc\test5.txt");

        copyFile("C:\Users\Administrator\documents\JavaSE\test\abc\cc\test5.txt",
                "C:\Users\Administrator\documents\JavaSE\test\abc\cc\dd\test6.txt");
    }

    
    public static void testFileReader(String inPath){
        try {
            FileReader fr=new FileReader(inPath);  //创建文件字符输入流的对象
            char[] c = new char[10]; //创建临时存放数据的字符数组

            int len = 0;

            while ((len = fr.read(c)) != -1){
                System.out.println(new String(c,0,len));
            }
            fr.close();  //关闭流

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    
    public static void testFileWriter(String text, String outPath){
        try {
            FileWriter fw = new FileWriter(outPath);
            fw.write(text); //写到内存中
            fw.flush(); //写到硬盘中
            fw.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    
    public static void copyFile(String inPath, String outPath){
        try {
            FileReader fr = new FileReader(inPath);
            FileWriter fw = new FileWriter(outPath);

            char[] c = new char[100];
            int len=0;
            while ((len = fr.read(c)) != -1){  //读取数据
                fw.write(c,0,len);  //写入数据
            }
            fw.flush();
            fw.close();
            fr.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
缓冲流

为了提高数据读写的速度,Java API内部提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组。
根据数据操作单位可以把缓冲流分为:

  • BufferedInputStream 和 BufferedOutputStream
  • BufferedReader 和 BufferedWriter

缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。

对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()将会使内存中的数据立刻写出。

FileInputStream,FileOutputStream与FileReader,FileWriter都是计算机与硬盘之间的IO操作,基于硬盘的读写相对比较慢,这个操作的速度受到硬盘的读写速度制约,为了能提高读写速度,一定程度上绕过硬盘的限制,Java提供了一种缓冲流来实现。

缓冲流就是先把数据缓冲到内存里,在内存中去做IO操作,基于内存的IO操作要比基于硬盘的IO操作快非常多。

缓冲字节流
package io.buffered;

import java.io.*;

public class BufferedTest {
    public static void main(String[] args) {
        try {
            //testBufferedInputStream();
            testBufferOutputStream();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    
    public static void testBufferedInputStream() throws Exception {
        //文件字节输入流对象
        FileInputStream in =new FileInputStream("C:\Users\Administrator\documents\JavaSE\基础语法\src\io\buffered\tt.txt");

        //把文件字节输入流放入缓冲字节输入流对象
        BufferedInputStream br = new BufferedInputStream(in);

        byte[] b= new byte[100];

        int len = 0;
        while ((len = br.read(b)) != -1){
            System.out.println(new String(b,0,len));
        }
        br.close();
        in.close();
    }

    
    public static void testBufferOutputStream(){
        try {
            //创建字节输出流对象
            FileOutputStream out = new FileOutputStream("C:\Users\Administrator\documents\JavaSE\基础语法\src\io\buffered\tt1.txt");

            //把字节输出流对象放到缓冲字节输出流中
            BufferedOutputStream bo = new BufferedOutputStream(out);

            copyFile();

            String s="Hello Java!";

            bo.write(s.getBytes()); //写到内存里
            bo.flush();  //写到硬盘里、

            bo.close();
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    
    public static void copyFile() throws Exception {
        //缓冲输入流
        BufferedInputStream br=new BufferedInputStream(new FileInputStream("C:\Users\Administrator\documents\JavaSE\test\abc\test1.txt"));

        //缓冲输出流
        BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream("C:\Users\Administrator\documents\JavaSE\test\abc\test2.txt"));

        byte[] b = new byte[1024];

        int len = 0;  //设置一个每次读取到的数据的长度

        while ((len = br.read(b)) != -1){
            bo.write(b,0,len);  //写到内存中
        }
        bo.flush(); //写到硬盘中
        bo.close();
        br.close();
    }
}
缓冲字符流
package io.buffered;

import java.io.*;


public class BufferedReaderTest {
    public static void main(String[] args) {
        try {
            //testBufferedReader();
            //testBufferedWriter();
            copyFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    
    public static void testBufferedReader() throws Exception {
        FileReader r = new FileReader("C:\Users\Administrator\documents\JavaSE\基础语法\src\io\buffered\tt2.txt");
        BufferedReader br = new BufferedReader(r);
        char [] c = new char[100];
        int len=0;
        while ((len = br.read(c)) != -1){
            System.out.println(new String(c,0,len));
        }
        br.close();
        r.close();
    }

    
    public static void testBufferedWriter() throws Exception{
        FileWriter fw= new FileWriter("C:\Users\Administrator\documents\JavaSE\基础语法\src\io\buffered\tt3.txt");
        BufferedWriter bw= new BufferedWriter(fw);
        String s = "Hello,I'm Alex.";
        bw.write(s);
        bw.flush();
        bw.close();
        fw.close();
    }

    
    public static void copyFile() throws Exception{
        BufferedReader br=new BufferedReader(new FileReader("C:\Users\Administrator\documents\JavaSE\基础语法\src\io\buffered\tt3.txt"));
        BufferedWriter bw=new BufferedWriter(new FileWriter("C:\Users\Administrator\documents\JavaSE\基础语法\src\io\buffered\tt4.txt"));
        char [] c=new char[100];
        int len=0;
        while ((len=br.read(c))!=-1){
            bw.write(c,0,len);
        }
        bw.flush();
        bw.close();
        br.close();
    }
}

注意:缓冲流是把数据缓冲到内存中。

转换流

转换流提供了在字节流和字符流之间的转换。
Java API提供了两个转换流:InputStreamReader和OutputStreamWriter

字节中的数据都是字符时,转换成字符流更高效。

InputStreamReader用于将字节流中读取到的字节按指定字符集解码成字符。需要和InputStream“套接”。

构造方法:

InputStreamReader(InputStream in)

public InputStreamReader(InputStream in, String charsetName)

如:Reader isr= new InputStreamReader(System.in, "ISO5334_1");

所有的文件都有编码格式,一般来说,TXT和java文件有三种编码:

  • ISO8859-1,西欧编码,是纯粹英文编码,不适用于汉字
  • GBK和UTF-8,这两种编码适用于中文和英文

一般使用UTF-8编码

package io.buffered;

import java.io.*;

public class TransferTest {
    public static void main(String[] args) {
        try {
            //testInputStreamReader();
            testOutputStreamWriter();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    
    public static void testInputStreamReader() throws Exception {
        FileInputStream fs = new FileInputStream("C:\Users\Administrator\documents\JavaSE\基础语法\src\io\buffered\test.txt");

        //把字节流转换为字符流
        InputStreamReader in= new InputStreamReader(fs,"UTF-8"); //参数1是字节流,参数2是编码

        char[] c = new char[100];
        int len=0;
        while ((len = in.read(c))!=-1){
            System.out.println(new String(c,0,len));
        }
        in.close();
        fs.close();
    }

    
    public static void testOutputStreamWriter() throws Exception{
        FileOutputStream out=new FileOutputStream("C:\Users\Administrator\documents\JavaSE\基础语法\src\io\buffered\fotest.txt");
        OutputStreamWriter os = new OutputStreamWriter(out,"UTF-8");
        os.write("你好呀");
        os.flush();
        os.close();
        out.close();
    }

}
标准输入输出流
  • System.in和System.out分别代表了系统标准的输入和输出设备。
  • 默认输入设备是键盘,输出设备是显示器。
  • System.in的类型是InputStream
  • System.out的类型是PrintStream,是OutputStream的子类FilterOutputStream的子类
package io.buffered;

import java.io.*;

public class TestIOStream {
    public static void main(String[] args) {
        try {
            //testSystemInput();
            writeToTXT();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void testSystemInput() throws IOException {
        //创建一个接收键盘输入数据的输入流
        InputStreamReader is = new InputStreamReader(System.in);

        //把输入流放到缓冲流里
        BufferedReader br= new BufferedReader(is);

        String str="";  //定义一个临时接收数据的字符串
        while ((str=br.readLine())!=null){
            System.out.println(str);
        }
        br.close();
        is.close();
    }

    
    public static void writeToTXT() throws IOException {
        //创建一个接收键盘输入数据的输入流
        InputStreamReader is = new InputStreamReader(System.in);
        BufferedWriter out = new BufferedWriter(new FileWriter("C:\Users\Administrator\documents\JavaSE\基础语法\src\io\buffered\tt2.txt"));
        //把输入流放到缓冲流里
        BufferedReader br= new BufferedReader(is);
        String line="";  //定义一个临时接收数据的字符串
        while ((line=br.readLine()) != null){
            if(line.equals("over")){
                break;
            }
            //读取的每一行都写到指定的TXT文件
            out.write(line);
        }
        out.flush();
        out.close();
        br.close();
        is.close();
    }
    
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/462197.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号