当前位置: 首页 > news >正文

高级编程--第四章 输入和输出处理

1、目标

了解输入输出的概念

使用FIle类操作文件或目录

理解流的概念及分类

会使用字节流读写文本文件

会使用字符流读写文本文件

会使用字节流读写二进制文件

使用序列化和反序列化保持和恢复对象信息

2、java I/O

2.1 文件

什么是文件?

相关记录或放在一起的数据的集合

文件一般存储在哪?

java程序如何访问文件属性

java API: java.io.File类

File类访问文件属性

File file = new File(String pathname);

File类常用方法

方法名称

说明

boolean exists( )

判断文件或目录是否存在

boolean isFile( )

判断是否是文件

boolean isDirectory( )

判断是否是目录

String getPath( )

返回此对象表示的文件的相对路径名

String getAbsolutePath( )

返回此对象表示的文件的绝对路径名

String getName( )

返回此对象表示的文件或目录的名称

boolean delete( )

删除此对象指定的文件或目录

boolean createNewFile( )

创建名称的空文件,不创建文件夹

long length()

返回文件的长度,单位为字节, 如果文件不存在,则返回 0L

package Test;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;public class Test01 {public static void main(String[] args) throws Exception {//File类的使用String path = "G:\\xxx\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\Test\\test000";File file  = new File(path);//判断文件是否存在System.out.println(file.exists());//判断是否时文件System.out.println(file.isFile());//判断是否为目录System.out.println(file.isDirectory());//返回此对象表示的文件的相对路径System.out.println(file.getPath());//返回此对象表示的文件的绝对路径System.out.println(file.getAbsolutePath());//返回此对象表示的文件或目录名称System.out.println(file.getName());//删除此对象指定的文件或目录System.out.println(file.delete());//创建名称的空文件。不创建文件夹System.out.println(file.createNewFile());//返回文件的长度,单位为字节,入果文件不存在,返回0LSystem.out.println(file.length());}
}
读写文件

通过流来读写文件

流 是一组有需的数据序列

以先进先出的方式发送信息的通道

java流的分类

输入输出流是相对于计算机内存来说的

字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流

FileInputStream

inputStream类常用方法

int read( )

int read(byte[] b)

int read(byte[] b,int off,int len)

void close( )

int available():可以从输入流中读取的字节数目

子类FileInputStream常用的构造方法

FileInputStream(File file)

FileInputStream(String name)

使用FIleInputStream读文本文件

FileOutputStream

OutputStream类常用方法

void write(int c)

void write(byte[] buf)

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

void close()

void flush():强制把缓冲区的数据写到输出流中

子类FileOutputStream常用的构造方法

FileOutputStream (File file)

FileOutputStream(String name)

FileOutputStream(String name,boolean append)

1.前两种构造方法在向文件写数据时将覆盖文件中原有的内容

2.创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件

使用FileOutputStream 写文本文件

常见错误

package Test;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Array;
import java.util.ArrayList;public class Test02 {public static void main(String[] args) {File file = new File("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\Test\\test000");File file1 = new File("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\Test\\test0001");//FileInputStream类常用方法try{FileInputStream fis = new FileInputStream(file);//读取文本文件数据//文件中有多少字符System.out.println(fis.available());//从文件中一个字节  并且以ASII的形式输出   比如这里文件中第一个字符为1,那么输出的就为49System.out.println(fis.read());//那么我们这里要想得到文件中的字符,并且输出出来就可以对读取到的内容进行类型转换System.out.println((char) fis.read());//这里我们看到输出为2,是我们的第二个字符,这是为什么呢,// 这是因为read方法执行就像 i++ 一样,每当我们执行一次read,他就会往后偏移一次,所以我们前面已经// 执行过一次read方法,所以这里我们再次执行read方法指向的就是第二个字符。//read(byte[] array) - 从文件中读取字节并存储在指定的数组中byte[] b = new byte[1024];//这里我们看到read方法返回值为9,这是因为这里的read不再是指向了,而是把它当前在文件中的位置以及之后的//数据全部读出并写入到b数组中,并返回所读的字符个数。所以这里的9是它读到并且如b中的字符总数System.out.println(fis.read(b));System.out.println(b[0]);//那么我们再写一次read还能读到字符码//可以看到这里返回-1,没有读到字符,所以read(b)方法也会改变指向System.out.println(fis.read());//read(byte[] array, int start, int length) - 从文件中读取等于length的字节数,// 并从位置start开始存储在指定的数组中//我们重新创建一个对象试试FileInputStream fis1 = new FileInputStream(file1);byte[] b1 = new byte[1024];
//            System.out.println(fis1.read(b1,0,fis1.available()));for (byte t:b1){if (t == 0){
//                    System.out.print((char)t);break;}System.out.print((char)t);}//skip()方法//要丢弃和跳过指定//的字节数,可以使用skip()方法。例如//跳过五个字符//没有返回值
//            System.out.println(fis.skip(5));//关闭服务
//            fis.close();
//            fis1.close();//FileOutputStream//常用方法File file2 = new File("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\Test\\test0002");FileOutputStream fos = new FileOutputStream(file2,true);//writer,写入字符,与read一样,一个字符一个字符输入,// 并且会输出到控制台,这里是把输入的数字通过ASII转换为字符输入到文件中
//            fos.write(123);//void write(byte[] array) - 将指定数组中的字节写入输出流//这里直接使用b1或b会报错,这是因为b和b1里的元素并没有全部被实例化,
//            fos.write(b1);//所以这里需要添加长度来写入     这里使用fis1.read函数来获取写入到b1数组中的数组真正的字符数int numRead = fis1.read(b1, 0, fis1.available());System.out.println(numRead);fos.write(b1,0,numRead);fis.close();fis1.close();fos.close();}catch (IOException iox){iox.getStackTrace();}}
}

Reader类

reader类常用方法

int read( )

int read(char[] c)

read(char[] c,int off,int len)

void close( )

子类InputStreamReader常用的构造方法

InputStreamReader(InputStream in)

InputStreamReader(InputStream in,String charsetName)

FileReader类

FileReader类是InputStreamReader的子类

FileReader(File file)

FileReader(String name)

该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型

System.out.println(System.getProperty("file.encoding"));

获得本地平台的字符编码类型

使用FileReader读取文件

与字节流FileInputStream类实现文本文件读取步骤类似

引入相关的类

import java.io.Reader;
import java.io.FileReader;
Import java.io.IOExceprion;

创建FileReader对象

Reader fr= new FileReader("D:\\myDoc\\简介.txt");

读取文本文件的数据

fr.read(); 

关闭相关的流对象

fr.close();

BufferReader类

如何提高字符流读取文本文件的效率

使用FileReader类与BufferedReader类

BufferedReader类是Reader类的子类

BufferedReader类带有缓冲区

按行读取内容的readLine()方法

BufferedReader类

BufferedReader常用的构造方法

BufferedReader(Reader in)

子类BufferedReader特有的方法

readLine()

使用 BufferedReader读文本文件

解决读取时中文乱码

读取包含中文的文本文件时,可能出现中文乱码,怎么办?

FileReader fr = new FileReader("c:\\myDoc\\hello.txt");
BufferedReader br=new BufferedReader(fr); FileInputStream fis=new FileInputStream("c:\\myDoc\\hello.txt");
//使用InputStreamReader并设置编码格式
InputStreamReader fr=new InputStreamReader(fis,"UTF-8"); 
BufferedReader br=new BufferedReader(fr); 

Writer类

常用方法

write(String str)

write(String str,int off,int len)

void close()

void flush()

子类OutputStreamWriter常用的构造方法

OutputStreamWriter(OutputStream out)

OutputStreamWriter(OutputStream out,String charsetName)

FileWriter类

FileWriter类是OutputStreamWriter的子类

FileWriter (File file)

FileWriter (String name)

该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型

使用FileWriter写文件

BufferedWriter类

如何提高字符流写文本文件的效率?

使用FileWriter类与BufferedWriter类

BufferedWriter类是Writer类的子类

BufferedWriter类带有缓冲区

BufferedWriter常用的构造方法

BufferedWriter(Writer out)

使用 BufferedWriter写文件

读取二进制文件

DataInputStream类

FileInputStream的子类

与FileInputStream类结合使用读取二进制文件

DataOutputStream

FileOutputStream的子类

与FileOutputStream类结合使用写二进制文件

使用DataInputStream读取二进制文件

使用DataOutputStream读取二进制文件

2.2 序列化和反序列化

序列化和反序列化的过程

序列化是将对象的状态写入到特定的流中的过程

反序列化则是从特定的流中获取数据重新构建对象的过程

实现序列化

使用集合保存对象,可以将集合中的所有对象序列化

package Test;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class xuliehua {public static void main(String[] args) {//实现对象的序列化,序列化可以理解为对象以特定的编码形式输出到文件中保存//实例化User类   注意 User类必须实现接口Serializable,  用于区分被实例化的类try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\Test\\test01.txt"));) {User user = new User("张三","123123123",29);//创建序列化流//实现序列化并写入到文件中oos.writeObject(user);
//            oos.close();} catch (Exception e) {e.printStackTrace();}}
}

实现反序列化

如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取

package Test;import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class fanxuliehua {public static void main(String[] args) {//实现反序列化也是需要先创建输入流,然后用我们的对象来接取序列化的对象try {ObjectInputStream ois= new ObjectInputStream(new FileInputStream("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\Test\\test01.txt"));User u = (User) ois.readObject();System.out.println(u);} catch (Exception e) {e.printStackTrace();}}
}

练习

练习一

需求说明实现查看文件属性、创建和删除文件功能

package exercise01;import java.io.File;
import java.sql.SQLOutput;public class Test {public static void main(String[] args) {File file= new File("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\exercise01\\test");//判断是否拿到文件System.out.println(file.exists());//判断是否是文件System.out.println(file.isFile());//查看文件属性System.out.println("文件名: " + file.getName());//相对路径System.out.println("相对路径:" + file.getPath());//绝对路径System.out.println("绝对路径:" + file.getAbsolutePath());//文件大小System.out.println("文件大小为:" + file.length());}
}

练习二

文件“我的青春谁做主.txt”位于D盘根目录下,要求将此文件的内容复制到C:\myFile\my Prime.txt中

package exercise02;import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileOutputStream;public class Test {public static void main(String[] args) throws IOException{//读取文件FileInputStream fis = new FileInputStream("G:\\我的青春谁做主.txt");byte[] b = new byte[100];
//        System.out.println(fis.available());
//        System.out.println(fis.read());while (fis.read(b, 0, fis.available()+1)!=-1) {//将字节数组转换为字符串System.out.println(new String(b));}byte[] b1 = new byte[100];FileOutputStream fos = new FileOutputStream("F:\\myfile\\my Prime.txt");FileInputStream fis1 = new FileInputStream("F:\\myfile\\my Prime.txt");fos.write(b,0,b.length);while (fis1.read(b1, 0, b1.length)!=-1) {//将字节数组转换为字符串System.out.println(new String(b1));}fis.close();fos.close();}
}

练习三、

按照刚才读取的模板文件pet. template的模板格式保存宠物数据到文本文件,即把{name}、{type}、{master}替换为具体的宠物信息,将替换后的内容写入到C:\myDoc\pet.txt中

package exercise03;import java.io.*;public class Test {public static void main(String[] args) {try{String path = "G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\exercise03";Reader fr = new FileReader(path + "\\template");BufferedReader br = new BufferedReader(fr);
//            System.out.println(br.readLine());String str1 =br.readLine();System.out.println(str1);str1 = str1.replace("{name}","偶偶");str1 = str1.replace("{type}","狗狗");str1 = str1.replace("{master}","李伟");br.close();fr.close();Writer fw = new FileWriter(path + "\\pet");BufferedWriter bw = new BufferedWriter(fw);bw.write(str1);bw.flush();fw.close();}catch (Exception e ){e.printStackTrace();}}
}

练习四

需求说明图片star.jpg位于C盘根目录下,要求将此图片复制到D:\myDoc\myPicture.jpg需求说明图片star.jpg位于C盘根目录下,要求将此图片复制到D:\myDoc\myPicture.jpg

package exercise04;import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class Test {public static void main(String[] args) {try{//datainputStream的使用,他是fileinputstream的子类,需要与fileinputstream结合使用//实例化fileinputstreamFileInputStream fis = new FileInputStream("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\Test\\text\\QQ截图20240629214809.png");DataInputStream dis = new DataInputStream(fis);FileOutputStream fos = new FileOutputStream("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\Test\\text\\1.png");
//            BufferedReader br = new BufferedReader(dis);byte[] b1 = new byte[1024];
//            System.out.println(dis.read(b1));
//            for(byte b : b1){
//                System.out.print((char)b);
//            }int len;while((len = dis.read(b1,0,b1.length)) != -1){fos.write(b1,0,len);}dis.close();fos.close();fis.close();}catch (Exception e){e.printStackTrace();}}
}

练习五

需求说明实现学员对象的序列化和反序列化

package exercise05;import java.io.*;public class TestObjectinout {public static void main(String[] args) {try {//先创建序列化流和反序列化流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\exercise05\\text.txt"));ObjectInputStream ois = new ObjectInputStream(new FileInputStream("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\exercise05\\text.txt"));//创建用户实例Student student = new Student("张三",18);//进行序列化oos.writeObject(student);//实现反序列化Student s = (Student) ois.readObject();System.out.println(s);} catch (Exception e) {e.printStackTrace();}}
}

作业

作业一

1.从键盘输入文件的路径,不存在则创建文件,存在则输出文件信息,如:文件名,字节数,内容。

最后写入文件内容在输出信息。

package homework01;import java.io.*;
import java.util.Scanner;public class Test {public static void main(String[] args) {try {Scanner sc = new Scanner(System.in);
//            String path = "";System.out.println("请输入文件路径");//这里使用nextline的原因
//            nextLine() 可以读取包括空格和特殊字符在内的整行文本,而 next() 只能读取到下一个空白字符前的字符串。
//            这意味着如果文件路径包含空格或者特殊字符,nextLine() 能够正确读取整个路径,而 next() 则不能。String path = sc.nextLine();File file = new File(path);if (!file.exists()){file.createNewFile();System.out.println("文件已创建");}Reader fr = new FileReader(file);BufferedReader br = new BufferedReader(fr);System.out.println(" " + file.getName() + file.length() + br.readLine());br.close();fr.close();
//            file.close();} catch (Exception e) {e.printStackTrace();}}
}

作业二

2.手动创建文件,内容如下

name=张三,age=18,sex=女|name=李四,age=12,sex=男

利用字节流读取文件内容并保存对象到List集合中,循环打印集合

Test

package homework02;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {try {//读取文件Reader fr = new FileReader("G:\\鸿卓java全栈学习\\鸿卓java全栈学习代码\\java\\java 高级编程\\project04\\src\\homework02\\people.txt");BufferedReader br = new BufferedReader(fr);//将信息存到字符串中String info = br.readLine();System.out.println(info);//创建对象集合List<prople> l = new ArrayList<prople>();
//            System.out.println(info.split("\\|"));
//            l.add(info.split("\\|"));//第一次分割,分隔开张三和李四,并用数组进行存储String[] s = info.split("\\|");for (String s1 : s){//第二次分割,将各个属性分隔开String[] ss = s1.split(",");//第三次分割,将属性名称=与属性值分隔开,并获取值赋值给变量String name = ss[0].split("=")[1];int age = Integer.parseInt(ss[1].split("=")[1]);String sex = ss[2].split("=")[1];//创建对象并添加到集合中l.add(new prople(name,age,sex));}//遍历打印for (prople p : l){System.out.println(p.getName()+ p.getAge()+p.getSex());}} catch (Exception e) {e.printStackTrace();}}
}

prople

package homework02;public class prople {private String name;private int age;private String sex;public prople(String name, int age, String sex) {this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PhpStorm 中配置调试功能的详尽指南
  • pyenv -- 一款macos下开源的多版本python环境安装管理工具 国内加速版安装 + 项目venv虚拟环境 pip加速 使用与总结
  • React学习-hooks
  • 【多线程】概述
  • 安全检查报告模板
  • 用c写一个谁考了第k名
  • Maptr
  • 2024数博会技术成果回顾 | KPaaS助力企业数智化转型
  • .net通过类组装数据转换为json并且传递给对方接口
  • 基于Spring和MybatisPlus下的Oracle转mysql语句语法适配修改
  • 使用Aqua进行WebUI测试(Pytest)——介绍篇(附汉化教程)
  • 合并区间【leetcode】
  • 随笔(1)将 CSV 文件导入 MySQL 时出现中文乱码问题解决方案
  • 【物理教学】不准确温度计图像代码分享
  • 为什么越来越多的人选择开放式耳机?平价高品质蓝牙耳机推荐
  • 时间复杂度分析经典问题——最大子序列和
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Centos6.8 使用rpm安装mysql5.7
  • Git初体验
  • Netty 4.1 源代码学习:线程模型
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PAT A1120
  • React Native移动开发实战-3-实现页面间的数据传递
  • TypeScript迭代器
  • vue数据传递--我有特殊的实现技巧
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • Windows Containers 大冒险: 容器网络
  • 对JS继承的一点思考
  • 实现菜单下拉伸展折叠效果demo
  • 事件委托的小应用
  • 微信小程序:实现悬浮返回和分享按钮
  • 微信小程序设置上一页数据
  • 因为阿里,他们成了“杭漂”
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • # .NET Framework中使用命名管道进行进程间通信
  • # 职场生活之道:善于团结
  • #NOIP 2014# day.1 T2 联合权值
  • #pragam once 和 #ifndef 预编译头
  • #QT 笔记一
  • #传输# #传输数据判断#
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (6)STL算法之转换
  • (Qt) 默认QtWidget应用包含什么?
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十三)Flink SQL
  • (转)【Hibernate总结系列】使用举例
  • (自用)仿写程序
  • ***监测系统的构建(chkrootkit )
  • .aanva