Java IO入门
我们从两个方面来理解Java IO,数据源(流)、数据传输,即IO的核心就是对数据源产生的数据进行读写并高效传输的过程。
一. 数据源(流)
数据源可以理解为水源,指可以产生数据的事物,如硬盘(文档、数据库等文件...)、网络(填写的form表单、物联感知信息..),在Java中有对文件及文件夹操作的类File,常用的文件方法如下:
public static void printFileDetail(File file) throws IOException {
System.out.println("文件是否存在:" + file.exists());
if(!file.exists()){
System.out.println("创建文件:" + file.getName());
file.createNewFile();
}
if(file.exists()){
System.out.println("是否为文件:" + file.isFile());
System.out.println("是否为文件夹:" + file.isDirectory());
System.out.println("文件名称:" + file.getName());
System.out.println("文件构造路径:" + file.getPath());
System.out.println("文件绝对路径:" + file.getAbsolutePath());
System.out.println("文件标准路径:" + file.getCanonicalPath());
System.out.println("文件大小:" + file.length());
System.out.println("所在文件夹路径:" + file.getParentFile().getCanonicalPath());
System.out.println("设置为只读文件:" + file.setReadOnly());
}
}
public static void main(String[] args) throws IOException {
File file = new File("./遮天.txt");
printFileDetail(file);
}
结果如下:
文件是否存在:false
创建文件:遮天.txt
是否为文件:true
是否为文件夹:false
文件名称:遮天.txt
文件构造路径:.\遮天.txt
文件绝对路径:E:\idea-work\javase-learning\.\遮天.txt
文件标准路径:E:\idea-work\javase-learning\遮天.txt
文件大小:0
所在文件夹路径:E:\idea-work\javase-learning
设置为只读文件:true
二. 数据传输
数据传输的核心在于传输数据源产生的数据,Java IO对此过程从两方面进行了考虑,分别为输入流和输出流,输入流完成外部数据向计算机内存写入,输出流则反之。
而针对输入流和输出流,Java IO又从字节和字符的不同,再次细分了字节流和字符流。

说明:Java中最小的计算单元是字节,没有字符流也能进行IO操作,只是因为现实中大量的数据都是文本字符数据,基于此单独设计了字符流,使操作更简便。
4个顶层接口有了,接下来Java IO又从多种应用场景(包括了基础数据类型、文件、数组、管道、打印、序列化)和传输效率(缓冲操作)进行了考虑,提供了种类众多的Java IO流的实现类,看下图:

当然我们不用都记住,而实际在使用过程中用的最多的还是文件类操作、转换类操作、序列化操作,当然在此基础上我们可以使用Buffered来提高效率(Java IO使用了装饰器模式)。下面我们通过文件拷贝来简单说明一下主要类的使用
/**
* 文件拷贝(所有文件,文档、视频、音频、可执行文件...),未使用缓冲
* @param sourceFileName 源文件路径
* @param targetFileName 拷贝后目标文件路径
* @throws IOException IO异常
*/
public static void slowlyCopyFile(String sourceFileName, String targetFileName) throws IOException{
//获取字节输入流
FileInputStream fileInputStream = new FileInputStream(sourceFileName);
//File targetFile = new File(targetFileName);
//获取字节输出流
FileOutputStream fileOutputStream = new FileOutputStream(targetFileName);
byte[] bytes = new byte[1024];
//当为-1时说明读取到最后一行了
while ((fileInputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes);
}
fileInputStream.close();
fileOutputStream.close();
}
/**
* 文件拷贝(所有文件,文档、视频、音频、可执行文件...),使用缓冲
* @param sourceFileName 源文件路径
* @param targetFileName 拷贝后目标文件路径
* @throws IOException IO异常
*/
public static void fastCopyFile(String sourceFileName, String targetFileName) throws IOException{
//获取字节输入流
FileInputStream fileInputStream = new FileInputStream(sourceFileName);
//缓冲字节输入流
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
//获取字节输出流
FileOutputStream fileOutputStream = new FileOutputStream(targetFileName);
//缓冲字节输出流
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
byte[] bytes = new byte[1024];
//当为-1时说明读取到最后一行了
while ((bufferedInputStream.read(bytes)) != -1) {
bufferedOutputStream.write(bytes);
}
bufferedOutputStream.flush();
bufferedInputStream.close();
fileInputStream.close();
bufferedOutputStream.close();
fileOutputStream.close();
}
public static void main(String[] args) throws IOException {
long startTime = System.currentTimeMillis();
//文件215M
slowlyCopyFile("D:\\Download\\jdk-8u221.exe","D:\\jdk-8u221.exe");//执行:1938ms
fastCopyFile("D:\\Download\\jdk-8u221.exe","D:\\jdk-8u221.exe");//执行:490ms
System.out.println(System.currentTimeMillis() - startTime);
}
/**
* 文本文件拷贝,不使用缓冲
* @param sourceFileName 源文件路径
* @param targetFileName 拷贝后目标文件路径
* @throws IOException IO异常
*/
public static void slowlyCopyTextFile(String sourceFileName, String targetFileName) throws IOException {
FileReader fileReader = new FileReader(sourceFileName);
FileWriter fileWriter = new FileWriter(targetFileName);
int c;
while ((c = fileReader.read()) != -1) {
fileWriter.write((char)c);
}
fileReader.close();
fileWriter.close();
}
/**
* 文本文件拷贝,使用缓冲
* @param sourceFileName 源文件路径
* @param targetFileName 拷贝后目标文件路径
* @throws IOException IO异常
*/
public static void fastCopyTextFile(String sourceFileName, String targetFileName) throws IOException {
FileReader fileReader = new FileReader(sourceFileName);
BufferedReader bufferedReader = new BufferedReader(fileReader);
FileWriter fileWriter = new FileWriter(targetFileName);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
String str;
while ((str = bufferedReader.readLine()) != null) {
bufferedWriter.write(str + "\n");
}
bufferedReader.close();
fileReader.close();
bufferedWriter.close();
fileWriter.close();
}
public static void main(String[] args) throws IOException {
long startTime = System.currentTimeMillis();
//文件30M
slowlyCopyTextFile("D:\\Download\\小说合集.txt","D:\\小说合集.txt");//3182ms
fastCopyTextFile("D:\\Download\\小说合集.txt","D:\\小说合集.txt");//1583ms
System.out.println(System.currentTimeMillis() - startTime);
}
三. 总结
本文主要对Java IO相关知识点做了结构性梳理,包括了Java IO的作用,数据源File类,输入流,输出流,字节流,字符流,以及缓冲流,不同场景下的更细化的流操作类型,同时用了一个文件拷贝代码简单地说明了主要的流操作,若有不对之处,请批评指正,望共同进步,谢谢!。
Java IO入门的更多相关文章
- Java io 入门
目录 前言 代码演练 字符流 FileReader,FileWriter: BufferedReader,BufferedWriter: InputStreamReader,OutputStreamW ...
- java IO 入门例子
import java.io.File; /** * File类型基本操作 */ /** * @author Administrator * */ public class FileDemo { /* ...
- Java IO(十一) DataInputStream 和 DataOutputStream
Java IO(十一) DataInputStream 和 DataOutputStream 一.介绍 DataInputStream 和 DataOutputStream 是数据字节流,分别继承自 ...
- Java api 入门教程 之 JAVA的IO处理
IO是输入和输出的简称,在实际的使用时,输入和输出是有方向的.就像现实中两个人之间借钱一样,例如A借钱给B,相对于A来说是借出,而相对于B来说则是借入.所以在程序中提到输入和输出时,也需要区分清楚是相 ...
- Java IO学习笔记八:Netty入门
作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...
- Java IO使用入门
总体结构 IO应该是平时项目里最常用到的功能了,无论是简单的文件读取,还是服务器端口监听,都会用到IO:但是,在面对Java IO包里庞杂的IO基础类库时,经常会很头大,是该选择InputStream ...
- Java入门系列(十)Java IO
概述 总体而言,java的读写操作又分为两种:字符流和字节流. 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件. 什么是流? ...
- Java入门:Java IO概括
I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道.在当今这个数据大爆炸时代,I/O 问题尤其突出,很容易成为一个性 ...
- 关于spark入门报错 java.io.FileNotFoundException: File file:/home/dummy/spark_log/file1.txt does not exist
不想看废话的可以直接拉到最底看总结 废话开始: master: master主机存在文件,却报 执行spark-shell语句: ./spark-shell --master spark://ma ...
随机推荐
- ios 键盘弹起bug,出现的问题,光标穿透,页面无法点击
有时候使用ios输入键盘以后,直接点击页面按钮会出现事件无效. 解决方法: 1. 输入框输入后点击提交按钮后,弹窗会发现光标穿透问题 解决方法: 使用input blur()事件使input失去焦点 ...
- java学习3-流程控制与数组
1.顺序结构 2.分支结构 3.循环结构 4.控制循环结构 break continue return 5.数组
- gulp 自动化管理工具实现全过程
1.全局安装gulp npm install gulp -g 2.项目内安装gulp npm install gulp -s 3.项目根目录新建gulpfile.js js内代码: //载入gulp核 ...
- Nginx 了解一下?
这篇文章主要简单的介绍下 Nginx 的相关知识,主要包括以下几部分内容: Nginx 适用于哪些场景? 为什么会出现 Nginx? Nginx 优点 Nginx 的编译与配置 Nginx 适用于哪些 ...
- Windows下NFS服务器SFU设置(可以共享linux系统)
一.安装SFU1.下载软件SFU http://download.microsoft.com/download/a/1/c/a1ca7af1-a6e3-46e7-874a-4c5d8c0fb3b7/S ...
- Flask:数据库的建模
学习完模板系统,接下来要研究的就是框架对数据库的操作,不论python的那个框架,直接使用数据库API(redis.pymysql等)都可以进行操作,但是这些操作不够方便,于是就有了ORM 1.Fla ...
- String 和StringBuffe StringBuilder 的区别
1.可变性:String不可变(适用于做HashMap的键),StringBuffer和StringBuilder可变 2.性能角度:,String在new的时候,会在常量池中开辟空间,比较耗费内存, ...
- android 9.0 Launcher3 去掉抽屉式,显示所有 app
效果图 修改思路 1.增加全局控制变量 sys.launcher3.is_full_app,用来动态切换 2.增加两套布局,对应有抽屉和无抽屉 3.去除 allAppsButton 4.将 AllAp ...
- IIS部署WCF疑难
1.其他信息: 无法激活请求的服务. 可能原因:1. 服务的命名空间和接口的命名空间不一致.2. 传递的参数类型没有打上[DataContract], [DataMember]标签. 2.记得这样: ...
- [考试反思]1009csp-s模拟测试66:依旧
依旧是好一场烂一场. 依旧是那么菜. 依旧是难止颓废. 依旧是在此方仰望,幻想? 上面这段中二的东西是为了防止Parisb说我的标题与内容无关而diss我莫名其妙115的语文. 但是菜是的确是菜... ...