百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Java教程Java 文件 IO 操作

bigegpt 2024-09-24 07:21 3 浏览

IO流是java在执行过程中整体执行的核心元素,如何掌握IO流操作,需要通过深度掌握输入输出的技术,加强在java的执行层面提升运行速度,加强java的运行效率,深度掌握java开发输出技巧,拉勾IT课小编分析这一技术。

文件目录:文件夹,管理文件,linux下有权限、操作符、用户组、用户等


路径分割符:

表示windows系统文件目录分割符/表示mac/linux下的路径分割符

java代码在windows下写某个文件的话需要下面的方式

D:\soft\sd.txt其中一个单斜杠是用来转义的

java代码在linux或者Mac下写某个文件的话需要下面的方式

usr/local/soft/sd.txt其中一个单斜杠是用来转义的

代码和文件目录的关系: 对文件和目录增删改查IO,输入和输出Input/Output把持久化设备上的数据读取到内存中的动作称为输入,Input操作内存中的数据持久化到设备上的动作,Output输出操作一般把输入和输出动作称为IO操作,IO分为网络IO和文件IO

java文件类File:

主要是对计算机文件目录的操作,对文件和目录的增删改查,File类表示磁盘中存在的文件和目录实现了Serializable,Comparable两大接口,可进行序列化和比较File.separator目录分隔符,在不同的系统下不一样,windows下是"",mac/Linux下是"/",操作文件时可以用来连接目录的分隔符

常见的构造函数://路径和文件名的拼接public File(String pathname)

//父路径,子路径public File(String parent, String child)

//获取带文件名的文件路径,即new File构造函数传入的路径String getPath()

String dir = "C:\Users\79466\Desktop\";String name = "a.txt";File file = new File(dir, name);// File file = new File(dir);目录对象

System.out.println(file.getPath()); //打印文件的路径和文件名System.out.println(File.separator); //打印不同系统的文件分隔符

//常用的文件操作apifile.getPath(); //获取带文件名的文件路径,C:Users79466Desktopa.txtfile.getName(); //获取文件名,a.txtfile.getAbsolutePath(); //获取文件的绝对路径C:Users79466Desktopa.txtfile.getParent(); //获取文件的父路径C:Users79466Desktopfile.exists(); //文件或者目录是否存在file.isFile(); //是否是一个文件file.isDirectory(); //是否是一个目录file.isAbsolute(); //是否是绝对路径

//如果file是目录,获取文件目录下所有的文件及目录的名称,操作对象是目录,如果是文件会报错String[] arr = file.list();for (String temp : arr) {System.out.println(temp);}

//创建指定目录File mkdir = new File(dir + "\xd");mkdir.mkdir(); //创建一级目录

File mkdirs = new File(dir + "\xd\aa\bb\cc"); //或者dir + "\xd\aa\bb\cc\"mkdirs.mkdirs(); //创建多级目录File newFile = new File(dir + "\xxxx.txt");//如果dir不存在或者创建文件失败需要捕获异常try {newFile.createFile();} catch (IOException e) {e.printStackTrace();}

newFile.delete(); //删除操作,当前文件如果是最终的文件才可以删除,如果是目录,里面还有文件,需要先删除文件才能删除该目录

File的构造函数只是创建一个File实例,即使目录错误也不会报错,因为没有对文件进行操作输出流: 程序到外界设备 输入流: 外界设备到程序处理数据类型分类字符流: 处理字符相关,如文本数据( txt文件),Reader / Writer字节流: 处理字节相关,声音或者图片等二进制,InputStream/OutputStream两者区别:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节字节流可以处理几乎所有文件,字符流只能处理字符类型的数据,如果文件都是中文文本的话可以使用字符流,速度更快,更省空间功能不同,但是具有共性内容,抽象成4个抽象类字符流Reader/Writer字节流InputStream/OutputStream

使用的时候都不会使用抽象类进行实现,开发使用对应的子类

字节流:InputStream:实现类及子类有FileInputStream(这个类用的最多, 可以用BufferedInputStream提高性能)、ObjectInputStream(对象输入流,序列化的时候) 、ByteArrayInputStreamOutputStream和InputStream一样

int read(byte[] buf) //从输入流中读取一定数量的字节,并将其存储在缓冲区数组buf中,返回实际读取的字节数

int available() //返回这个流中有多少个字节数,可以把buf数组长度定为这个

void close() throws IOException //关闭输入流并释放与该流关联的系统资源

FileInputStream字节输入流:

//传入文件所在地址public FileInputStream(String name) throws FileNotFoundException//传入文件对象public FileInputStream(File file) throws FileNotFoundException

public static void main (String [] args) {File file = new File(dir, name);InputStream inputStream = new FileInputStream(file);//读取一个字节int read = inputStream.read();//字节对应的ASCII码System.out.println(read);//强转成字符System.out.println((char)read);}

inputStream.skip(); //跳过,从输入流中跳过并丢弃n个字节的数据

byte[] buf = new byte[1024];int length;//一次性读取buf.length个字节并放到buf数组中,返回类型是读取到的字节数while ((length = inputStream.read(buf)) != -1) {System.out.println(new String(buf, 0, length)); //从开始,长度是3System.out.println(new String(buf, 0, length, "UTF-8"));}

FileOutputStream字节输出流:

构造://传入输出的文件地址public FileOutputStream(String name)

//传入目标输出的文件对象public FileOutputStream(File file)

//传入目标输出的文件对象,是否可以追加内容public FileOutputStream(File file, boolean append)

public static void main(String [] args) {

String target = "a.txt";InputStream inputStream = new FileInputStream(file);//会创建文件,但是不会创建多级目录// OutputStream outputStream = new FileOutputStream(dir + File.separator + target);//不覆盖文件,只追加数据OutputStream outputStream = new FileOutputStream(dir + File.separator + target, true);byte[] buf = new byte[1024];int length;

//一次性读取buf.length个字节并放到buf数组中,返回类型是读取到的字节数while ((length = inputStream.read(buf)) != -1) {//按字节数组的长度写出outputStream.write(buf, 0, length);}

//异常处理见下面,此处如果上面出现异常就无法关闭inputStream.close();outputStream.close();}

缓冲Buffer:

内存空间的一部分,在内存空间预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分空间就叫做缓冲区,缓冲区默认大小是8k,使用缓冲区暂存数据,可以减少和磁盘的交互,读入时与磁盘连接后读入较多的数据到缓冲区,内存再慢慢去消耗

BufferInputStream缓冲字节输入流,读取数据时,与磁盘连接一次读取到内存,缓冲区满时会再读取下一截数据重新填充到缓冲区构造函数://对输入流进行包装,里面默认的缓冲区是8kpublic BufferedInputStream(InputStream in);//对输入流进行包装,创建具有指定缓冲区大小的Bufferpublic BufferedInputStream(InputStream in, int size);

常用方法://从输入流中读取一个字节public int read();

//从字节输入流中给定偏移量处开始将各字节读取到指定的byte数组中public int read(byte[] buf, int off, int len);

//关闭资源,关闭这个流即可,InputStream会在里面被关闭void close();

BufferOutputStream缓冲字节输出流,当缓冲区满时,会自动写出到磁盘构造同BufferInputStream常用方法://向输出流中输出一个字节public void write(int b);

//将指定byte数组中从偏移量off开始的len个字节写入缓冲的输出流public void write(byte[] buf, int off, int len);

//刷新此缓冲的输出流,强制使所有缓冲的输出字节被写出到底层输出流中,当缓冲区的大小未满时,需要手动刷到磁盘public void flush();

//关闭释放资源,OutputStream会在里面被关闭,JDK7新特性try (在这里声明的 流 会自动关闭){}void close();

缓冲输入输出流进行文件拷贝:try {FileInputStream fis = new FileInputStream("C:\Users\79466\Desktop\test\a.txt");BufferedInputStream bis = new BufferedInputStream(fis);

FileOutputStream fos = new FileOutputStream("C:\Users\79466\Desktop\test\copy.txt");BufferedOutputStream bos = new BufferedOutputStream(fos);int size;byte[] buf = new byte[1024];

while (( size = bis.read(buf)) != -1) {//将字节输出流写到缓冲区里面,等缓冲区满后自动写出bos.write(buf, 0, size);}//刷新此缓冲区的输出流,才可以保证数据全部输出完成,关闭的时候也会进行刷新,写了也不要紧,也就是多刷一次,close方法的关闭前会先进行刷新// bos.flush();

//内部会关掉InputStream和OutputStream异常处理见下面,此处如果上面出现异常就无法关闭bis.close();// close源码里面会有flush,可以不用单独调用flush,jdk7之后close源码里的try里面声明了OutputStream,会自动关闭outputStream流bos.close();} catch (Exception e) {e.printStackTrace();}

流的关闭顺序,后开的先关,如果A依赖B,先关闭B

IO的异常处理:大部分公司的做法: 在finally里面进行关闭catch (Exception e) {e.printStackTrace();} finally {if(bis != null) {try {bis.close();}catch () {e.printStackTrace();}finally {if(bos != null) {try {bos.close();}catch (Exception e) {e.printStackTrace();}}}}}

jdk7之后的做法:try-with-resourcetry里面声明的OutputStream和InputStream会自动关闭,jdk7之后的InputStream都实现了AutoCloseable在try里面定义多个资源,关闭的顺序是最后在try()定义的资源最先关闭

try (FileInputStream fis = new FileInputStream("C:\Users\79466\Desktop\test\a.txt");BufferedInputStream bis = new BufferedInputStream(fis);FileOutputStream fos = new FileOutputStream("C:\Users\79466\Desktop\test\copy.txt");BufferedOutputStream bos = new BufferedOutputStream(fos);) {

int size;byte[] buf = new byte[1024];while(( size = bis.read(buf)) != -1 ) {bos.write(buf, 0, size);}

bos.flush();} catch (Exception e) {e.printStackTrace();}

关于字节:

字节(Byte简写B):作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。最常用的字节是八位的字节,即它包含八位的二进制数。1B=8bit,1KB=1024B一个英文字母(不分大小写)占一个字节的空间。字节作为一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数。换算为十进制,最小值-128,最大值127。如一个ASCII码就是一个字节UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节字符串转换为字节数组:byte[] b = string.getBytes();字节转换成字符串:String string = new String(byte[] bytes, Charset charset); byte[] b="我是一个兵".getBytes("GBK"); GBK编码的字符串转为字节数组需要把string保存到文件中,必须把string转换成一个有序的字节流,以便系统在硬盘上做物理保存。String到字节流的转换涉及到使用何种编码,使用不同的编码得到的字节码不同

相关推荐

5分钟调色大片的方法(5分钟调色大片的方法有哪些)

哈喽大家好。在大家印象中一定觉得ps非常难学非常难。大家不要着急,小编的教学都是针对ps零基础的同学的,而且非常实用哦。只要大家跟着图文练习一两遍,保证大家立马学会~!好了,废话少说,下面开始我们今天...

闪白特效原来是这么用的(闪白特效怎么使用)

作者|高艳侠订阅|010-86092062闪白特效是影视作品中应用比较多的效果之一,那么具体该在哪些场景使用闪白特效?具体该如何操作?下面就以AdobePremiere(以下简称PR)为例,...

ppt常用小图标去哪里找?3个矢量素材网站推荐!

ppt是一个注重可视化表达的演示载体,除了高清图片,ppt中另一类常用的素材是各种小图标,也叫矢量图标,巧妙运用小图标能提升整体美观度和表现力,那么ppt常用小图标去哪里找呢?为方便各位快速找到合适的...

有什么好用的截图录屏工具?试试这9款

经常有朋友反馈苦于缺乏截屏和录屏的趁手工具,本期我们分享几个相当好用的截屏和录屏工具,希望能帮到大家。ScreenToGifScreenToGif是一款免费且开源的录屏工具。此款工具最大的特点是可以...

配色苦手福音!专业快速色环配色PS插件

今天橘子老师给的大家介绍的是一款快速配色的插件,非常强大配色苦手福音来啦!(获取方式见文末)【插件介绍】配色在后期设计中占有主导地位,好的配色能让作品更加抢眼Coolorus这款专业的配色插件,能够...

如何用PS抠主体?(ps怎么抠主体)

1.主体法抠图-抠花苞和花梗导入一张荷花苞的照片,点击上图中顶部“选择”菜单栏,下拉单击“主体”。可以看到,只有花苞被选中,但是花梗并没有被选中。接下来单击上图中左侧工具栏的“快速选择工具”,上图中顶...

2799元的4K电视,有保障吗?(买4k电视机哪个品牌好)

在上一期《电脑报》的3·15专题报道中,我们揭露了一款不靠谱的42英寸4K智能电视——TCLD42A561U。这款售价2699元的4K智能电视不仅4K画质方面存在严重问题,而且各种功能和应用体验也不理...

苹果电脑的Touch Bar推出一段时间了 这款工具可以帮你开发适用于它的APP

距离苹果推出带有TouchBar的MacBookPro已经有一段时间了,除了那些像Adobe、Google和Microsoft大公司在开发适用于TouchBar的应用之外,其实还有很多独立的开...

如魔法般吸取颜色的桌灯(如魔法般吸取颜色的桌灯叫什么)

色彩为生活带来的感官刺激,逐渐被视为理所当然。一盏桌灯运用它的神奇力量,将隐藏于物件中的颜色逐一释放,成为装点环境的空间魔法师。ColorUp是一款可以改变颜色的吸色台灯,沿用传统灯泡的造型,融入了拾...

一篇文章带你用jquery mobile设计颜色拾取器

【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...

ps拾色器快捷键是什么?(ps2019拾色器快捷键)

ps拾色器快捷键是什么?文章末尾有获取方式,按照以下步骤就能自动获得!学会制作PS特效需要一定程度的耐心和毅力。初学者可以从基本的工具和技术开始学习,逐渐提高他们的技能水平。同时,观看更多优秀的特效作...

免费开源的 Windows 截图录屏工具,支持 OCR 识别和滚动截图等

功能很强大、安装很小巧的免费截图、录屏工具,提供很多使用的工具来帮我么能解决问题,推荐给大家。关于ShareXShareX是一款免费的windows工具,起初是一个小巧的截图工具,经过多年的迭...

入门到精通系列PS教程:第13篇 · 拾色器、颜色问题说明及补充

入门到精通系列PS教程:第13篇·拾色器、颜色问题说明及补充作者|侯潇问题说明我的第12篇教程里,有个小问题没有说清楚。要说是错误,又不算是错误,只是没有说准确。写完那篇教程后,因为已经到了深...

PS冷知识:用吸管工具吸取屏幕上的任意颜色

今天,我们给大家介绍PS中的一个冷知识:用吸管工具可以吸取屏幕上的任意颜色。其实,操作起来是非常简单的。大多数情况下,我们认为,PS的吸管工具只能吸取PS软件作图区域范围内的颜色,最多加上画布四周的...

Windows 11 将提供内置颜色选择器工具

Windows11内置了颜色选择器,可以扫描并识别屏幕上的颜色并生成颜色代码。此外,微软还利用人工智能技术,让屏幕上的文本扫描和选择变得更加便捷。这两项功能均已在SnippingToolv1...