作者:zf19920222 | 来源:互联网 | 2023-01-04 12:13
前言
之前已经讲过IO流中字节流和字符流对文件读写及复制的操作,有兴趣的伙伴可以参看IO流(一) —— 字节流IO流(二) —— 字符流
这节就让我们来了解下NIO对文件的读,写及复制的操作吧。我
前言
之前已经讲过IO流
中字节流
和字符流
对文件读写及复制的操作,有兴趣的伙伴可以参看
IO流(一) —— 字节流
IO流(二) —— 字符流
这节就让我们来了解下NIO
对文件的读,写及复制的操作吧。我将NIO
对于文件的读,写和复制封装到了一个类NIOStreamUtil
中,下面让我们来了解下它的使用。
今天涉及的内容:
-
NIOStreamUtil
及StreamUtil
主要功能简介
-
NIOStreamUtil
功能详解
-
NIOStreamUtil
在MainActivity
中使用
3.1 使用前的准备
3.2 NIOStreamUtil
在MainActivity
中使用
- 效果图及项目结构图
-
NIOStreamUtil
及StreamUtil
源码
先来波效果图
一. NIOStreamUtil及StreamUtil主要功能简介
-
NIOStreamUtil
主要用于处理字符串文件的读写,以及文件的拷贝,使用的是nio
知识对文件进行处理,效率比传统的IO流
要高.NIO
要求jdk 1.7+
-
StreamUtil
是一个io流
工具类,主要是为了辅助ByteStreamUtil
的使用,其包含各种流对象的关闭方法,以及各种字符编码格式。
二. NIOStreamUtil功能详解
NIOStreamUtil
主要包含以下几个方法:
/**
* nio读文件的方式一
* @param filePath 文件路径
* @param charsetName 字符编码格式,如:StreamUtil.UTF_8,StreamUtil.GBK 等.
* 此参数为null时,返回编译器默认编码格式
* @return 读出的文件内容
*/
public static String readFile1(String filePath, String charsetName)
/**
* nio读文件的方式二
* @param filePath 文件路径
* @param charsetName 字符编码格式,如:StreamUtil.UTF_8,StreamUtil.GBK 等.
* 此参数为null时,返回编译器默认编码格式
* @return 读出的文件内容
*/
public static String readFile2(String filePath, String charsetName)
/***
* 将文件读成 byte 数组
*
* @param filePath 文件路径
* @return 文件的字节数组
*/
public static byte[] getBytes(String filePath)
/**
* NIO 写文件
*
* @param message 要写入文件的字符串
* @param filePath 文件路径
* @param charsetName 字符编码格式,如:StreamUtil.UTF_8,StreamUtil.GBK 等.
* 此参数为null时,返回编译器默认编码格式
* @param append true:表示在文件中追加内容, false:表示在文件中写新内容,覆盖以前内容
* @return true:写文件成功 false:写文件失败
*/
public static boolean writeFile(String message,String filePath,String charsetName,boolean append)
/**
* NIO复制文件
*
* @param readFilePath 要复制的文件路径
* @param writeFilePath 新生成的文件路径
* @return true:复制成功 false:复制失败
*/
public static boolean copyFile(String readFilePath,String writeFilePath)
三.NIOStreamUtil在MainActivity中使用
3.1 使用前的准备
先在androidmanifast.xml
中添加文件读写权限,如下:
然后要给项目添加FileProvider
的处理权限,最后还要加Android6.0+的手动权限,这些都是老生常谈,具体的大家可以参考
RetroHttp使用记录
中关于权限处理的介绍,然后手动权限库,大家可以参考
PermissionsDispatcher动态权限申请
这些都不是今天讲解的重点,所以就不多赘述了,下面继续开讲。
3.2 NIOStreamUtil在MainActivity中使用
NIOStreamUtil
在MainActivity
中使用代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mTextView;
private TextView mTextView1;
private ImageView mImv;
private Button mButton1;
private Button mButton2;
private Button mButton3;
private Button mButton4;
private static final int PERMISSION_CODE=1234;
private static final String mFilePath="/data/data/com.testdemo/cache/demo.txt";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView1=findViewById(R.id.tv1);
mImv=findViewById(R.id.imv);
mButton1=findViewById(R.id.btn1);
mButton2=findViewById(R.id.btn2);
mButton3=findViewById(R.id.btn3);
mButton4=findViewById(R.id.btn4);
//设置监听
setListener();
//申请权限
requestPermission(MainActivity.PERMISSION_CODE);
}
private void requestPermission(int requestCode) {
String permissions[] = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
PermissionHelper.getInstance().checkPermissions(permissions, requestCode, MainActivity.this);
}
@PermissionSuccess(requestCode = MainActivity.PERMISSION_CODE)
public void requestSuccess() {
//申请到权限后的处理
//......
LogUtil.i("=====权限申请成功======");
}
@PermissionFail(requestCode = MainActivity.PERMISSION_CODE)
public void requestFail() {
//未获取到权限的处理
//......
LogUtil.i("=====权限申请失败======");
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
PermissionHelper.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void setListener(){
mButton1.setOnClickListener(this);
mButton2.setOnClickListener(this);
mButton3.setOnClickListener(this);
mButton4.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1://写文件
writeText();
break;
case R.id.btn2://读文件
readText();
break;
case R.id.btn3://复制文件
copyText();
break;
case R.id.btn4://读图片
readImage();
break;
default:
break;
}
}
/**写文件**/
private void writeText(){
String message="王者荣耀,亚瑟:圣剑啊,我的盾在哪里?n" +
"apKGepn" +
"请关注我微信公众号:Android进击n" +
"9527n" +
"请关注我简书,奔跑的佩恩,谢谢啦!";
boolean flag= NIOStreamUtil.writeFile(message,mFilePath, StreamUtil.UTF_8,false);
LogUtil.i("====是否写文件成功===flag="+flag);
ToastUtil.shortShow("====是否写文件成功===flag="+flag);
}
/**读文件**/
private void readText(){
String message=NIOStreamUtil.readFile1(mFilePath,StreamUtil.UTF_8);
LogUtil.i("=======读出内容===message="+message);
if(StringUtil.isNotEmpty(message)){
mTextView1.setText("读出内容为: "+message);
}else{
mTextView1.setText("没读出内容");
}
}
/**复制文件**/
private void copyText(){
String copyFilePath="/data/data/com.testdemo/cache/copy.txt";
boolean flag=NIOStreamUtil.copyFile(mFilePath,copyFilePath);
LogUtil.i("===是否复制成功===flag="+flag);
ToastUtil.shortShow("===是否复制成功===flag="+flag);
}
/**读图片**/
private void readImage(){
String path="/data/data/com.testdemo/cache/1.jpg";
byte bytes[]=NIOStreamUtil.getBytes(path);
if(bytes!=null){
Bitmap bitmap= BitmapFactory.decodeByteArray(bytes,0,bytes.length);
mImv.setImageBitmap(bitmap);
}
}
}
四.效果图及项目结构图
五. NIOStreamUtil及StreamUtil源码
NIOStreamUtil
源码如下: