简介

小师妹又对F师兄提了一大堆奇奇怪怪的需求,要格式化输出,要特定的编码输出,要自己定位输出,什么?还要阅后即焚?大家看F师兄怎么一一接招吧。

字符输出和字节输出

小师妹:F师兄,上次你的IO讲到了一半,文件读取是基本上讲完了,但是文件的写入还没有讲,什么时候给小师妹我再科普科普?

小师妹:F师兄,你知道我这个人一直以来都是勤奋好学的典范,是老师们眼中的好学生,同学们心中的好榜样,父母身边乖巧的好孩子。在我永攀科学高峰的时候,居然发现还有一半的知识没有获取,真是让我扼腕叹息,F师兄,快快把知识传给我吧。

小师妹你的请求,师兄我自当尽力办到,但是我怎么记得上次讲IO文件读取已经过了好几天了,怎么今天你才来找我。

小师妹红着脸:F师兄,这不是使用的时候遇到了点问题,才想找你把知识再复习一遍。

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

那先把输出类的结构再过一遍:

上面就是输出的两大系统了:Writer和OutputStream。

Writer主要针对于字符,而Stream主要针对Bytes。

Writer中最最常用的就是FileWriter和BufferedWriter,我们看下一个最基本写入的例子:

public void useBufferedWriter() throws IOException {String content = "www.flydean.com";File file = new File("src/main/resources/www.flydean.com");FileWriter fw = new FileWriter(file);try(BufferedWriter bw = new BufferedWriter(fw)){bw.write(content);}}

BufferedWriter是对FileWriter的封装,它提供了一定的buffer机制,可以提高写入的效率。

其实BufferedWriter提供了三种写入的方式:

public void write(int c)
public void write(char cbuf[], int off, int len)
public void write(String s, int off, int len)

第一个方法传入一个int,第二个方法传入字符数组和开始读取的位置和长度,第三个方法传入字符串和开始读取的位置和长度。是不是很简单,完全可以理解?

小师妹:不对呀,F师兄,后面两个方法的参数,不管是char和String都是字符我可以理解,第一个方法传入int是什么鬼?

小师妹,之前跟你讲的道理是不是都忘记的差不多了,int的底层存储是bytes,char和String的底层存储也是bytes,我们把int和char做个强制转换就行了。我们看下是怎么转换的:

public void write(int c) throws IOException {synchronized (lock) {ensureOpen();if (nextChar >= nChars)flushBuffer();cb[nextChar++] = (char) c;}}

还记得int需要占用多少个字节吗?4个,char需要占用2个字节。这样强制从int转换到char会有精度丢失的问题,只会保留低位的2个字节的数据,高位的两个字节的数据会被丢弃,这个需要在使用中注意。

看完Writer,我们再来看看Stream:

public void useFileOutputStream() throws IOException {String str = "www.flydean.com";try(FileOutputStream outputStream = new FileOutputStream("src/main/resources/www.flydean.com");BufferedOutputStream bufferedOutputStream= new BufferedOutputStream(outputStream)){byte[] strToBytes = str.getBytes();bufferedOutputStream.write(strToBytes);}}

跟Writer一样,BufferedOutputStream也是对FileOutputStream的封装,我们看下BufferedOutputStream中提供的write方法:

public synchronized void write(int b)
public synchronized void write(byte b[], int off, int len)

比较一下和Writer的区别,BufferedOutputStream的方法是synchronized的,并且BufferedOutputStream是直接对byte进行操作的。

第一个write方法传入int参数也是需要进行截取的,不过这次是从int转换成byte。

格式化输出

小师妹:F师兄,我们经常用的System.out.println可以直接向标准输出中输出格式化过后的字符串,文件的写入是不是也有类似的功能呢?

肯定有,PrintWriter就是做格式化输出用的:

public void usePrintWriter() throws IOException {FileWriter fileWriter = new FileWriter("src/main/resources/www.flydean.com");try(PrintWriter printWriter = new PrintWriter(fileWriter)){printWriter.print("www.flydean.com");printWriter.printf("程序那些事 %s ", "非常棒");}}

输出其他对象

小师妹:F师兄,我们看到可以输出String,char还有Byte,那可不可以输出Integer,Long等基础类型呢?

可以的,使用DataOutputStream就可以做到:

public void useDataOutPutStream()throws IOException {String value = "www.flydean.com";try(FileOutputStream fos = new FileOutputStream("src/main/resources/www.flydean.com")){DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));outStream.writeUTF(value);}}

DataOutputStream提供了writeLong,writeDouble,writeFloat等等方法,还可以writeUTF!

在特定的位置写入

小师妹:F师兄,有时候我们不需要每次都从头开始写入到文件,能不能自定义在什么位置写入呢?

使用RandomAccessFile就可以了:

public void useRandomAccess() throws IOException {try(RandomAccessFile writer = new RandomAccessFile("src/main/resources/www.flydean.com", "rw")){writer.seek(100);writer.writeInt(50);}}

RandomAccessFile可以通过seek来定位,然后通过write方法从指定的位置写入。

给文件加锁

小师妹:F师兄,最后还有一个问题,怎么保证我在进行文件写的时候别人不会覆盖我写的内容,不会产生冲突呢?

FileChannel可以调用tryLock方法来获得一个FileLock锁,通过这个锁,我们可以控制文件的访问。

public void useFileLock()throws IOException {try(RandomAccessFile stream = new RandomAccessFile("src/main/resources/www.flydean.com", "rw");FileChannel channel = stream.getChannel()){FileLock lock = null;try {lock = channel.tryLock();} catch (final OverlappingFileLockException e) {stream.close();channel.close();}stream.writeChars("www.flydean.com");lock.release();}}

总结

今天给小师妹将了好多种文件的写的方法,够她学习一阵子了。

本文的例子https://github.com/ddean2009/learn-java-io-nio

本文作者:flydean程序那些事本文链接:http://www.flydean.com/io-file-writer/本文来源:flydean的博客欢迎关注我的公众号:程序那些事,更多精彩等着您!

.dat文件写入byte类型数组_小师妹学JavaIO之:文件写入那些事相关推荐

  1. java文件夹路径的表达_小师妹学JavaIO之:文件File和路径Path

    简介 文件和路径有什么关系?文件和路径又隐藏了什么秘密?在文件系统的管理下,创建路径的方式又有哪些?今天F师兄带小师妹再给大家来一场精彩的表演. 文件和路径 小师妹:F师兄我有一个问题,java中的文 ...

  2. 小师妹学JavaIO之:文件写入那些事

    文章目录 简介 字符输出和字节输出 格式化输出 输出其他对象 在特定的位置写入 给文件加锁 总结 简介 小师妹又对F师兄提了一大堆奇奇怪怪的需求,要格式化输出,要特定的编码输出,要自己定位输出,什么? ...

  3. .dat文件写入byte类型数组_文件字节流、文件字符流、缓冲字节流、缓冲字符流字节数组流、数据流、转换流、对象流...

    一.实操名称: 描述如下流的基本作用:文件字节流.文件字符流.缓冲字节流.缓冲字符流字节数组流.数据流.转换流.对象流二.描述1.文件字节流:包括:FileInputStream,FileOutput ...

  4. 小师妹学JavaIO之:文件系统和WatchService

    文章目录 简介 监控的痛点 WatchService和文件系统 WatchSerice的使用和实现本质 总结 简介 小师妹这次遇到了监控文件变化的问题,F师兄给小师妹介绍了JDK7 nio中引入的Wa ...

  5. 小师妹学JavaIO之:文件读取那些事

    文章目录 简介 字符和字节 按字符读取的方式 按字节读取的方式 寻找出错的行数 总结 简介 小师妹最新对java IO中的reader和stream产生了一点点困惑,不知道到底该用哪一个才对,怎么读取 ...

  6. 小师妹学JavaIO之:文件File和路径Path

    文章目录 简介 文件和路径 文件中的不同路径 构建不同的Path 总结 简介 文件和路径有什么关系?文件和路径又隐藏了什么秘密?在文件系统的管理下,创建路径的方式又有哪些?今天F师兄带小师妹再给大家来 ...

  7. 小师妹学JavaIO之:文件编码和字符集Unicode

    文章目录 简介 使用Properties读取文件 乱码初现 字符集和文件编码 解决Properties中的乱码 真.终极解决办法 总结 简介 小师妹一时兴起,使用了一项从来都没用过的新技能,没想却出现 ...

  8. .dat文件写入byte类型数组_深入浅出MATLAB数据处理之文件读写

    过冷水给大家讲了好几期实战案例.但是最基本的文件操作,读取数据的函数使用方法没有给大家讲,只是一个没有思想的代码操作工,今天和大家剖析一下最常见的fopen.fread函数使用方法,先来看看 file ...

  9. .dat文件写入byte类型数组_《计算机导论》课程实验报告(文件)

    <计算机导论>课程实验报告 专业班级: 姓名: 学号: 实验类型: 设计型实验 时间: 实验题目:文件 实验目的: 1.掌握文件和文件指针的概念: 2.掌握文件打开和关闭的方法. 3.掌握 ...

最新文章

  1. Python培训教程分享:10款超好用的Python开发工具
  2. Fotosifter中文版
  3. 网易智企斩获“2021全球新经济卓越成就奖”两项大奖
  4. 数据结构 2-3-2 线性表的双链表实现
  5. oppoJava面试!mysql客户端安装包
  6. iOS版本更新的方法
  7. noi 8780 拦截导弹
  8. 第五章:逻辑回归(Logistic 回归)
  9. 迈入python游戏编程的大门,超详细的python环境搭建教程
  10. 机器视觉产业链全解析
  11. 关于MinGW和MSYS
  12. 【redis】跟我一起动手玩玩redis主从复制和哨兵模式
  13. 快解析内网穿透,速度快 不限速 不限流
  14. 百度百科创建个人词条怎么写?
  15. windows使用administrator用户还是没有权限
  16. 金蝶K/3 固定置产相关SQL语句
  17. 飞思卡尔 I.MX6Q-高分辨率(1080P)视频采集编码
  18. [JSP] 页面编写操作
  19. wxPython 教程
  20. matlab 斜坡信号响应,matlab斜坡输入响应

热门文章

  1. java flv 转swf_java实现视频文件转换为flv(带文件缩略图)
  2. 破2亿!罗永浩的商业价值到底有多深?
  3. 移动大数据助力南京智慧旅游升级
  4. 基于Java+SQL server的会展中心管理系统
  5. html网页切换效果,css图片切换效果
  6. RN清除WebView的Cookie缓存
  7. php xdebug测试,使用XDebug调试及单元测试覆盖率分析
  8. HE同态加密(Microsoft SEAL) 实例小试
  9. 管道内壁城市建设用食品级环氧树脂底漆 漆膜坚韧耐久
  10. 领导跟跟你说让你多和他沟通,但是你不知道该沟通什么?怎么破?