IO流copy的四种方式Demo

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test01_12 {
* 四种复制文件方式比较 1.字节流复制文件一次读写一个字节 2.字节流复制文件一次读写一个字节数组 3.高效流复制文件一次读写一个字节
* 4.高效流复制文件一次读取一个字节数组 利用上面四种方式复制同一个文件,输出每一种复制方式花费的时间。
public static void main(String[] args) throws IOException {
System.out.println("字节流复制文件一次读写一个字节耗时:" + copy01());
System.out.println("字节流复制文件一次读写一个字节数组耗时:" + copy02());
System.out.println("高效流复制文件一次读写一个字节耗时:" + copy03());
System.out.println("高效流复制文件一次读取一个字节数组耗时:" + copy04());
}
// 字节流复制文件一次读写一个字节
public static long copy01() throws IOException {
// 获得当前时间毫秒值
long startTime = System.currentTimeMillis();
// 创建字节输入流对象并关联文件
FileInputStream fis = new FileInputStream("aaa.jpg");
// 创建字节输出流对象并关联文件
FileOutputStream fos = new FileOutputStream("ttt.jpg");
// 定义变量接收读取的字节数
int len = -1;
// 循环读取图片数据
while ((len = fis.read()) != -1) {
// 每读取一个字节的数据就写出到目标文件中
fos.write(len);
}
// 关闭流
fis.close();
fos.close();
return System.currentTimeMillis() - startTime;    }
// 字节流复制文件一次读写一个字节数组
public static long copy02() throws IOException {
// 获得当前时间毫秒值
long startTime = System.currentTimeMillis();
// 创建字节输入流对象并关联文件
FileInputStream fis = new FileInputStream("aaa.jpg");
// 创建字节输出流对象并关联文件
FileOutputStream fos = new FileOutputStream("eee.jpg");
// 定义数据接收读取的字节数
byte[] buffer = new byte[1024];
// 定义变量接收读取的字节数
int len = -1;
// 循环读取图片数据
while ((len = fis.read(buffer)) != -1) {
// 将字节数组中的数据写出到目标文件中
fos.write(buffer, 0, len);    }
// 关闭流
fis.close();
fos.close();
return System.currentTimeMillis() - startTime;    }
// 高效流复制文件一次读写一个字节
public static long copy03() throws IOException {
// 获得当前时间毫秒值
long startTime = System.currentTimeMillis();
// 创建字节输入流对象并关联文件路径
FileInputStream fis = new FileInputStream("aaa.jpg");
// 利用字节输出流对象创建高效字节输出流对象
BufferedInputStream bis = new BufferedInputStream(fis);
// 创建字节输出流对象并指定文件路径。
FileOutputStream fos = new FileOutputStream("jjj.jpg");
// 利用字节输出流创建高效字节输出流对象
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 定义变量接收读取的字节数
int len = -1;
// 循环读取图片数据
while ((len = bis.read()) != -1) {
// 每读取一个字节的数据就写出到目标文件中
bos.write(len);   }
// 关闭流
bis.close();
bos.close();
return System.currentTimeMillis() - startTime;    }
// 高效流复制文件一次读取一个字节数组
public static long copy04() throws IOException {
// 获得当前时间毫秒值
long startTime = System.currentTimeMillis();
// 创建字节输入流对象并关联文件路径
FileInputStream fis = new FileInputStream("aaa.jpg");
// 利用字节输出流对象创建高效字节输出流对象
BufferedInputStream bis = new BufferedInputStream(fis);
// 创建字节输出流对象并指定文件路径。
FileOutputStream fos = new FileOutputStream("ddd.jpg");
// 利用字节输出流创建高效字节输出流对象
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 定义字节数组接收读取的字节
byte[] buffer = new byte[1024];
// 定义变量接收读取的字节数
int len = -1;
// 循环读取图片数据
while ((len = bis.read(buffer)) != -1) {
// 每读取一个字节的数据就写出到目标文件中
bos.write(buffer, 0, len);   }
// 关闭流
bis.close();
bos.close();
return System.currentTimeMillis() - startTime;    }
  }
好的,以下是三种不同方式的 Android 播放 Rtmp demo: 1. 使用 Vitamio Vitamio一个支持多种视频格式的 Android 播放器,它也支持播放 RTMP 。使用 Vitamio 播放 RTMP 需要先下载 Vitamio SDK,并在项目中引用。 示例代码: ```java import io.vov.vitamio.MediaPlayer; import io.vov.vitamio.Vitamio; import io.vov.vitamio.widget.VideoView; public class MainActivity extends AppCompatActivity implements MediaPlayer.OnInfoListener, MediaPlayer.OnBufferingUpdateListener { private VideoView videoView; private String rtmpUrl = "rtmp://your.rtmp.url"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Vitamio.isInitialized(getApplicationContext()); setContentView(R.layout.activity_main); videoView = findViewById(R.id.video_view); videoView.setVideoPath(rtmpUrl); videoView.setOnInfoListener(this); videoView.setOnBufferingUpdateListener(this); videoView.start(); } @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { switch (what) { case MediaPlayer.MEDIA_INFO_BUFFERING_START: // Show loading spinner break; case MediaPlayer.MEDIA_INFO_BUFFERING_END: // Hide loading spinner break; } return true; } @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { // Update loading spinner progress } } ``` 2. 使用 ExoPlayer ExoPlayer 是 Google 推出的一个支持多种格式的 Android 播放器,它也支持播放 RTMP 。使用 ExoPlayer 播放 RTMP 需要先下载 ExoPlayer SDK,并在项目中引用。 示例代码: ```java import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; import com.google.android.exoplayer2.upstream.DefaultRawResourceDataSourceFactory; import com.google.android.exoplayer2.upstream.DataSource.Factory; import com.google.android.exoplayer2.util.Util; public class MainActivity extends AppCompatActivity { private PlayerView playerView; private String rtmpUrl = "rtmp://your.rtmp.url"; private SimpleExoPlayer player; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); playerView = findViewById(R.id.player_view); player = ExoPlayerFactory.newSimpleInstance(this, new DefaultTrackSelector()); DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "your-application-name")); MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(rtmpUrl)); player.prepare(videoSource); player.setPlayWhenReady(true); playerView.setPlayer(player); } @Override protected void onDestroy() { super.onDestroy(); player.release(); } } ``` 3. 使用 ffmpeg ffmpeg 是一个开源的音视频处理库,它也支持播放 RTMP 。使用 ffmpeg 播放 RTMP 需要先下载 ffmpeg 库,并在项目中引用。 示例代码: ```java import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; import com.arthenica.mobileffmpeg.Config; import com.arthenica.mobileffmpeg.ExecuteCallback; import com.arthenica.mobileffmpeg.ExecuteException; import com.arthenica.mobileffmpeg.FFmpeg; import com.arthenica.mobileffmpeg.FFprobe; public class MainActivity extends AppCompatActivity { private SurfaceView surfaceView; private String rtmpUrl = "rtmp://your.rtmp.url"; private String[] cmd = {"-rtmp_live", "live", "-i", rtmpUrl, "-c:v", "copy", "-c:a", "aac", "-strict", "-2", "-f", "flv", "-"}; private boolean isPlaying = false; private Handler handler = new Handler(Looper.getMainLooper()); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = findViewById(R.id.surface_view); Button playButton = findViewById(R.id.play_button); playButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isPlaying) { stopPlaying(); playButton.setText("Play"); } else { startPlaying(); playButton.setText("Stop"); } } }); } private void startPlaying() { Config.enableStatisticsCallback(new ExecuteCallback() { @Override public void apply(long executionId, int returnCode) { handler.post(new Runnable() { @Override public void run() { // Update statistics } }); } }); FFmpeg.executeAsync(cmd, new ExecuteCallback() { @Override public void apply(long executionId, int returnCode) { isPlaying = false; } }); isPlaying = true; } private void stopPlaying() { FFmpeg.cancel(); isPlaying = false; } } ``` 以上是三种不同方式的 Android 播放 Rtmp demo,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值