Java I/O流详解与应用(二)

I/O流(二)

一.缓冲流(缓冲区):

特点:本身没有读写的能力,需要借助普通的读写流进行读写,但可以加快读写的效率

分类:字符缓冲流:BufferedReader(读),BufferedWriter(写)

字节缓冲流:BufferedInputStream(读),BufferedOutputStream(写)

字符缓冲流代码实现文件读写:

public class Test {

    public static void main(String[] args) throws IOException {
       BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\Downloads\\workSpaceCJY\\WorkDemoIO\\c.txt"));
       BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("j.txt")); 

       String num=null;
       while((num = bufferedReader.readLine())!=null) {//缓冲流特有方法,一次读一行
           System.out.println(num);
           bufferedWriter.write(num);
           bufferedWriter.newLine();//缓冲流特有换行方式
           bufferedWriter.flush();
       }
       bufferedReader.close();
       bufferedWriter.close();
    }

}

字节缓冲流

public class Test {

    public static void main(String[] args) throws IOException {
       BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("D:\\Downloads\\workSpaceCJY\\WorkDemoIO\\c.txt"));
       BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("j.txt")); 

       int num=0;
       byte[]arr=new byte[10];
       while((num = bufferedInputStream.read(arr))!=-1) {
           System.out.println(new String(arr,0,num));
           bufferedOutputStream.write(arr);

           bufferedOutputStream.flush();
       }
       bufferedInputStream.close();
       bufferedOutputStream.close();
    }

}

LineNumberReader(父类是BufferedReader):可以设置行号

       LineNumberReader lineNumberReader = new LineNumberReader(new FileReader("D:\\Downloads\\workSpaceCJY\\WorkDemoIO\\c.txt"));
       lineNumberReader.setLineNumber(0);

       int num = 0 ;
       char[]arr = new char[10];
       while((num=lineNumberReader.read(arr))!=-1) {
           System.out.println(new String(arr,0,num));
       }

二. 标准输入流:默认是将数据从控制台写入内存,接收的是键盘敲入的数据

标准输出流:默认是将数据从内存写入控制台

//实例:从键盘不断的接收,一次接收一行

public static void main(String[] args) throws IOException {
        InputStream in = System.in;// 这里可以直接得到标准输入流的对象,并与键盘绑定,可以直接从键盘接收数据,标准输入流是字节流
        // int num = in.read();//称为阻塞式的方法 特点是一直等待用户输入

        StringBuffer buffer = new StringBuffer();
        while (true) {
            int num = in.read();// 读一个字节

            if (num == ‘\r‘) {
                continue;
            } else if (num == ‘\n‘) {
                // over字符串作为停止的表示
                if (buffer.toString().equals("over")) {
                    break;
                }
                System.out.println(buffer.toString());
                // 清空
                buffer.delete(0, buffer.length());
            } else {
                buffer.append(num);
            }

        }

    }

三.转化流:

作用:将字节流转化成字符流

分类:输入转化流:InputStreamReader

输出转化流:OutputStreamWriter

public static void main(String[] args) throws IOException {
        // 分析:刚才实现的功能类似于BufferedReader里面的readLine(),现在的标准输入流是字节流,要想使用readLine(),就将字节流转换成字符流

        //  1.获取标准输入流
        // InputStream in = System.in;
        //  2.通过转化流,转成字符流
        // InputStreamReader is = new InputStreamReader(in);
        //  3.得到缓冲流
        // BufferedReader br = new BufferedReader(is);

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //  4.获取标准输出流 PrintStream:打印流,是输出标准的一种
        // PrintStream pr = System.out;
        //  5.通过转化流,转成字符流
        // OutputStreamWriter osw = new OutputStreamWriter(pr);
        //  6.得到字符缓冲写出流
        // BufferedWriter bw = new BufferedWriter(osw);

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 7.进行读写(读一行,写一行)
        String data = null;
        while ((data = br.readLine()) != null) {
            bw.write(data);
            bw.newLine();// 换行
            bw.flush();// 因为没执行到close所以单独加个刷新

            // 将over字符串作为结束的标记
            if (data.equals("over")) {
                break;
            }
        }

        br.close();
        bw.close();

    }

四.打印流

特点:除了拥有流的特点之外,还有打印的功能

分类:字节打印流:PrintStream(直接支持的设备:File类型的文件,字符串类型的文件,字节输出流)

字符打印流:PrintWriter(直接支持的设备:File类型的文件,字符串类型的文件,字节输出流,字符输出流)

//File类型的文件
// new PrintStream(new File("D\\下载\\AV\\H.txt"));
//字符串类型
//new PrintStream("D.txt");
//字节输出流
//new PrintStream(FileOutputStream("H.txt"));

PrintStream p = new PrintStream("C.txt");
p.write(97);
p.write(353);
p.write(String.valueOf(353).getBytes());
p.close

//1.File类型的文件
//new PrintWriter(new File(""));
//2.字符串类型的文件
//new PrintWriter("temp1.txt");
//3.字节输出流
//new PrintWriter(new FileOutputStream("temp1.txt"));
//4.字符输出流
//new PrintWriter(new FileWriter("temp1.txt"));

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

PrintWriter printWriter = new PrintWriter(System.out);

String data = null;
while ((data = bufferedReader.readLine()) != null) {
            printWriter.write(data);
            printWriter.write("\r\n");
            printWriter.flush();
        }
bufferedReader.close();
printWriter.close();

五.序列化流和反序列化流

序列化流:将数据从内存存储到磁盘中的过程,数据可以长久的保存

反序列化流:将数据从磁盘取出,放入内存的过程

序列化的作用:主要是实现数据的长久存储(数据持久化)

实现序列化的流:ObjectOutputStream

实现反序列化的流:ObjectInputStream

注意:序列化流和反序列化流都要通过对应的流实现读写

public class Test1 {

    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {

        // 完成序列化-写出
        // writeFile();
        // 完成序列化-读入
        readFile();
    }

    public static void writeFile() throws FileNotFoundException, IOException {
        // 创建序列化流对象并关联对象流
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ObjectFile"));
        // objectOutputStream.writeInt(4);
        // 调用方法实现序列化:序列化的内容不能直接查看(中文乱码),要想查看内容必须进行反序列化
        objectOutputStream.writeObject(new Person("bingbing", 11));
        // 关闭流
        objectOutputStream.close();

    }

    public static void readFile() throws FileNotFoundException, IOException, ClassNotFoundException {

        // 创建反序列化流对象并关联对象流
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("ObjectFile"));
        Object object = inputStream.readObject();
        System.out.println(object);
        inputStream.close();
    }

}

六.随机流

定义:随机流又叫随机访问流,不属于IO体系,只能操作文件,内部既有字节输入流,也有字节输出流(同一个对象)

原理:在随机流内部有一个大的字节数组,可以通过指针进行操控,当我们进行随机访问时,让指针指向对应的字节,就可以从当前字节开始读或写

//随机流
public class Test {
    public static void main(String[] args) throws IOException {
        // 写
        // writeFile();
        // 读
        readFile();
    }

    // 写
    public static void writeFile() throws IOException {
        // 1.创建随机访问流对象并关联文件
        RandomAccessFile accessFile = new RandomAccessFile("data.txt", "rw");// mode指定当前对象的可操作模式:read只读,write只写,readwrite读写

        // 验证读
        // byte[]arr = new byte[50];
        // accessFile.read(arr);
        // System.out.println(new String(arr));

        // 2.写
        accessFile.write("bingbing".getBytes());// 8个字节
        accessFile.writeInt(97);// 4个字节
        accessFile.write(97);// 1个字节

        // 获取当前的所有字节数(获取当前文件指针的位置)
        System.out.println(accessFile.getFilePointer());// 13
        // 要求:从第十六个字节开始写内容:seek(16);参数代表当前指针指向的位置(默认指向文件的最后一个字节)
        accessFile.seek(16);
        accessFile.write(100);// 4个字节
        System.out.println(accessFile.getFilePointer());// 17

        accessFile.close();

    }

    // 读
    public static void readFile() throws IOException {
        RandomAccessFile accessFile = new RandomAccessFile("data.txt", "rw");

        // 要求只读bingbing,指针指向了15
        accessFile.seek(15);
        // 验证读
        byte[] arr = new byte[50];
        accessFile.read(arr);
        System.out.println(new String(arr));

        accessFile.close();
    }
}

原文地址:https://www.cnblogs.com/FORCASH/p/9089321.html

时间: 2024-10-07 21:38:25

Java I/O流详解与应用(二)的相关文章

10.4-全栈Java笔记:常用流详解(二)

上节我们讲到「Java中常用流:文件字节流和字节数组流」,本节我们继续走起~  缓冲流 BufferedInputStream和BufferedOutputStream这两个流是处理流,通过内部缓存数组来提高操作流的效率. [示例1]使用缓冲流实现文件的高效率复制操作 public class Demo06 { public static void main(String[] args) { new Demo06().copyFile("d:/a.txt", "d:/b.tx

10.3-全栈Java笔记:常用流详解(一)

 文件字节流 FileInputStream通过字节的方式读取文件,适合读取所有类型文件(图像.视频.文本文件等).Java也提供了FileReader专门读取文本文件. FileOutputStream 通过字节的方式写数据到文件,适合所有类型文件.Java也提供了FileWriter专门写入文本文件. [示例1]将文件内容读取到程序中.  import java.io.*; public class Demo02 { public static void main(String[] args

Java之IO流详解

IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中  ←→ 把数据写入硬盘(磁带)  内存中的数据不可持久保存的  输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. 输出:从内存中把数据写入外部存储区(硬盘.磁带.U盘)中,这样就可以保证:即使程序退出了,数据依然不会丢失. File — 代表磁盘上的文件或目录. ●  listRoots() :列出磁盘上所有的根目录 ● exists:判断是否存在 ● mkdir:创建目录 ● listFiles():列出当

java I/O流详解

概况 I/O流主要分为二大类别:字符流和字节流. 字节流(基本流) 1.字节输入流    类名:FileInputStream    特点:读(对文件进行读取操作)    父类:InputStream 2.字节输出流    类名:FileOutputStream 特点:写 (对文件进行写入操作)    父类:OutputStream 字符流(基本流) 1.字符输入流    类名:FileReader   特点:读(对文件进行读取操作)     父类:InputStreamReader 2.字符输

Java常用IO流详解

一.流的分类: 按照数据流向的不同:输入流 输出流 按照处理数据的单位的不同:字节流 字符流(处理的文本文件) 按照角色的不同:节点流(直接作用于文件的) 处理流 二.IO的体系    抽象基类        节点流(文件流)     缓冲流(处理流的一种) InputStream       FileInputStream        BufferedInputStream OutputStream    FileOutputStream     BufferedOutputStream R

java知识点分享,IO流详解!

Java知识IO流详解有人觉得IO知识不太重要,其实不然,IO的使用范围很广,最能体现IO价值的就是网络上的数据传递,尤其是进入互联网时代后,各种常见的分布式架构,都少不了IO的体现.并且很多大厂的面试题中都会体现出对IO的重视,包括衍生出来的NIO.序列化等等.因此学好IO,变成了一件很重要的事情.IO基本概念IO可以简单的理解成INPUT和OUT,代表输入输出的意思.输入就是读,输出就是写.IO可以读写硬盘.光盘.内存.键盘.网络等资源上的数据.流IO中的流就相当于现实生活中的水流一样,一打

java web之Filter详解

java web之Filter详解 2012-10-20 0 个评论 作者:chenshufei2 收藏 我要投稿 .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 二.Filter简介 Servlet API中提供

Java集合框架Koloboke详解

Java集合框架Koloboke详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs Koloboke的目标是替换标准的Java集合和流的API,提供更高效的实现.Koloboke目前的版本主要是替换java.util.HashSet和java.util.HashMap. Koloboke提供了一套完整的集合原始类型的实现,可以避免开销很大的装箱/拆箱操作,节省了原始类型装箱消耗的内存. 在Koloboke中,Has

Java 8 Stream API详解

Java 8 Stream API详解 一.Stream API介绍 Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStream是完全不同的概念,它不同于StAX对XML解析的Stream,也不同于Amazon Kinesis对大数据实时处理的Stream.Stream API更像具有Iterable的集合类,但行为和集合类又有所不同,它是对集合对象功能的增强,专注于对集合对象进行各种非常便捷.高效的聚合操作或大批量数据操