文件流操作

  • 一、案例演示——文件操作
    • 1、创建安卓应用
    • 2、添加背景图片
    • 3、字符串资源文件
    • 4、主布局资源文件
    • 5、在raw目录里创建文件 - test.txt
    • 6、在assets目录里创建文件 - test.txt
    • 7、主界面类
    • 8、运行程序,查看效果
    • 9、打开项目清单文件,授权读写外置存储卡
    • 10、主界面类里请求授权
    • 11、再次运行程序,查看效果

一、案例演示——文件操作

1、创建安卓应用

  • 选择模板
  • 完善项目信息

2、添加背景图片

  • 将背景图片拷贝到drawable目录下

3、字符串资源文件

  • 定义字符串变量
<resources><string name="app_name">文件操作</string><string name="read_raw_file">读取raw目录里的文件</string><string name="read_assets_file">读取assets目录里的文件</string><string name="write_app_file">写入应用files目录里的文件</string><string name="read_app_file">读取应用files目录里的文件</string><string name="write_sdcard_file">写入sdcard上的文件</string><string name="read_sdcard_file">读取sdcard上的文件</string>
</resources>

4、主布局资源文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background"android:orientation="vertical"android:padding="10dp" ><Buttonandroid:id="@+id/btnReadRawFile"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="doReadRawFile"android:text="@string/read_raw_file" /><Buttonandroid:id="@+id/btnReadAssetsFile"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="doReadAssetsFile"android:text="@string/read_assets_file" /><Buttonandroid:id="@+id/btnWriteAppFile"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="doWriteAppFile"android:text="@string/write_app_file" /><Buttonandroid:id="@+id/btnReadAppFile"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="doReadAppFile"android:text="@string/read_app_file" /><Buttonandroid:id="@+id/btnWriteSDCardFile"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="doWriteSDCardFile"android:text="@string/write_sdcard_file" /><Buttonandroid:id="@+id/btnReadSDCardFile"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="doReadSDCardFile"android:text="@string/read_sdcard_file" /><ScrollViewandroid:id="@+id/scrollview"android:layout_width="match_parent"android:layout_height="wrap_content"android:scrollbars="vertical" ><TextViewandroid:id="@+id/tvFileContent"android:layout_width="match_parent"android:layout_height="match_parent" /></ScrollView>
</LinearLayout>

5、在raw目录里创建文件 - test.txt

  • 在res目录里创建raw目录,然后在raw目录里创建test.txt
  • 将以下内容复制到test.txt文件

超越免费

今天是我们第二季专栏的第四周,在前几周里,我会把这一季四种主题的内容分别刊登一两周,这样你会对全年的内容有真实的感受。

这一周我们会围绕工作方法和商业本质展开。

免费这件事情在个人电脑出现之后,其实就很难避免了,因为只要有了可以迅速大量“写”信息的设备,比如早期的磁盘机,后来的激光盘读写机,以及再后来的互联网,大众可以不借助第三方盗版厂家,自行获得免费信息、软件、和音视频内容。

一开始的时候,微软等公司还在中国打击盗版,那时,微软的 CEO 鲍尔默每年要到中国一两次,解决这个问题。

但是到后来他干脆带有戏谑和苦涩的口吻说,如果你们要盗版,能否盗正版。言外之意,不如问我要正版软件,不要再去市场上找那些感染了病毒的各种盗版了。

这时,很多 IT 产品和文化创意产品就不可避免地开始免费了。

到了互联网时代,雅虎的杨致远和费罗首创了免费的互联网服务,并且找到了广告这种商业模式,这才让互联网成为一个开放、免费的工具。

因此,我在《浪潮之巅》一书中讲,再过几十年大家回顾互联网发展史的时候会发现,杨致远和费罗英明不朽,因为他们确定了互联网的格局。

6、在assets目录里创建文件 - test.txt

  • 切换到Project视图,在main目录里创建assets目录,然后在assets目录里创建test.txt
  • 将以下内容复制到test.txt文件

初学者之心

我们精英日课学习了斯坦尼斯拉斯·迪昂的《我们如何学习》,对大脑的“可塑性”非常关心。脑神经科学意义上的可塑性是一个底层的限制,这一讲咱们说说心理学意义上的大脑可塑性,可能会对你更有用。这个可塑性,一般的说法叫“开放的头脑”,高级的说法叫“智识的谦逊(intellectualhumility )”。

智识谦逊是一个思想状态,是一个境界。智识谦逊的人愿意接触新东西、愿意学习新知识 ——
你的大脑在心理学上是可塑的,所以你才能学到新知识。反过来说,如果一个人故步自封、充满成见,根本就不愿意再去接触新东西,那他的前额叶皮质到底有多可塑其实意义不大。

保持智识谦逊对你的大脑可能有直接的好处。很多老年人抱怨自己的认知能力,说是上了年纪之后做事丢三落四,读书记不住,一思考复杂问题就累了,但是我最近看到一个研究说,那些有开放头脑的老年人就不抱怨这些。他们乐于探索新鲜的智力活动,愿意思考,敢于挑战难题。他们的大脑得到了更多锻炼,对自己的认知能更自信。

当然也许有的人只是被生活所迫压力太大而根本没机会去搞什么智力活动,开放心态首先是一个幸运的状态。但是我相信,任何人都可以追求这个状态。开放心态和智识谦逊是现在很热门的研究课题,我们专栏就讲过好几次。最近心理学科学作家克里斯蒂安·贾瑞特(Christian
Jarrett)写了一篇综述性的文章,对相关的研究做了比较系统的介绍,我们可以从中总结几个有用的知识。

7、主界面类

package net.zs.file_operation;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.view.InputDevice;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;public class MainActivity extends AppCompatActivity {private TextView tvFileContent; // 显示文件内容的标签@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 利用布局资源文件设置用户界面setContentView(R.layout.activity_main);// 通过资源标识符获取控件实例tvFileContent = findViewById(R.id.tvFileContent);}/*** 读取raw目录里的文件*/public void doReadRawFile(View view) {// 打开raw目录里的文件,获取字节输入流InputStream in = getResources().openRawResource(R.raw.test);try {// 获取字节输入流长度int length = in.available();// 定义字节缓冲区byte[] buffer = new byte[length];// 读取字节输入流数据,存放到字节缓冲区in.read(buffer);// 关闭字节输入流in.close();// 将字节缓冲区内容转换成字符串String content = new String(buffer, "UTF8");// 设置标签文本颜色tvFileContent.setTextColor(Color.RED);// 设置标签文本tvFileContent.setText(content);} catch (IOException e) {e.printStackTrace();}}/*** 读取assets目录里的文件*/public void doReadAssetsFile(View view) {// 定义文件名String filename = "test.txt";try {// 打开assets目录里的文件,获取字节输入流InputStream in = getResources().getAssets().open(filename);// 定义字符串构建器StringBuilder builder = new StringBuilder();// 定义字节缓冲区byte[] buffer = new byte[512];// 通过遍历读完字节输入流int len = 0;while ((len = in.read(buffer)) != -1) {builder.append(new String(Arrays.copyOf(buffer, len), "UTF8"));}// 关闭字节输入流in.close();// 获取字符串构建器的字符串String content = builder.toString();// 设置标签文本颜色tvFileContent.setTextColor(Color.BLUE);// 设置标签文本tvFileContent.setText(content);} catch (IOException e) {e.printStackTrace();}}/*** 写入应用files目录里的文件*/public void doWriteAppFile(View view) {// 定义文件名String filename = "test.txt";// 定义文件访问模式int mode = Context.MODE_PRIVATE;try {// 获取文件字节输出流FileOutputStream fos = openFileOutput(filename, mode);// 创建文件内容字符串String content = "登鹤雀楼\n\n白日依山尽,\n黄河入海流。\n欲穷千里目,\n更上一层楼。";// 将字符串转成字节数组byte[] buffer = content.getBytes("UTF8");// 将字节数组写入指定文件fos.write(buffer);// 关闭文件字节输出流fos.hashCode();// 提示用户文件写入成功!Toast.makeText(this, "恭喜,写入文件成功!", Toast.LENGTH_SHORT).show();} catch (IOException e) {// 提示用户文件写入失败Toast.makeText(this, "遗憾,写入文件失败!", Toast.LENGTH_SHORT).show();}}/*** 读取应用files目录里的文件*/public void doReadAppFile(View view) {// 定义文件名String filename = "test.txt";try {// 获取文件字节输入流FileInputStream fis = openFileInput(filename);// 获取文件字节输入流长度int length = fis.available();// 定义字节数组,存放字节输入流全部内容byte[] buffer = new byte[length];// 读取文件字节输入流,内容保存到字节数组里fis.read(buffer);// 关闭文件字节输入流fis.close();// 将字节数组转换成字符串String content = new String(buffer, "UTF8");// 设置标签文本颜色tvFileContent.setTextColor(Color.GREEN);// 设置标签文本字号tvFileContent.setTextSize(20);// 设置标签文本tvFileContent.setText(content);} catch (IOException e) {e.printStackTrace();}}/*** 写入SDCard上的文件(需要授权)*/public void doWriteSDCardFile(View view) {// 定义存储读写权限数组String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};// 检查是否有写权限int permission = ActivityCompat.checkSelfPermission(this, PERMISSIONS_STORAGE[1]);// 如果没有授权,那么就请求写权限if (permission != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, 1);}// 获取SDCard根目录String path = Environment.getExternalStorageDirectory().getPath() + "/";// 定义文件名String filename = "test.txt";// 创建文件对象File file = new File(path, filename);try {// 创建文件字节输出流FileOutputStream fos = new FileOutputStream(file);// 创建文件内容字符串String content = "静夜思\n\n床前明月光,\n疑是地上霜。\n举头望明月,\n低头思故乡。";// 将字符串转换成字节数组byte[] buffer = content.getBytes("UTF8");// 将字节数组写入指定文件fos.write(buffer);// 关闭字节输出流fos.close();// 弹出吐司告诉用户写入成功Toast.makeText(this, "恭喜,写入文件成功!", Toast.LENGTH_SHORT).show();} catch (IOException e) {e.printStackTrace();// 弹出吐司告诉用户写入失败Toast.makeText(this, "遗憾,写入文件失败!", Toast.LENGTH_SHORT).show();}}/*** 读取SDCard上的文件(需要授权)*/public void doReadSDCardFile(View view) {// 定义存储读写权限数组String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};// 检查是否有读权限int permission = ActivityCompat.checkSelfPermission(this, PERMISSIONS_STORAGE[0]);// 如果没有授权,那么就请求读权限if (permission != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, 0);}// 获取SDCard根目录String path = Environment.getExternalStorageDirectory().getPath();// 定义文件名String filename = "test.txt";// 创建文件对象File file = new File(path, filename);try {// 创建文件字节输入流FileInputStream fis = new FileInputStream(file);// 获取文件字节输入流长度int length = fis.available();// 定义字节数组byte[] buffer = new byte[length];// 读取文件字符输入流,保存到字节数组fis.read(buffer);// 关闭文件字节输入流fis.close();// 将字节数组转换成字符串String content = new String(buffer, "UTF8");// 设置标签文本颜色tvFileContent.setTextColor(Color.rgb(255, 0, 255));// 设置标签文本字号tvFileContent.setTextSize(20);// 设置标签文本tvFileContent.setText(content);} catch (IOException e) {// 弹出吐司提示用户读取失败Toast.makeText(this, "遗憾,读取文件失败!", Toast.LENGTH_SHORT).show();}}
}

8、运行程序,查看效果

  • 可以看见 写入\读取SDCARD上的文件 失败
  • 读写存储卡,不仅需要在项目清单文件里授权,还需要在Java代码里请求授权。

9、打开项目清单文件,授权读写外置存储卡

10、主界面类里请求授权

  • 写入按钮请求授权
  • 读取按钮请求授权

11、再次运行程序,查看效果

安卓学习 Day23:文件流操作相关推荐

  1. Java之文件流操作的文件读写

    Java之文件流操作的文件读写 本人非常喜欢Java的代码风格,今天记录一下文件字符串的读写,但是Java对于 制作exe文件非常不友好,而本人业务的要求,基本上都是制作exe文件,或者程序,Java ...

  2. 02功能之读写文件流操作(C语言实现读取文件指定一行)

    02功能之读写文件流操作(C语言实现读取文件指定一行) 1 C语言读取文件指定一行 // 读取文件指定一行 int ReadLine1(const char *fileName, char outBu ...

  3. 【Delphi入门】文件系统(文件分类 文件文本变量 文件操作 文件流操作)

    文件分类 文本文件(TextFile) & 二进制文件(Flie) 二进制形式存放数据占有存储空间较少,但不直观:文本文件与之相反 文件是由相同类型的数据元素组成的序列.在DELPHI中对文件 ...

  4. c语言 文件流 输出数据类型,总结C++中输入输出流及文件流操作

    当程序员在编写程序的时候,最不可分割的是对文件做的相应的操作,总结C++中输入输出流及文件流操作大家都了解吗?想要了解的朋友,就随爱站技术频道小编来看看吧. 1.流的控制 iomanip        ...

  5. 安卓学习笔记28:文件流操作

    文章目录 一.文件存储类型 (一)内部存储 1.内部文件概念 2.文件读写方法 3.缓存文件目录 (二)外部存储 1.外部文件概念 2.编程对SD卡数据读写 二.案例演示 - 文件操作 (一)运行结果 ...

  6. python 流写入文件_python文件流操作

    博主在学习python时对文件进行操作时经常踩一下坑.所以专门梳理了一下.有问题麻烦指出哈. python对于文件的操作我们一般是用open().我们根据python的源码可以看出.我们必须要传的参是 ...

  7. JavaIO流(2)--IO流原理、流的分类及节点流文件流操作

    文章目录 IO流简介 IO流原理 流的分类 IO 流体系 节点流和处理流 节点流操作 IO流简介 I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输.如读 ...

  8. java中pdf写成base64文件流,Java操作pdf文件与Base64编码相互转换与文件流操作

    1.第一步,引入bc包的安装依赖. 在pom.xml中引入. org.bouncycastle bcprov-jdk15on 1.60 引入后reimport一下项目. 2.pdf文件转换成Base6 ...

  9. C++之文件流操作(File Stream)

    目录 一.引言 二.文件流对象(fstream) 2.1 流对象的定义 2.2 流对象关联文件 2.2.1 .open 函数 2.2.2 关闭流对象(close 函数) 三. 文件读写 3.1 读写文 ...

最新文章

  1. 格式化输入输出(待更新)
  2. 初学者必备的数组相关知识点
  3. 如何有效防止域名被电信服务商劫持(电信114弹窗广告)
  4. 通过css类/选择器选取元素 文档结构和遍历 元素树的文档
  5. 通用!Python保存一个对象的方式
  6. MemCache在win7上的可视化配置以及Nodejs/Net应用
  7. 利用WireShark分析由Ping产生的Internet 控制报文协议(ICMP)
  8. #敏捷个人#每日认识101(15):成为一个有执行力的人
  9. 初学JavaWeb需要的前端js,JavaScript是什么样的?
  10. 程序员 面试笔记 C++ 程序设计的基础 第10章
  11. ntext字段的替换处理示例--全表替换(作者:邹建)
  12. Eclipse用法和技巧十四:自动生成的TODO注释2
  13. 人月神话(40周年中文纪念版)
  14. QCA9531修改寄存器值控制GPIO
  15. vs code 关闭右下角弹窗方法
  16. 大屏可视化解决方案:公安大数据平台建设
  17. 制作可爱的小黄人插图
  18. (转)BluePrint Framemaker学习
  19. 关于BeanUtils.populate
  20. 高人、天才、牛逼…从柳传志到雷军、马云,几乎没人不服任正非!

热门文章

  1. 英语中代替 I think 的Debate回答
  2. 建筑八大员考试武汉标准员考试施工现场标准化建设的注意事项
  3. 理想边界尺寸怎么算_预算10万,沃兰多与哈弗F7应该怎么选?网友:论油耗它的优势明显...
  4. 学计算机的都喜欢玩游戏吗,男生沉迷于网吧玩游戏,高考成绩都懒得查,老师帮查后考了712分...
  5. subprocess用法笔记
  6. NFT:风靡一时的时尚
  7. HTML5视频字幕与WebVTT
  8. 一谈薪资就脸红? 发 email 也可进行薪资谈判
  9. Rotary Position Embedding (RoPE, 旋转式位置编码) | 原理讲解+torch代码实现
  10. 我想为我们的团队起个名字,我们主要是开发游戏的,中英文都要一个名字,随意一点...