Java入门系列-22-IO流
File类的使用
Java程序如何访问文件?通过 java.io.File 类
使用File类需要先创建文件对象 File file=new File(String pathname);
,创建时在构造函数中指定物理文件或目录,然后通过文件对象的方法操作文件或目录的属性。
\ 是特殊字符,要使用需要转义 \\
File 类常用方法
方法名称 | 说明 |
---|---|
boolean exists() | 判断文件或目录是否存在 |
boolean isFile() | 判断是否是文件 |
boolean isDirectory() | 判断是否是目录 |
String getPath() | 返回此对象表示的文件的相对路径名 |
String getAbsolutePath() | 返回此对象表示的文件的绝对路径 |
String getName() | 返回此对象指定的文件或目录 |
boolean createNewFile() | 创建名称的空文件,不创建文件夹 |
long length() | 返回文件的长度,单位为字节,文件不存在则返回0L |
File[] listFiles() | 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 |
static File[] listRoots() | 列出可用文件系统根 |
boolean mkdirs() | 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 |
使用示例:
import java.io.File;
import java.io.IOException;public class TestFile {public static void main(String[] args) {//创建File对象 传入文件的路径File file=new File("D:\\a.txt");//创建File对象 传入文件夹的路径File dir=new File("D:/word");//判断是否存在if(file.exists()) {if(file.isFile()) {//getName()获取名字System.out.println(file.getName()+" 是文件");}else if(file.isDirectory()){System.out.println(file.getName()+" 是目录");} }else {System.out.println(file.getName()+" 不存在!");try {//创建文件file.createNewFile();System.out.println("文件大小:"+file.length()+" 字节");} catch (IOException e) {e.printStackTrace();}}if(dir.exists()) {if(dir.isFile()) {System.out.println(dir.getName()+" 是文件");}else if(dir.isDirectory()) {System.out.println(dir.getName()+" 是文件夹");//绝对路径System.out.println(dir.getAbsolutePath());} }else {System.out.println(dir.getName()+" 不存在!");//创建目录dir.mkdirs();}}
}
流
流:指一连串流动的字符,是以先进先出方式发送信息的通道
输入流:源数据流向程序(读)
输入流:程序中的数据流向目标数据源(写)
Java流的分类
按流向
- 输出流(OutputStream和Writer作为基类)
- 输入流(InputStream和Reader作为基类)
输入输出流是相对于计算机内存来说的
按照处理数据单元划分
字节流
- 字节输入流(InputStream基类)
- 字节输出流(OutputStream基类)
字符流
- 字符输入流(Reader基类)
- 字符输出流(Writer基类)
字节流是8位(1B)通用字节流,字符流是16位(2B)Unicode字符流
字节流
FileInputStream 是 InputStream 的子类
InputStream 类常用方法
方法名称 | 说明 |
---|---|
int read() | 从输入流中读取数据的下一个字节。返回0到255的int值,如果到达流的末尾,则返回-1 |
int read(byte[] b) | 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。返回读入缓冲区的总字节数,如果达到末尾则返回-1 |
int read(byte[] b,int off,int len) | 将输入流中最多 len 个数据字节读入 byte数组 |
void close() | 关闭此输入流并释放与该流关联的所有系统资源 |
int available() | 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取的估计字节数 |
FileInputStream 类常用构造方法
名称 | 说明 |
---|---|
FileInputStream(File file) | 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。 |
FileInputStream(String name) | 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。 |
使用 FileInputStream 读取文件
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class TestFileInputStream {public static void main(String[] args) {FileInputStream fis=null;try {fis=new FileInputStream("D:\\a.txt");//读取结果存入StringBufferStringBuffer sb=new StringBuffer();System.out.println("预计读取:"+fis.available()+"字节");//记录每次读取的长度int len=0;//缓冲区字节数组byte[] buff=new byte[1024];while((len=fis.read(buff))!=-1) {System.out.println("还剩余:"+fis.available()+"字节");sb.append(new String(buff,0,len));}System.out.println("结果:");System.out.println(sb);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (fis!=null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
}
FileOutputStream 是 OutputStream 的子类
OutputStream 类常用方法
方法名称 | 说明 |
---|---|
void write(int c) | 将制定的字节写入此输出流 |
void write(byte[] buf) | 将 b.length 个字节从指定的 byte 数组写入此输入流 |
void write(byte[] b,int off,int len) | 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流 |
void close() | 关闭此输出流并释放与此流有关的所有系统资源 |
FileOutputStream的构造方法
名称 | 说明 |
---|---|
FileOutputStream(File file) | 创建一个向指定 File 对象表示的文件中写入数据的文件输出流 |
FileOutputStream(String name) | 创建一个向具有指定名称的文件中写入数据的输出文件流 |
FileOutputStream(String name,boolean append) | 第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处 |
使用 FileOutputStream 写文件
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class TestFileOutputStream {public static void main(String[] args) {FileOutputStream fos=null;try {//创建输出流对象fos=new FileOutputStream("D:\\c.txt");//要输出的字符String str="hello world 你好";//将字符串转成字节数组并写入到流中fos.write(str.getBytes());//刷新流fos.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (fos!=null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
}
字符流
上面的内容我们看到,字节流不能直接操作字符,所以操作字符用字符流。
FileReader 是 Reader 的子类
Reader 类常用方法
方法名称 | 说明 |
---|---|
int read() | 读取单个字符 |
int read(char[] c) | 将字符读入数组 |
read(char[] c,int off,int len) | 将字符读入数组的某一部分 |
void close() | 关闭该流并释放与之关联的所有资源 |
使用 FileReader 读取文本文件
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class TestReader {public static void main(String[] args) {Reader r=null;try {//创建FileReader对象r=new FileReader("D:\\a.txt");//字符缓冲数组char[] chrs=new char[512];//记录每次读取的个数int len=0;//循环读取while((len=r.read(chrs))!=-1) {String str=new String(chrs, 0, len);System.out.println(str);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (r!=null) {try {r.close();} catch (IOException e) {e.printStackTrace();}}}}
}
FileWriter 是 Writer 的子类
Writer 类常用方法
方法名称 | 说明 |
---|---|
write(String str) | 写入字符串 |
write(String str,int off,int len) | 写入字符串的某一部分 |
void close() | 关闭此流,但要先刷新它 |
void flush | 刷新该流的缓冲 |
使用 FileWriter 写入文本文件
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class TestWriter {public static void main(String[] args) {Writer w=null;try {//创建字符输出流w=new FileWriter("D:\\msg.txt");String msg="hello every bady 兄嘚";//将字符串写入到流中w.write(msg);w.flush();} catch (IOException e) {e.printStackTrace();}finally {if (w!=null) {try {w.close();} catch (IOException e) {e.printStackTrace();}}}}
}
缓冲字符流
如果频繁的对字符进行读写操作,墙裂建议使用缓冲!
BufferedReader 类带有缓冲区,可以先把一批数据读到缓冲区,接下来的读操作都是从缓冲区内获取数据,避免每次都从数据源读取数据进行字符编码转换,从而提高读取操作的效率。
使用BufferedReader读取文本文件
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class TestBufferedReader {public static void main(String[] args) {FileReader reader=null;BufferedReader br=null;try {//创建字符读入流reader=new FileReader("D:\\a.txt");//将字符读入流包装成字符缓冲流br=new BufferedReader(reader);//记录每行读入的内容String line=null;//用于拼接保存每行读入的内容StringBuffer content=new StringBuffer();while ((line=br.readLine())!=null) {content.append(line+"\n");}System.out.println("所有内容:");System.out.println(content);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {if (reader!=null) {reader.close();}if (br!=null) {br.close();}} catch (Exception e) {e.printStackTrace();}}}
}
BufferedReader 是 Reader 的子类,带有缓冲区,特有方法 readLine() 按行读取内容
BufferedWriter 类带有缓冲区,与BufferedReader的方向正好相反,BufferedWriter 是把一批数据写到缓冲区,当缓冲区满的时候,再把缓冲区的数据写到字符输出流中。避免每次都执行物理写操作,提高写操作的效率。
使用 BufferedWriter 写文件
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class TestBufferedWriter {public static void main(String[] args) {FileWriter writer=null;BufferedWriter bw=null;try {writer=new FileWriter("D:\\out.txt");bw=new BufferedWriter(writer);bw.write("hello");//内容换行bw.newLine();bw.write("world");} catch (IOException e) {e.printStackTrace();}finally {try {if (bw!=null) {bw.close();}if (writer!=null) {writer.close();}} catch (IOException e) {e.printStackTrace();}}}
}
关闭流的顺序与创建流的顺序相反
数据流
DataInputStream 类
- FileInputStream 的子类
- 与 FileInputStream 类结合使用读取二进制文件
DataOutputStream 类
- FileOutputStream 的子类
- 与 FileOutputStream 类结合使用写二进制文件
使用数据流复制图片
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class TestCopy {public static void main(String[] args) {//文件输入流FileInputStream fis=null;//数据输入流(包装fis得到)DataInputStream dis=null;//文件输出流FileOutputStream fos=null;//数据输出流(包装fos得到)DataOutputStream dos=null;try {fis=new FileInputStream("D:\\a.jpg");dis=new DataInputStream(fis);fos=new FileOutputStream("F:\\b.jpg");dos=new DataOutputStream(fos);//缓冲数组byte[] buff=new byte[1024];//记录每次读取的字节个数int len=0;//循环读入while((len=dis.read(buff))!=-1) {//循环写入len个字节dos.write(buff,0,len);}System.out.println("完成");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {if (dis!=null) {dis.close();}if (dos!=null) {dos.close();}} catch (IOException e) {e.printStackTrace();}}}
}
Java入门系列-22-IO流相关推荐
- JAVA入门-027(IO流)
IO流 File File类概述和构造方法 File类创建功能 File类判断和获取功能 File类删除功能 递归 案例:递归求阶乘 案例:遍历目录 字节流 IO流概述与分类 字节流写数据 字节流写数 ...
- 重新java系列之IO流
重新java系列之IO流 内容介绍 学习目标 字符输入流 字符输入流[Reader] FileReader类 构造方法 读取字符数据 使用演示: 字符输出流 字符输出流[Writer] FileWri ...
- SAP PM入门系列22 - IH06 Display Functional Location
SAP PM入门系列22 - IH06 Display Functional Location SAP PM中,技术对象function location是一个非常重要的核心的主数据.事务代码IH06 ...
- JAVA学生信息管理系统IO流版
JAVA学生信息管理系统IO流版 1. Student类 public class Student implements Serializable{//学号private int sid;//姓名pr ...
- 【Java网络编程与IO流】Java之Java Servlet详解
Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...
- 【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流
Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...
- java字节流读取文件_字节流读取文件 java的几种IO流读取文件方式
java字节流怎么读取数据 字节流读取数据例子如下: import java.io.File;import java.io.FileInputStream;import java.io.FileNot ...
- 打怪升级之小白的大数据之旅(二十五)<Java面向对象进阶之IO流三 其他常见流>
打怪升级之小白的大数据之旅(二十五) Java面向对象进阶之IO流三 其他常见流 上次回顾 上一章,我们学习了常用的字节流与字符流,本章,我会将其他的一些常见的流进行分享,IO流很多,我介绍不完,就挑 ...
- Java实现文件写入——IO流(输入输出流详解)
输入输出的重要性: 输入和输出功能是Java对程序处理数据能力的提高,Java以流的形式处理数据.流是一组有序的数据序列,根据操作的类型,分为输入流和输出流. 程序从输入流读取数据,向输出流写入数据. ...
- 夯实Java基础系列22:一文读懂Java序列化和反序列化
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
最新文章
- 无法上外网, ping网关ping不通的解决——arp命令
- 基于php的问答,thinkask
- 总结一下silverlight文章,然后死等10月10日的正式版
- PHP实现二维码扫码登录
- matlab柱状图加阴影,matlab 绘制 阴影 柱状图 条形图
- http1.X与2.0
- Win2003下架构Mrtg服务器
- 雷林鹏分享:PHP 变量
- java字符串替换 数组,Java工具类-拆分字符串组装数组,替换字符
- oppo a57刷机成功教程
- esp_image: Image length xxxx doesn‘t fit in partition length 1048576问题解决思路
- win10内置ubuntu, “指定的网络名不再可用”解决办法
- 学而思初中全套网课+讲义【春季班,暑假班,秋季班,寒假班】
- 4k纸是几厘米乘几厘米_4k纸有多大长多少宽多少
- Adobe Illustrator教程
- 目标2025:通信产业在能源变局中拥抱智能未来
- 文字在div中水平居中,垂直居中
- HTML的标准模式与怪异模式
- GPIO口模拟串口发送接收(基于H861)
- Docker(五)-Dcoker容器
热门文章
- MTFBWU的完整形式是什么?
- 2020计算机二级题库第14PPT,计算机二级考试MSOffice考精彩试题库ppt操作题附问题详解.doc...
- uva 10934—— Dropping water balloons
- Linux系统编程--3(exec 函数族,僵尸进程和孤儿进程,wait和wait_pid回收子进程)
- 数据库原理及应用【三】DBMS+SQL
- linux 信号signal和sigaction理解
- 数据链路层: HDLC
- Linux系统编程(六)守护进程
- 【数字逻辑】第四章 组合逻辑电路:端口设计 端口拓展的方法
- 最常用的设计模式---适配器模式(C++实现)