Java memory stream 内存流


内存流

  • 常用的内存流包括字节数组流 ByteArrayInputStream、字符数组流 CharArrayReader、字符串流 BufferedReader;

1. 字节数组流

  • 如果程序在运行的过程中要产生一些 临时文件,可以采用虚拟文件方式实现,JDK 中提供了 ByteArrayInputStream 和 ByteArrayOutputStream 两个类,可以实现类似于内存虚拟文件的功能;
  • 其中 ByteArrayInputStream 是输入流的一种实现,而 ByteArrayOutputStream 是输出流的一种实现;
  • java.io.ByteArrayInputStream,详见:Class ByteArrayInputStream;java.io.ByteArrayOutputStream,详见:Class ByteArrayOutputStream
  • ByteArrayInputStream 类的使用:
import java.io.InputStream;
import java.io.OutputStream;

public class Test {
    public static void main(String[] args) throws Exception {
        String tmp = "abc";
        byte[] src = tmp.getBytes();    // src为转换前的内存块
        ByteArrayInputStream input = new ByteArrayInputStream(src);
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        new Test().transform(input, output);
        byte[] result = output.toByteArray();    //result为转换后的内存块
        System.out.println(new String(result));
    }

    public void transform(InputStream in, OutputStream out) {
        int c = 0;
        try {
            while ((c = in.read()) != -1) {   //read在读到流的结尾处返回-1
                int C = (int) Character.toUpperCase((char) c);
                out.write(C);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
/*
输出
ABC
 */

2. 字符数组流

  • 字符数组流包括字符数组输入流 CharArrayReader 和字符数组输出流 CharArrayWriter,操作的数据都以字符为单位;
  • CharArrayReader 继承自 Reader 类,用于读取字符数组;而 CharArrayWriter 继承自 Writer 类,用于输出字符数组;
  • java.io.CharArrayReader,详见:Class CharArrayReader;java.io.CharArrayWriter,详见:Class CharArrayWriter
  • 字符数组的应用:
import java.io.CharArrayReader;
import java.io.IOException;

public class Test {
    private static final int LEN = 5;
    // 对应英文字母“abcdefghijklmnopqrstuvwxyz”
    private static final char[] ArrayLetters = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

    public static void main(String[] args) {
        tesCharArrayReader();
    }

    /**
     * CharArrayReader的API测试函数
     */
    private static void tesCharArrayReader() {
        try {
            // 创建CharArrayReader字符流,内容是ArrayLetters数组
            CharArrayReader car = new CharArrayReader(ArrayLetters);
            // 从字符数组流中读取5个字符
            for (int i = 0; i < LEN; i++) {
                // 若能继续读取下一个字符,则读取下一个字符
                if (car.ready() == true) {
                    // 读取“字符流的下一个字符”
                    char tmp = (char) car.read();
                    System.out.printf("%d : %c\n", i, tmp);
                }
            }
            // 若“该字符流”不支持标记功能,则直接退出
            if (!car.markSupported()) {
                System.out.println("mark not supported!");
                return;
            }
            // 标记“字符流中下一个被读取的位置”。即--标记“f”,因为因为前面已经读取了5个字符,所以下一个被读取的位置是第6个字符”
            // (01), CharArrayReader类的mark(0)函数中的“参数0”是没有实际意义的。
            // (02), mark()与reset()是配套的,reset()会将“字符流中下一个被读取的位置”重置为“mark()中所保存的位置”
            car.mark(0);
            // 跳过5个字符。跳过5个字符后,字符流中下一个被读取的值应该是“k”。
            car.skip(5);
            // 从字符流中读取5个数据。即读取“klmno”
            char[] buf = new char[LEN];
            car.read(buf, 0, LEN);
            System.out.printf("buf=%s\n", String.valueOf(buf));
            // 重置“字符流”:即,将“字符流中下一个被读取的位置”重置到“mark()所标记的位置”,即f。
            car.reset();
            // 从“重置后的字符流”中读取5个字符到buf中。即读取“fghij”
            car.read(buf, 0, LEN);
            System.out.printf("buf=%s\n", String.valueOf(buf));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
/*
输出
0 : a
1 : b
2 : c
3 : d
4 : e
buf=klmno
buf=fghij
 */

3. 字符串流

  • 字符串流包括字符串输入流 BufferedReader 和字符串输出流 BufferedWriter;
  • BufferedReader 类是 Reader 类的子类,使用该类可以以 为单位读取数据;
  • java.io.BufferedReader,Class BufferedReader
  • BufferedReader 类提供了 Reader 类没有的 ReaderLine() 方法,该方法可以读取文本行,使用如下:
import java.io.BufferedReader;
import java.io.FileReader;

public class Test {
    public static void main(String[] args) {
        FileReader fr;
        try{
            fr=new FileReader("C:\\Users\\80626\\Desktop\\1.txt");
            BufferedReader br = new BufferedReader(fr);
            String aline;
            while((aline=br.readLine())!=null){
                String s= new String(aline);
                System.out.println(s);
            }
            fr.close();
            br.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
/*
输出
wqeqw
dsfad
 */
  • BufferedWriter 类是 Writer 类的子类,使用该类可以以 为单位写出数据;
  • java.io.BufferedWriter,详见:Class BufferedWriter
  • BufferedWriter 类提供了 Writer 类没有的 newLine() 方法,该方法是换行标记,使用如下:
import java.io.BufferedWriter;
import java.io.FileWriter;

public class Test {
    public static void main(String[] args) {
        FileWriter fw;
        try {
            fw = new FileWriter("C:\\Users\\80626\\Desktop\\1.txt");
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write("line 1");
            bw.newLine();
            bw.write("line 2");
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
/*
输出

文件
line 1
line 2
 */

a. 综合应用

  • 创建两个 File 类对象;
  • 判断两个文件是否存在,不存在就新建该文件;
  • 将从一个文件中读取的数据复制到另一个文件中,最终使得两个文件内容相同;
import java.io.*;

public class Test {
    public static void main(String[] args) {
        try {
            FileReader fr;
            fr = new FileReader("C:\\Users\\80626\\Desktop\\1.txt");
            File file = new File("C:\\Users\\80626\\Desktop\\2.txt");
            //1.FileWriter读取文件
            FileWriter fos = new FileWriter(file);
            //2.BufferedReader初始化
            BufferedReader br = new BufferedReader(fr);
            //3.FileWriter赋值给BufferedWriter
            BufferedWriter bw = new BufferedWriter(fos);
            String str = null;
            while ((str = br.readLine()) != null) {
                bw.write(str);
                bw.newLine();//或直接在上面加"+\n"也可以
            }
            br.close();
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
/*
输出

文件1
line 1
line 2

文件2
line 1
line 2
 */
发布了242 篇原创文章 · 获赞 244 · 访问量 9604

猜你喜欢

转载自blog.csdn.net/Regino/article/details/104744612