java 中获取file的长度为0_Java核心技术梳理-IO

一、引言

IO(输入/输出),输入是指允许程序读取外部数据(包括来自磁盘、光盘等存储设备的数据)、用户输入数据。输出是指允许程序记录运行状态,将程序数据输出到磁盘、光盘等存储设备中。

IO的主要内容包括输入、输出两种IO流,这两种流中又分为字节流和字符流,字节流是以字节为单位来处理输入、输出流,而字符流是以字符为单位来处理输入、输出流。

回到顶部

二、File 类

File 类是用来操作文件和目录的,File能创建、删除、重命名文件和目录,File不能访问文件内容本身,File 类可以通过文件路径字符串来创建对象,创建完对象之后有很多方法来操作文件和目录:

2.1 构造方法

  • File(String pathname):根据一个路径得到File对象
  • File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
  • File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对

2.2 创建方法

//在当前路径来创建一个File对象File file = new File("1.txt");//创建文件System.out.println(file.createNewFile());File file2 = new File("temp"); //创建对象对应的目录System.out.println(file2.mkdir());

2.3 重命名和删除功能

//把文件重命名为指定的文件路径file2.renameTo(new File("temp2"));//删除文件或者文件夹file2.delete();

注:重命名中如果路径名相同,就是改名,如果路径名不同,就是改名并剪切。删除不走回收站,要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹。

2.4 判断功能

//判断文件或目录是否存在System.out.println(file.exists());//判断是否是文件System.out.println(file.isFile());//判断是否是目录System.out.println(file.isDirectory());//是否为绝对路径System.out.println(file.isAbsolute());//文件或目录是否可读System.out.println(file.canRead());//文件或目录是否可写System.out.println(file.canWrite());

2.5 获取功能

//返回文件内容长度System.out.println(file.length());//获取文件或目录名System.out.println(file.getName());//获取文件或目录相对路径System.out.println(file.getPath());//获取文件或目录绝对路径System.out.println(file.getAbsolutePath());//获取上一级路径System.out.println(file.getAbsoluteFile().getParent());//返回当前目录的子目录或文件的名称String[] list = file1.list();for (String fileName : list) { System.out.println(fileName);}//返回当前目录的子目录或文件,返回的是File数组File[] files = file1.listFiles();//返回系统的所有根路径File[] listRoots = File.listRoots();for (File root : listRoots) { System.out.println(root);}

回到顶部

三、IO 流

实现输入/输出的基础是IO流,Java把不同的源之间的数据交互抽象表达为流,通过流的方式允许Java程序使用相同的方式来访问不同的数据源。用于操作流的类都在IO包中。

3.1 流的分类

按照不同的分类方式,流也可以分为不同类型

  1. 输入流和输出流:根据流向来分,可以分为输入流与输出流
  • 输入流:从中读取数据,而不能向其写入数据
  • 输出流:向其写入数据,而不能读取数据
  1. 字节流和字符流:这两种流用法几乎完全一样,区别在于所操作的数据单元不一样,字节流操作的数据单元是8位的字节,而字符流是16位的字符。

3.2 InputStream与Reader

InputStream和Reader是所有输入流的抽象基类,这是输入流的模板,InputStream中有三个方法

  • int read() :从输入流读取单个字节,返回所读取的字节数据。
  • int read(byte b[]):从输入流中最多读取b.length个字节的数据,并将其存储在数组b中。
  • int read(byte b[], int off, int len):从输入流中最多读取len个字节的数据,并将其存储在数组b中,放入的位置是从off中开始。

Reader中也有三个方法

  • int read() :从输入流读取单个字符,返回所读取的字符数据。
  • int read(char cbuf[]):从输入流中最多读取cbuf.length个字符的数据,并将其存储在数组cbuf中。
  • int read(char cbuf[], int off, int len):从输入流中最多读取len个字符的数据,并将其存储在数组cbuf中,放入的位置是从off中开始。
  • 两个类的方法基本相同,用法相同,只是操作单位不一样
InputStream inputStream = new FileInputStream("StreamTest.java");byte[] bytes = new byte[1024];int hasRead = 0;while ((hasRead = inputStream.read(bytes)) > 0) {System.out.println(new String(bytes, 0, hasRead));}inputStream.close();

3.3 OutputStream与Writer

OutputStream与Writer是所有输出流的抽象基类,是输出流模板,OutputStream有三个方法:

  • void write(int b):指定字节输出到流中
  • void write(byte b[]):将指定字节数组输出到流中
  • void write(byte b[], int off, int len):将指定字节数组从off位置到len长度输出到流中

Writer中也有三个方法:

  • void write(int b):指定字符输出到流中
  • void write(char buf[]):将指定字符数组输出到流中
  • void write(char cubf[], int off, int len):将指定字符数组从off位置到len长度输出到流中

由于Writer是以字符为单位进行操作,那可以使用String 来代替,于是有另外的方法

  • void write(String str):将str字符串输出到流中
  • void write(String str, int off, int len):将str从off位置开始长度为len输出到流中
FileWriter fileWriter = new FileWriter("test.txt");fileWriter.write("日照香炉生紫烟");fileWriter.write("遥看瀑布挂前川");fileWriter.write("飞流直下三千尺");fileWriter.write("遥看瀑布挂前川");fileWriter.close();

注:操作流时一定要记得关闭流,因为打开的IO资源不属于内存资源,垃圾回收无法回收。

四、输入/输出流体系

Java的输入输出流提供了40多个类,要全部都记住很困难也没有必要,我们可以按照功能进行下分类,其实是非常有规律的

127eda4d57afebfaea5da011971d6b59.png

一般如果输入/输出的内容是文本内容,应该考虑使用字符流,如果输入/输出内容是二进制内容,则应该考虑使用字节流。

4.1 转换流

体系中提供了两个转换流,实现将字节流转换成字符流,InputStreamReader将字节输入流转换成字符输入流,OutputStreamWriter将字节输出流转换成字符输出流,System.in代表标准输入,这个标准输入是字节输入流,但是键盘输入的都是文本内容,这个时候我们可以InputStreamReader转换成字符输入流,普通的Reader读取内容不方便,我们可以使用BufferedReader一次读取一行数据,如:

//先将System.in转换成Reader 对象InputStreamReader inputStreamReader = new InputStreamReader(System.in);//再将Reader包装成BufferedReaderBufferedReader bufferedReader = new BufferedReader(inputStreamReader);String line = null;while ((line = bufferedReader.readLine()) != null) { if (line.equals("exit")) { System.exit(1); } System.out.println("输入的内容是:" + line);}

BufferedReader具有缓冲功能,在没有读到换行符则阻塞,读到换行符再继续。

4.2 推回输入流

推回输入流PushbackInputStream和PushbackReader中都提供了如下方法:

  • void unread(int b) :将一个字节/字符推回到推回缓冲区,从而允许重复读取刚刚读取的内容。
  • void unread(byte[] b/char[] b, int off, int len) :将一个字节/字符数组里从off开始,长度为len字节/字符的内容推回到推回缓冲区,从而允许重复读取刚刚读取的内容。
  • void unread(byte[] b/char[]):将一个字节/字符数组内容推回到推回缓冲区,从而允许重复读取刚刚读取的内容。

这两个推回流都带有一个推回缓冲区,当调用unread()方法时,系统将会把指定的内容推回到该缓冲区,而当每次调用read方法时会优先从推回缓冲区读取,只有完全读取了推回缓冲区的内容后,但还没有read()所需的数组时才会从原输入流中读取。

 //创建PushbackReader对象,指定推回缓冲区的长度为64PushbackReader pushbackReader = new PushbackReader(new FileReader("StreamTest.java"), 64);char[] buf = new char[32];//用以保存上次读取的字符串内容String lastContent = "";int hasRead = 0;//循环读取文件内容while ((hasRead = pushbackReader.read(buf)) > 0) { //将读取的内容转换成字符串 String content = new String(buf, 0, hasRead); int targetIndex = 0; if ((targetIndex = (lastContent + content).indexOf("new PushbackReader")) > 0) { //将本次内容和上次的内容一起推回缓冲区 pushbackReader.unread((lastContent + content).toCharArray()); //重新定义一个长度为targetIndex的char数组 if (targetIndex > 32) { buf = new char[targetIndex]; } //再次读取指定长度的内容 pushbackReader.read(buf, 0, targetIndex); //打印读取的内容 System.out.print(new String(buf, 0, targetIndex)); System.exit(0); } else { //打印上次读取的内容 System.out.print(lastContent); //将本次内容设为上次读取的内容 lastContent = content; }}

五、RandomAccessFile

RandomAccessFile是Java输入/输出流体系中最丰富的文件内容访问类,提供了众多的方法来访问文件内容,既可读取文件内容,也可以向文件输出数据,RandomAccessFile可以自由访问文件的任意位置。

RandomAccessFile包含一个记录指针,用以标识当前读和写的位置,当创建新对象时,指针位置在0处,而当读/写了N个字节后,指针就会向后移动N个字节,并且RandomAccessFile可以自动的移动该指针位置,当然我们也可以直接的获取指针的位置。

  • getFilePointer():获取文件记录指针的当前位置。
  • seek(long pos):将文件记录指针定位到pos位置。

RandomAccessFile有两个构造函数:

  • RandomAccessFile(File file, String mode):使用File文件,指定文件本身 RandomAccessFile(String name, String mode):使用文件名称,指定文件

其中还有一个参数mode(访问模式),访问模式有4个值:

  • r:以只读方式打开文件
  • rw:以读、写方式打开文件,如果文件不存在,则创建
  • rws:以读、写方式打开文件,并要求对文件的内容或者元数据的每个更新都同步写入到底层存储设备
  • rwd:以读、写方式打开文件,并要求对文件的内容的每个更新都同步写入到底层存储设备
RandomAccessFile raf = new RandomAccessFile("StreamTest.java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

福布斯:2018年将改变世界的九股科技大趋势

来源:咕噜网 概要:2018年又会有哪些重要科技趋势会改变世界呢?《福布斯》杂志今天发表文章,公布了将会在明年及日后改变世界的9股科技大趋势。 据《福布斯》杂志北京时间12月4日报道,2017年即将结束。这一年&#xff0…

BigDecimal 运用示例 与 DecimalFormat

代码: BigDecimal bd new BigDecimal( "99.11" );System.out.println( "scale" bd.scale() );System.out.println(bd);bd new BigDecimal( 5526 );bd bd.divide( new BigDecimal (1000) );System.out.println( "scale" bd.scale…

NIPS 2017上演:Google大神们将带来哪些「精彩」?

来源:雷克世界 作者:Christian Howard 编译:嗯~阿童木呀、我是卡布达 概要:Google在2017年NIPS大会将展现出色的影响力,约有450多名Google员工将会通过技术讲座、海报、研讨会、比赛以及教程等方式向更广泛的学术研究…

dict keys 取最后一个_一步一步学Python3(小学生也适用) 第十三篇: 字典Dict类型

前面我们已经学习了Python的字符串,列表,元组,这一篇我们将学习字典,字典的使用频率是非常高,跟前面几篇一样,只要你用Python编程,就避不开Python字典。一、创建字典字典由键(key&am…

三份研究报告,聚焦 AI 的三大主要话题

来源:36氪 概要:随着人工智能技术呈现出势不可挡的发展之势,围绕 AI 进行的相关研究数量也越来越多。 随着人工智能技术呈现出势不可挡的发展之势,围绕 AI 进行的相关研究数量也越来越多。 关于人工智能及其对经济的影响方面&…

adams打不开提示msc license_adams安装后打不开

虽然要支持正版……但是安装后打不开,借鉴了adams2017安装教程后台留言图片发自简书App1.首先我这么做是因为其实在安装过程中就有一次没找到路径 。所以该方法仅供参考。图片发自简书App此时我直接在“此电脑”内搜索“MSC.Software”了图片发自简书App耐心等待………

李彦宏乌镇谈人工智能:百度会很快和雄安宣布一个大的智能城市计划

来源:亿欧 概要:百度董事长兼CEO李彦宏谈到了人工智能给C端、B端以及供给侧等方面带来的影响和变革。 12月4日,2017世界互联网大会在乌镇如火如荼地进行,在主题为“人工智能:让生活更美好”的分论坛上,百度…

android studio 制作表格_红爆网络的旅游排行榜视频制作其实很简单,赶快动手尝试...

随着手机短视频的蓬勃发展,在网络上出现了多种类型的红极一时的爆款视频,这其中很具有代表性的一种就是排行榜视频,旅游领域的排行榜视频自然也少不了。这些个排行榜视频看起来挺高大上,配上稍有激情的背景音乐,播放起…

2017全球大数据产业八领域典型公司盘点分析

来源:黑科技数据 概要:从微观视角细分领域分析大数据行业。 今天带大家从微观视角细分领域分析大数据行业。 大数据分析 大数据可视化 BI商业智能分析 大数据检索 产品大数据分析 大数据预测、咨询 大数据服务支撑平台 机器学习技术 “大数据分析、可视化…

mysql profile 调试sql_SQL Server profile使用技巧

介绍经常会有人问profile工具该怎么使用?有没有方法获取性能差的sql的问题。自从转mysql我自己也差不多2年没有使用profile,忽然profile变得有点生疏不得不重新熟悉一下。这篇文章主要对profile工具做一个详细的介绍;包括工具的用途和使用方法…

BPP 相关——01

1、InputPageUtil 2、EditPageUtil ---------------------------------------------------------------------------------------------------------- 1、InputPageUtil 功能简述:在输入画面中,总是显示最后一页,本页输入满了则自动跳到下…

传感器数据完善 AI 功能,激起机器人“网络效应”

来源:36氪 概要:传感器数据将有助于推动AI的发展。 AI系统也同时扩展我们处理数据的能力,并帮助我们发现这些数据的创造性用途。 现在我们都对AI很熟悉了,也知道算法的完善离不开海量的数据。数据量越大,算法给出的结…

比AlphaGo Zero更强的AlphaZero来了!8小时解决一切棋类!

来源:本文作者PENG Bo(http://t.cn/RY3MKSS),本文首发于作者的知乎专栏《技术备忘录》 读过AlphaGo Zero论文的同学,可能都惊讶于它的方法的简单。另一方面,深度神经网络,是否能适用于国际象棋这…

直接插入排序比较次数_程序员必须要会的直接插入排序算法

算法主要衡量标准时间复杂度(运行时间)在算法时间复杂度维度,我们主要对比较和交换的次数做对比,其他不交换元素的算法,主要会以访问数组的次数的维度做对比。其实有很多同学对于算法的时间复杂度有点模糊,分不清什么所谓的 O(n),…

脑机接口技术如何具体实现?

来源:神经科技前沿 概要:人类心灵能够与人工智能、机器人和其它心灵通过脑机接口技术(BCI)直接相连,从而超越人类寿命的限制吗? 就像古希腊人梦想在天空翱翔一样,今天的人们总是梦想着将大脑与机器融合来解决令人讨厌的死亡问题。…

BPP 相关——02

BPP项目 HT 部分完成小结: 1、Action 类怎么写? 现在的做法是Action 层直接与 dao 层耦合,所有的功能都在 Action 类中完成。 缺点:如果 Action1 与 Action2 两个类有部分功能重复,在“避免重复代码”这样的原则下&am…

scrapy读取mysql数据库_python3实战scrapy获取数据保存至MySQL数据库

python3使用scrapy获取数据然后保存至MySQL数据库,我上一篇写了如何爬取数据保存为csv文件,这一篇将会写如何将数据保存至数据库。思路大都一样,我列一个思路:1:获取腾讯招聘网。2:筛选信息获取我们想要的。…

共享单车技术含量,一篇文章全说透了!

来源:物联网智库 概要:共享单车已经成为了中国新四大发明之一,被输往了世界上很多城市。 共享单车已经成为了中国新四大发明之一,被输往了世界上很多城市。在我看来,虽然共享单车的实现并不复杂,其实质是一…

PostgreSQL 分页——示例

SQL 语句 select * from ( select * from logizard.t04_case_dtl_wk where slip_id order100~1~l001 order by case_id ) as T04 limit 5 offset 0 ;结果图

人工智能企业自动化的关键现状和战略影响

来源:腾股创投(微信ID: tengguvc) 人工智能和机器学习在亚马逊 Alexa 等面向消费者的应用领域取得了长足的进步,在企业内的的部署也不断涌现。 关于 AI 自动化对企业的影响范围和影响程度的意见不一。 一方面,牛津大学…