zoukankan      html  css  js  c++  java
  • JavaIO——内存操作流、打印流

    我们之前所做的都是对文件进行IO处理,实则我们也可以对内存进行IO处理。我们将发生在内存中的IO处理称为内存流。

    内存操作流也可分为两类:字节内存流和字符内存流。

       

    (1)ByteArrayInputStream  和  ByteArrayOutputStream

    构造函数:

    public class ByteArrayOutputStream extends OutputStream

    public class ByteArrayInputStream extends InputStream

    (2)CharArrayInputStream  和  CharArrayOutputStream

    构造函数:

    public class CharArrayWriter extends Writer

    public class CharArrayReader extends Reader

    由此我们可以得出内存流的继承关系:




    利用内存流实现大小写转换:

    1. package myIO;
    2. import java.io.ByteArrayInputStream;
    3. import java.io.ByteArrayOutputStream;
    4. import java.io.IOException;
    5. import java.io.InputStream;
    6. import java.io.OutputStream;
    7. /*通过内存流实现大小写转换
    8. * */
    9. public class Test3 {
    10. public static void main(String[] args) throws IOException {
    11. String string = "hello world,hello lemon";
    12. //实例化InputStream对象,进行实例化时应将需要操作的数据保存在内存中,读取的将是设置的内容
    13. InputStream inputStream = new ByteArrayInputStream(string.getBytes());
    14. //实例化OutputStream对象
    15. OutputStream outputStream = new ByteArrayOutputStream();
    16. int temp= 0;
    17. //判断是否读完
    18. while((temp = inputStream.read())!=-1) {
    19. //对每个字节进行处理,处理之后存在于OutputStream类中
    20. //进行大小写转换
    21. outputStream.write(Character.toUpperCase(temp));
    22. }
    23. //直接对outputStream对象进行输出
    24. System.out.println(outputStream);
    25. //关闭流
    26. inputStream.close();
    27. outputStream.close();
    28. }
    29. }

              

    (2)内存流的操作

    内存流有个很小的功能就是实现两个文件的合并操作(对很小的文件而言)。

    内存流最核心的就是:将所有OutputStream输出的程序保存在了程序中,所以可以利用这一特征来进行处理。

    1. /*
    2. * 实现两个文件的合并处理
    3. * */
    4. public class Test3{
    5. public static void main(String[] args) throws IOException {
    6. String singal = File.separator;
    7. //指明要合并两个文件的地址
    8. File[] files = new File[] {
    9. new File("C:"+singal+"Users"+singal+"lenovo"+singal+"Desktop"+singal+"Test1.txt")
    10. ,new File("C:"+singal+"Users"+singal+"lenovo"+singal+"Desktop"+singal+"Test2.txt")};
    11. String[] data = new String[2];
    12. for(int i = 0 ;i <files.length;i++) {
    13. data[i] = readFile(files[i]);
    14. }
    15. StringBuffer stringBuffer = new StringBuffer();
    16. String contentA [] = data[0].split(" ") ;
    17. String contentB [] = data[1].split(" ") ;
    18. for (int i = 0; i < contentA.length ; i++) {
    19. stringBuffer.append(contentA[i]).append("(").append(contentB[i]).append(")").append(" ") ;
    20. }
    21. System.out.println(stringBuffer);
    22. }
    23. //读取文件内容,使用File对象因为其包含完整的路径信息
    24. public static String readFile(File file) throws IOException {
    25. if(file.exists()) {
    26. InputStream inputStream = new FileInputStream(file);
    27. //没有向上转型,因为后续要使用toByteArray()方法
    28. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    29. int temp = 0;
    30. byte[] data = new byte[10];
    31. while((temp = inputStream.read(data))!=-1) {
    32. //将数据保存在byteArrayOutputStream
    33. byteArrayOutputStream.write(data,0,temp);
    34. }
    35. byteArrayOutputStream.close();
    36. inputStream.close();
    37. return new String(byteArrayOutputStream.toByteArray());
    38. }
    39. return null;
    40. }
    41. }

                            

    2、打印流

    打印流的本质是解决OutputStream的缺陷,因为若想将非二进制的数据通过程序向终端目标直接输出信息的话,OutputStream有如下缺陷:所有的数据都要转换成字节数组,若要输出intdouble更是不方便。

    (1)进行简单打印流的设计

    1. /*
    2. * 设计简单打印流
    3. * */
    4. class PrintDesign{
    5. private OutputStream outputStream;
    6. //构造函数
    7. //有外部传入要输出的目的终端
    8. public PrintDesign(OutputStream outputStream) {
    9. super();
    10. this.outputStream = outputStream;
    11. }
    12. //实现输出的功能(传入参数为字符串)
    13. public void print(String string) throws IOException {
    14. this.outputStream.write(string.getBytes());
    15. }
    16. //实现换行功能
    17. public void println(String string) throws IOException {
    18. this.print(string+" ");
    19. }
    20. //传入参数为int
    21. public void print(int data) throws IOException {
    22. this.print(String.valueOf(data));
    23. }
    24. public void println(int data) throws IOException {
    25. this.print(String.valueOf(data)+" ");
    26. }
    27. }
    28. public class Test3{
    29. public static void main(String[] args) throws IOException {
    30. String singal = File.separator;
    31. PrintDesign printDesign = new PrintDesign(new FileOutputStream(
    32. new File("C:"+singal+"Users"+singal+"lenovo"+singal+"Desktop"+singal+"Test1.txt")));
    33. printDesign.println("姓名:");
    34. printDesign.print("lemon");
    35. printDesign.println("年龄:");
    36. printDesign.print(20);
    37. }
    38. }

                                     

    我们可以发现经过简单的处理使得OutputStream的功能变得更加强大了,其实我们所做的工作只不过是对OutputStream做了一个封装而已。实则java中提供有专门的打印流处理类:字节打印流rintStream、字符打印流PrintWriter.

    (2)认识打印流处理类

    字节打印流:public class PrintStream extends FilterOutputStream

        构造函数:public PrintStream(OutputStream out)

    字符打印流:public class PrintWriter extends Writer

        构造函数:public PrintWriter(OutputStream out)

                  public PrintWriter (Writer out)

              

    打印流的设计模式属于装饰者设计模式:核心是某个类的功能,但是为了得到更好的操作效果,让其支持的功能更多一些。

    (3)打印流的使用

    在后续的应用中字符打印流(PrintWriter)引用比较对,因为它可以接收WriterOutputStream两种类型的参数;而字节打印流(PrintStream)只可接收OutputStream类型的参数。

    1. /*
    2. * 字符打印流的使用
    3. * */
    4. public class Test3{
    5. public static void main(String[] args) throws FileNotFoundException {
    6. String singal = File.separator;
    7. PrintWriter printWriter = new PrintWriter(
    8. new File("C:"+singal+"Users"+singal+"lenovo"+singal+"Desktop"+singal+"Test1.txt"));
    9. printWriter.print("班级:");
    10. printWriter.println("数学152");
    11. printWriter.println("年龄:");
    12. printWriter.println(20);
    13. printWriter.close();
    14. }
    15. }

                                  

    (4)格式化输出

    我们在C语言遇到一个printf()函数,这个函数在输出的时候可以使用一些占位符,例如:字符串(%s)、数字(%d)、小数 (%f)、字符(%c)等。从JDK1.5开始,PrintStream类中也追加了此种操作。

    格式化输出:public PrintStream printf(String format, Object ... args)

    1. /*
    2. * 格式化输出
    3. * */
    4. public class Test3{
    5. public static void main(String[] args) throws FileNotFoundException {
    6. String name = "lemon";
    7. int age = 20;
    8. double salary = 10.3;
    9. String singal = File.separator;
    10. PrintStream printStream = new PrintStream(new FileOutputStream(
    11. new File("C:"+singal+"Users"+singal+"lenovo"+singal+"Desktop"+singal+"Test2.txt")));
    12. printStream.printf("姓名:%s,年龄:%d,工资:%f",name,age,salary);
    13. printStream.close();
    14. }
    15. }
                               




  • 相关阅读:
    一个表缺失索引发的CPU资源瓶颈案例
    SQLServer 版本之八大方法搞清 "我是谁"
    DBA成长路线
    SQL Server2016升级前几点自检
    SQL Server 2016白皮书
    <译>通过PowerShell工具跨多台服务器执行SQL脚本
    /lib64/libc.so.6: version `GLIBC_2.17' not found
    /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
    HGT高程数据文件格式解析
    DEM高程数据下载资源
  • 原文地址:https://www.cnblogs.com/edda/p/12597978.html
Copyright © 2011-2022 走看看