Java 文件 IO 操作

文章目录

    • 1. File类
    • 2. RandomAccessFile类
    • 3. 流类
      • 3.1 字节流
      • 3.2 字符流
      • 3.3 管道流
      • 3.4 ByteArrayInputStream、ByteArrayOutputStream
      • 3.5 System.in、System.out
      • 3.6 打印流 PrintStream
      • 3.7 DataInputStream、DataOutputStream
      • 3.8 合并流
      • 3.9 字节流与字符流的转换
      • 3.10 IO包类层次关系
    • 4. 字符编码
    • 5. 对象序列化

1. File类

File 类 是 java.io 包中唯一代表磁盘文件本身的对象

  • File(String dirPath) 构造生成 File 对象
import java.io.File;class FileDemo {public static void main(String[] args){File f = new File("file.txt");if(f.exists())f.delete();else{try{f.createNewFile();}catch(Exception e){System.out.println(e.getMessage());}}System.out.println("getName()获取文件名:"+f.getName());System.out.println("getPath()获取文件路径:"+f.getPath());System.out.println("getAbsolutePath()绝对路径:"+f.getAbsolutePath());System.out.println("getParent()父文件夹名:"+f.getParent());System.out.println("exists()文件存在吗?"+f.exists());System.out.println("canWrite()文件可写吗?"+f.canWrite());System.out.println("canRead()文件可读吗?"+f.canRead());System.out.println("isDirectory()是否是目录?"+f.isDirectory());System.out.println("isFile()是否是文件?"+f.isFile());System.out.println("isAbsolute()是否是绝对路径名称?"+f.isAbsolute());System.out.println("lastModified()最后修改时间:"+f.lastModified());System.out.println("length()文件长度-字节单位:"+f.length());}
}

输出:

getName()获取文件名:file.txt
getPath()获取文件路径:file.txt
getAbsolutePath()绝对路径:D:\gitcode\java_learning\file.txt
getParent()父文件夹名:null
exists()文件存在吗?true
canWrite()文件可写吗?true
canRead()文件可读吗?true
isDirectory()是否是目录?false
isFile()是否是文件?true
isAbsolute()是否是绝对路径名称?false
lastModified()最后修改时间:1614680366121
length()文件长度-字节单位:0

2. RandomAccessFile类

  • 随机跳转到文件的任意位置处读写数据,该类仅限于操作文件
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.charset.StandardCharsets;class FileDemo {public static void main(String[] args){File f = new File("file.txt");if(f.exists())f.delete();else{try{f.createNewFile();}catch(Exception e){System.out.println(e.getMessage());}}System.out.println("name获取文件名:"+f.getName());System.out.println("getPath()获取文件路径:"+f.getPath());System.out.println("getAbsolutePath()绝对路径:"+f.getAbsolutePath());System.out.println("getParent()父文件夹名:"+f.getParent());System.out.println("exists()文件存在吗?"+f.exists());System.out.println("canWrite()文件可写吗?"+f.canWrite());System.out.println("canRead()文件可读吗?"+f.canRead());System.out.println("isDirectory()是否是目录?"+f.isDirectory());System.out.println("isFile()是否是文件?"+f.isFile());System.out.println("isAbsolute()是否是绝对路径名称?"+f.isAbsolute());System.out.println("lastModified()最后修改时间:"+f.lastModified());System.out.println("length()文件长度-字节单位:"+f.length());}
}class Employee1{String name;int age;final static int LEN = 8;public Employee1(String name, int age){if(name.length() > LEN){name = name.substring(0,8);}else {while(name.length() < LEN)name = name + " ";}this.name = name;this.age = age;}
}
class RandomFileDemo{public static void main(String[] args) throws Exception{Employee1 e1 = new Employee1("Michael___",18);Employee1 e2 = new Employee1("Ming",19);Employee1 e3 = new Employee1("ABC",20);RandomAccessFile ra = new RandomAccessFile("employee.txt","rw");ra.write(e1.name.getBytes());ra.writeInt(e1.age);ra.write(e2.name.getBytes());ra.writeInt(e2.age);ra.write(e3.name.getBytes());ra.writeInt(e3.age);ra.close();RandomAccessFile raf = new RandomAccessFile("employee.txt","r");int len = 8;raf.skipBytes(12);//跳过第一个员工信息,名字8字节,年龄4字节System.out.println("第2个员工信息:");String str = "";for(int i = 0; i < len; ++i)str = str+(char)raf.readByte();System.out.println("name: "+str);System.out.println("age: "+raf.readInt());System.out.println("第1个员工的信息:");raf.seek(0);//移动到开始位置str = "";for(int i = 0; i < len; ++i)str = str+(char)raf.readByte();System.out.println("name: "+str.trim());System.out.println("age: "+raf.readInt());System.out.println("第3个员工的信息:");raf.skipBytes(12); // 跳过第2个员工信息str = "";for(int i = 0; i < len; ++i)str = str+(char)raf.readByte();System.out.println("name: "+str.trim());System.out.println("age: "+raf.readInt());raf.close();}
}

输出:

2个员工信息:
name: Ming    
age: 191个员工的信息:
name: Michael_
age: 183个员工的信息:
name: ABC
age: 20进程已结束,退出代码为 0

3. 流类

  • InputStream、OutputStream 字节流(处理字节、二进制对象)
  • Reader、Writer 字符流(字符、字符串)

处理流程:

  • 使用 File 类找到文件
  • 通过 File 类对象实例化 流的子类
  • 进行字节、字符的读写操作
  • 关闭文件流

3.1 字节流


import java.io.*;class IoDemo {public static void main(String[] args){// 写文件File f = new File("file.txt");FileOutputStream out = null;try{out = new FileOutputStream(f);}catch (FileNotFoundException e){e.printStackTrace();}byte b[] = "Hello Michael!".getBytes();try{out.write(b);}catch (IOException e){e.printStackTrace();}try{out.close();}catch (IOException e){e.printStackTrace();}// 读文件FileInputStream in = null;try{in = new FileInputStream(f);}catch (FileNotFoundException e){e.printStackTrace();}byte b1[] = new byte[1024];//开辟空间接收文件读入进来int i = 0;try{i = in.read(b1);//返回读入数据的个数}catch(IOException e){e.printStackTrace();}try{in.close();}catch (IOException e){e.printStackTrace();}System.out.println(new String(b,0,i));// Hello Michael!}
}

3.2 字符流

class CharDemo {public static void main(String[] args){// 写文件File f = new File("file.txt");FileWriter out = null;try{out = new FileWriter(f);}catch (IOException e){e.printStackTrace();}String str= "Hello Michael!";try{out.write(str);}catch (IOException e){e.printStackTrace();}try{out.close();}catch (IOException e){e.printStackTrace();}// 读文件FileReader in = null;try{in = new FileReader(f);}catch (FileNotFoundException e){e.printStackTrace();}char c1[] = new char[1024];//开辟空间接收文件读入进来int i = 0;try{i = in.read(c1);//返回读入数据的个数}catch(IOException e){e.printStackTrace();}try{in.close();}catch (IOException e){e.printStackTrace();}System.out.println(new String(c1,0,i));// Hello Michael!}
}

3.3 管道流

  • 主要用于连接两个线程间的通信
  • PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;class Sender extends Thread{private PipedOutputStream out = new PipedOutputStream();public PipedOutputStream getOutputStream() {return out;}public void run(){String s = new String("hello, Michael!");try{out.write(s.getBytes());//写入,发送out.close();}catch(IOException e){System.out.println(e.getMessage());}}
}class Receiver extends Thread{private PipedInputStream in = new PipedInputStream();public PipedInputStream getInputStream(){return in;}public void run(){String s = null;byte buf[] = new byte[1024];try{int len = in.read(buf);s = new String(buf, 0, len);System.out.println("收到以下讯息:"+s);in.close();}catch(IOException e){System.out.println(e.getMessage());}}
}class PipedStreamDemo {public static void main(String[] args){try{Sender sender = new Sender();Receiver receiver = new Receiver();PipedOutputStream out = sender.getOutputStream();PipedInputStream in = receiver.getInputStream();out.connect(in); // 将输出发送到输入sender.start();receiver.start();}catch (IOException e){System.out.println(e.getMessage());}}
}
// 输出 : 收到以下讯息:hello, Michael!

3.4 ByteArrayInputStream、ByteArrayOutputStream

  • 如果程序要产生一些临时文件,可以采用虚拟文件方式实现(使用这两个类)
class ByteArrayDemo{public static void main(String[] args) throws Exception{String tmp = "abcdefg**A";byte[] src = tmp.getBytes(); // src 为转换前的内存块ByteArrayInputStream input = new ByteArrayInputStream(src);ByteArrayOutputStream output = new ByteArrayOutputStream();new ByteArrayDemo().transform(input, output);byte[] result = output.toByteArray(); // result为转换后的内存块System.out.println(new String(result));// ABCDEFG**A}public void transform(InputStream in, OutputStream out){int c = 0;try{while((c=in.read()) != -1)//没有读到流的结尾(-1){int C = (int) Character.toUpperCase((char)c);out.write(C);}}catch (IOException e){e.printStackTrace();}}
}

3.5 System.in、System.out

  • System.in 对应键盘,属于 InputStream
  • Sytem.out 对应显示器,属于 PrintStream

3.6 打印流 PrintStream

class SystemPrintDemo{public static void main(String[] args){PrintWriter out = new PrintWriter(System.out);out.print("hello Michael");out.println("hello Michael");out.close();}
}

输出:

hello Michaelhello Michael进程已结束,退出代码为 0
class FilePrint{public static void main(String[] args){PrintWriter out = null;File f = new File("file1.txt");try{out = new PrintWriter(new FileWriter(f));}catch (IOException e){e.printStackTrace();}out.print("Hello Michael!!!");out.close();}
}

3.7 DataInputStream、DataOutputStream

import java.io.*;class DataStreamDemo {public static void main(String[] args) throws Exception{// 将数据写入文件DataOutputStream out = new DataOutputStream(new FileOutputStream("order.txt"));double prices[] = {18.99, 9.22, 14.22, 5.22, 4.21};int units[] = {10, 10, 20, 39, 40};String [] name = {"T恤衫", "杯子", "洋娃娃", "大头针", "钥匙链"};for(int i = 0; i < prices.length; ++i){//写入价格out.writeDouble(prices[i]);out.writeChar('\t');//写入数目out.writeInt(units[i]);out.writeChar('\t');//写入产品名称,行尾换行out.writeChars(name[i]);out.writeChar('\n');}out.close();//将数据读出DataInputStream in = new DataInputStream(new FileInputStream("order.txt"));double price;int unit;StringBuffer tempName;double total = 0.0;try{ // 文本读完后会抛出 EOF 异常while(true){price = in.readDouble();in.readChar();//跳过tabunit = in.readInt();in.readChar();//跳过tabchar c;tempName = new StringBuffer();while((c=in.readChar()) != '\n')tempName.append(c);System.out.println("订单信息:" + "产品名称:" + tempName+ ", \t 数量:" + unit + ", \t 价格" + price);total += unit*price;}}catch (EOFException e){System.out.println("\n 共需要:" + total + "元");}in.close();}
}

输出:

3.8 合并流

  • SequenceInputStream 类,可以实现两个文件的合并
import java.io.*;class SequenceDemo {public static void main(String[] args) throws IOException {// 两个文件输入流FileInputStream in1 = null, in2 = null;// 序列流SequenceInputStream s = null;FileOutputStream out = null;try{File inputfile1 = new File("1.txt");File inputfile2 = new File("2.txt");FileWriter wt = new FileWriter(inputfile1);wt.write("the first file.\nhaha! \n");wt.close();wt = new FileWriter(inputfile2);wt.write("the second file..");wt.close();File outputfile = new File("12.txt");in1 = new FileInputStream(inputfile1);in2 = new FileInputStream(inputfile2);s = new SequenceInputStream(in1, in2); // 合并两个输入流out = new FileOutputStream(outputfile);int c;while((c=s.read()) != -1)out.write(c);in1.close();in2.close();s.close();out.close();System.out.println("合并完成!");}catch(IOException e){e.printStackTrace();}}
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.9 字节流与字符流的转换

InputstreamReader 用于将一个字节流中的字节解码成字符
OutputstreamWriter 用于将写入的字符编码成字节后写入一个字节流

为了效率最高,最好不要直接用这两个类来读写,而是如下方法:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;class BufferDemo {public static void main(String[] args){BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));String str = null;while(true){System.out.println("请输入数字:");try{str = buf.readLine();}catch(IOException e){e.printStackTrace();}int i = -1;try{i = Integer.parseInt(str);i++;System.out.println("+1 后的数字为:" + i);break;}catch(Exception e){System.out.println("输入内容不是整数,请重新输入!");}}}
}

输出:

请输入数字:
abc
输入内容不是整数,请重新输入!
请输入数字:
123
+1 后的数字为:124进程已结束,退出代码为 0

3.10 IO包类层次关系




4. 字符编码

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;class EncodingDemo {public static void main(String[] args){try {byte[] b = "一起来学习Java吧!".getBytes("GB2312");OutputStream out = new FileOutputStream(new File("encode.txt"));out.write(b);out.close();}catch (IOException e){System.out.println(e.getMessage());}}
}

在这里插入图片描述
在这里插入图片描述

5. 对象序列化

对象序列化,是指将对象转换成二进制数据流的一种实现手段。
通过将对象序列化,可以方便地实现对象的传输及保存。

在Java中提供有 ObjectInputStreamObjectOutputStream 这两个类用于序列化对象的操作。

ObjectInputStreamObjectOutputStream 这两个类,用于帮助开发者完成保存和读取对象成员变量取值的过程,但要求读写或存储的对象必须实现Serializable 接口,但 Serializable 接口中没有定义任何方法,仅仅被用做一种标记,以被编译器作特殊处理。

import java.io.*;class Person6 implements Serializable{ // 实现了Serializable,可序列化private String name;private int age;public Person6(String name, int age){this.name = name;this.age = age;}public String toString(){return "name: " + name + ", age: " + age;}
}public class SerializableDemo {public static void serialize(File f) throws Exception{OutputStream outputFile = new FileOutputStream(f);ObjectOutputStream cout = new ObjectOutputStream(outputFile);cout.writeObject(new Person6("Michael", 18));cout.close();}public static void deserialize(File f) throws Exception{InputStream inputFile = new FileInputStream(f);ObjectInputStream cin = new ObjectInputStream(inputFile);Person6 p = (Person6) cin.readObject();System.out.println(p);// name: Michael, age: 18}public static void main(String[] args) throws Exception{File f = new File("SerializedPersonInfo.txt");serialize(f);deserialize(f);}
}
  • 如果不希望类中属性被序列化,加入关键字 transient
private transient String name;
private transient int age;输出: name: null, age: 0

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

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

相关文章

java dsp_GitHub - Onemeaning/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...

JavaDsp数字信号处理(DSP)方面的Java封装&#xff0c;包含常用的一些处理方法&#xff0c;如滤波、信号变换等等。该类库是我本科毕业设计中的一部分&#xff0c;绝大部分都是我自己写实现的&#xff0c;很少部分算法有我另外几个朋友参与讨论和实现&#xff0c;在此表示感谢。…

简单banner制作

简单做了一个banner,效果不是很好&#xff0c;主要温习了蒙版知识和滤镜的使用&#xff0c;其中使用&#xff08;图像 > 调整 > 照片滤镜&#xff0c; 可以让图片融合得更协调&#xff0c;另外图片上添加斜线做背景&#xff0c;这些小技巧在做banner时&#xff0c;能打造…

苹果11怎么录屏_苹果11怎么设置骚扰电话号码

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。系统版本为&#xff0c;苹果11设置拦截骚扰电话的方法如下&#xff1a;1、首先打开手机设置&#xff0c;找到【勿扰模式】&#xff1b;2、将勿扰模式开启后&#xff0c;点击下方【允…

BigTable的开源实现:HBase数据库

learn from 从0开始学大数据&#xff08;极客时间&#xff09; 文章目录1. 两种数据库2. HBase 可伸缩架构3. HBase 可扩展数据模型4. HBase高性能存储1. 两种数据库 关系数据库&#xff08;RDBMS&#xff09;缺点&#xff1a; 糟糕的 海量数据处理能力、僵硬的设计约束 从 …

java toast_Android中Toast的用法简介

Toast是Android中用来显示显示信息的一种机制&#xff0c;和Dialog不一样的是&#xff0c;Toast是没有焦点的&#xff0c;而且Toast显示的时间有限&#xff0c;过一定的时间就会自动消失。下面用一个实例来看看如何使用Toast。1.默认效果代码Toast.makeText(getApplicationCont…

流式计算的代表:Storm、Flink、Spark Streaming

learn from 从0开始学大数据&#xff08;极客时间&#xff09; 文章目录1. Storm2. Spark Streaming3. Flink对存储在磁盘上的数据进行大规模计算处理&#xff0c;大数据批处理对实时产生的大规模数据进行处理&#xff0c;大数据流计算 1. Storm 一些系统 业务逻辑 和 数据处…

windows7正版验证_Windows7 寿终正寝:那些一并消逝的软件你知多少?

IT服务圈儿有温度、有态度的IT自媒体平台来源&#xff1a;太平洋电脑网本月&#xff0c;一代经典操作系统微软Windows 7正式迎来了生命周期的完结。微软宣布&#xff0c;此后将不再为Win7提供任何形式的更新&#xff0c;包括安全更新、稳定性更新和功能更新&#xff1b;而仍在使…

stotybord如何添加子视图_Revit软件技巧合集(建筑构件、视图处理、建筑表现、高级技巧)...

Revit软件技巧合集164套(建筑构件、视图处理、建筑表现、高级技巧)BIM技术在我国建筑行业受到了越来越多的关注&#xff0c;也得到了快速地发展。BIM应用软件也如雨后春笋般的涌现&#xff0c;随着时间的推移&#xff0c;revit在BIM应用中将成为设计利器&#xff0c;而在工程施…

ad域不去用frs_Windows Server 2008搭建AD域控服务器 - 小王同学!

AD域安装过程安装DNS服务器一路下一步这里选安装到这里DNS服务器安装成功&#xff0c;可以在主页面看到我们安装的角色安装DNS服务器后我们需要重启服务器安装AD域服务新增AD域服务角色一路下一步——安装即可两条安装成功提示&#xff0c;重启服务器角色中选择AD域服务&#x…

IE下及标准浏览器下的图片旋转(二)—— Canvas(2)

文章过长&#xff0c;一篇无法保存 IE下及标准浏览器下的图片旋转&#xff08;二&#xff09;—— Canvas&#xff08;1&#xff09; 同样&#xff0c;作为最后&#xff0c;我们使用使用jquery也为canvas写个旋转demo&#xff1a; javascript&#xff1a; $(function () { …

大数据技术 思维导图

learn from 从0开始学大数据&#xff08;极客时间&#xff09;

win10win键无反应_台式电脑开机主机没反应怎么办 电脑开机主机没反应解决【详解】...

按了开机按钮后我的台式电脑主机还是没反应&#xff0c;怎么办呢?下面由小编给你做出详细的台式电脑开机主机没反应解方式介绍。(此文主要针对台式电脑做介绍)台式电脑开机主机没反应解方式一&#xff1a;拔掉电源线 然后重复的按开机键5-10下 进行放静电操作 然后再插上电源线…

hadoop 单机伪分布式安装步骤

文章目录1. 安装 Java2. 配置SSH无密码登录3. 下载 hadoop4. 配置环境变量5. 报错处理参考环境 Centos7参考&#xff1a;https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.htmlhttps://blog.csdn.net/bingduanlbd/article/details/5187…

Eclipse 为jar包加入 Java Source和Javadoc(如何向Eclipse中导入源码和doc)

: 当我们在MyEclipse中加入Struct&#xff0c;只是引入了jar包&#xff0c;这时使用jar包里面的类&#xff0c;是无法看到源码的&#xff0c;看到的只是这样 是反编译后的一些东西 加入源码 那么如果看到源码呢&#xff0c;就需要导入了 找到这个类对应的jar包&#xff0c;下载…

ppt生成器_小米发布会ppt词云怎么做的

导语在幻灯片中使用文字云或者文字墙是一件非常酷的事情&#xff0c;之前我们看过的很多发布会PPT都有出现文字云设计。利用文字云工具就告别麻烦的排版&#xff0c;让ppt效果更专业&#xff0c;新颖小米发布会ppt 微词云我们先看下几种文字云案例罗振宇《时间的朋友》跨年演讲…

Java实验方法参数传递与递归_4.3类的结构之二:方法(return,重载,可变个数形参,值传递,递归)...

类的设计中&#xff0c;两个重要结构之二&#xff1a;方法* 方法&#xff1a;描述类应该具有的功能。* 比如&#xff1a;Math类&#xff1a;sqrt()\random()\ ..* Scanner类&#xff1a;nextXxx() ..* Arrays类&#xff1a;sort()\binarySearch()\toString()\equals()\..* * 1.…

钢琴块2电脑版_快陪练教师端电脑版下载_快陪练教师端pc版免费下载[在线教学]...

快陪练教师端电脑版是一款钢琴陪练教师的在线教学软件&#xff0c;快陪练教师端电脑版支持语音互动功能。快陪练教师端电脑版可以帮助老师在线教孩子学习钢琴&#xff0c;软件可以让用户清晰地看到学生弹钢琴时的指法&#xff0c;并及时为其纠正不正确的指法&#xff0c;它引入…

LeetCode 1105. 填充书架(DP)

文章目录1. 题目2. 解题1. 题目 附近的家居城促销&#xff0c;你买回了一直心仪的可调节书架&#xff0c;打算把自己的书都整理到新的书架上。 你把要摆放的书 books 都整理好&#xff0c;叠成一摞&#xff1a;从上往下&#xff0c;第 i 本书的厚度为 books[i][0]&#xff0c…

java 不重启部署_一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

一、通过配置文件控制静态资源的热部署在配置文件 application.properties 中添加&#xff1a;#表示从这个默认不触发重启的目录中除去static目录spring.devtools.restart.excludeclasspath:/static/**或者使用&#xff1a;#表示将static目录加入到修改资源会重启的目录中来spr…

判断深度学习模型的稳定性_全自动搭建定制化深度学习模型

EasyDL服务自动化生成与部署EasyDL定制化训练和服务平台基于百度业界领先算法&#xff0c;旨在为用户量身定制业务专属AI模型。通过灵活的配置&#xff0c;用户可以将模型发布为公有云API、设备端离线SDK、本地服务器部署包、软硬一体方案等多种输出方式的AI服务。目前&#xf…