Java推回输入流

通常情况下使用输入流从磁盘、网络或者其它的物理介质读取数据都是按顺序读取的, 而在流的内部都会维护一个指针,读取数据的同时,指针会向后移动,直到读取完成为止。

而在一些实际常见中,如果读出来的数据不是想要的,但又放不回去的时候怎么办?

这时就可以使用IO提供的推回输入流。当使用普通的IO输入流如果读取到不想要的数据时,只能在程序里面处理掉,而使用IO里面的推回输入流读取数据则可以把数据给推回到输入流的缓冲区中。

推回输入流主要分为两类:分别是PushbackInputStream PushbackReader

下面使用字符推回输入流 PushbackReader 举例说明推回输入流的应用,功能是:查找程序中 "//插入的字符串" 字符串,找到之后只是打印目标串之前的内容。

    代码如下:

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

        // 创建字符输入流

        Reader in = new FileReader("E:/MyJavacode/IOtest/z/HelloWorld.java");

        // 创建推回输入流 指定推回缓冲区大小为64,

        //如果不指定,默认缓冲区大小为1

        PushbackReader reader = new PushbackReader(in, 64);

        // 临时数组

        char[] cs = new char[32];

        // 读取的字符数

        int count = 0;

        // 记录上次读取的字符串

        String strOld = "";

        while ((count = reader.read(cs, 0, cs.length)) != -1) {

            // 本次读取内容

            String str = new String(cs, 0, count);

            // 上次+本次读取内容 ‐‐ 避免 要查找的字符串被截断

            String strContent = strOld + str;

            // 查找目标字符串

            // 目标出现位置

            int targetIndex = strContent.indexOf("//插入的字符串");

            if (targetIndex > -1) {

                // 将本次内容和上次内容一起推回缓冲区

                // ******推回缓冲区的内容大小不能超过缓冲区的大小

                // 把strContent 推回流里

                //int i = strContent.toCharArray().length;

                reader.unread(strContent.toCharArray());

                // 重新读取

                if (targetIndex > 32) {

                    cs = new char[targetIndex];

                }

                // 再次读取指定长度的内容(就是目标字符串之前的内容)

                reader.read(cs, 0, cs.length);

                str = new String(cs);

                System.out.print(str);

                break;

            } else {

                // 为找到目标字符串

                // 直接输出

                System.out.print(strOld);

                strOld = str;

            }

        }

        reader.close();

    }

    运行效果如下:

FFmpeg是一个开源的跨平台音视频处理工具,它提供了丰富的功能和接口,可以用于音视频的编解码、转码、推等操作。而Java是一种广泛使用的编程语言,可以与FFmpeg进行集成,实现音视频处理的功能。 在Java中使用FFmpeg进行推,可以通过JNI(Java Native Interface)来调用FFmpeg的C/C++接口。以下是一个简单的示例代码: 1. 首先,需要在Java中加载FFmpeg库文件,可以使用System.loadLibrary()方法加载.so或.dll文件,例如: ``` System.loadLibrary("avutil"); System.loadLibrary("avformat"); System.loadLibrary("avcodec"); System.loadLibrary("swscale"); ``` 2. 接下来,可以使用FFmpeg提供的API进行推操作。首先需要初始化FFmpeg,可以调用avformat_network_init()方法进行初始化。 3. 创建一个AVFormatContext对象,用于存储音视频的相关信息。 4. 打开输入文件或设备,可以使用avformat_open_input()方法打开本地文件或网络。 5. 查找音视频信息,可以使用avformat_find_stream_info()方法获取音视频的相关信息。 6. 创建一个AVCodecContext对象,用于存储编解码器的相关信息。 7. 查找音视频对应的解码器,并打开解码器。 8. 创建一个AVCodecContext对象,用于存储编码器的相关信息。 9. 设置编码器参数,例如编码格式、分辨率、帧率等。 10. 打开输出文件或设备,可以使用avformat_alloc_output_context2()方法创建一个AVFormatContext对象,并调用avio_open2()方法打开输出文件。 11. 写入文件头信息,可以使用avformat_write_header()方法写入文件头。 12. 循环读取音视频帧数据,可以使用av_read_frame()方法读取音视频帧数据。 13. 对音视频帧进行编码,可以使用avcodec_send_frame()方法发送音视频帧数据给编码器。 14. 从编码器中获取编码后的数据,可以使用avcodec_receive_packet()方法接收编码后的数据。 15. 将编码后的数据写入输出文件,可以使用av_write_frame()方法将编码后的数据写入输出文件。 16. 循环结束后,调用av_write_trailer()方法写入文件尾信息。 17. 释放资源,可以调用相关的释放方法,如avformat_close_input()、avcodec_free_context()等。 以上是一个简单的FFmpeg Java的示例,具体的实现还需要根据具体的需求进行调整和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值