Java基础之(IO流)
简介:
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
一、File类
java.io.File类:文件和目录路径名的抽象表示形式,与平台无关 File ,能新建、删除、重命名文件和目录。但 File 不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。
File对象可以作为参数传递给流的构造函数
File类的常见构造方法:
1、public File(String pathname) 以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
2、public File(String parent,String child) 以parent为父路径,child为子路径创建File对象。
package main.dyh; import org.junit.Test; import java.io.File;
import java.io.IOException; public class TestFile { //文件夹操作
@Test
public void fun1(){
File file1 = new File("D:\\aa");
boolean mkdir = file1.mkdir();//创建文件夹,D盘之前是没有文件夹aa的
File file2 = new File("D:\\aa","bb");
boolean mkdirs = file2.mkdirs();//创建文件夹,并在文件夹中创建子文件夹bb File file3 = new File("D:\\");
String[] list = file3.list();//查询D盘中所有目录和文件
for (String s : list) {
System.out.println(s);
} File file4 = new File("D:\\");
File[] files = file4.listFiles();//查询D盘中所有文件和文件夹,并显示路径
for (File file : files) {
System.out.println(file);
}
} //文件操作
@Test
public void fun2() throws IOException {
File file1 = new File("D:\\a.txt");
boolean newFile = file1.createNewFile();//创建文件,注意的是,如果把该文件建在一个文件夹中,该文件夹必须存在,或者报异常,如果之前有该文件,会覆盖 //-------------------------------
File file2 = new File("D:\\a.txt");
String name = file2.getName();//获得该文件的完整名称,包括后缀
System.out.println(name); File file4 = new File("./a.txt");
File absoluteFile = file4.getAbsoluteFile();
System.out.println(absoluteFile); // -------------------------------------------
File filep = new File(".\\test1.txt");
File filea = new File("D:\\workspace\\test\\test1.txt");
System.out.println("-----默认相对路径:取得路径不同------");
System.out.println(filep.getPath());
System.out.println(filep.getAbsolutePath());
System.out.println("-----默认绝对路径:取得路径相同------");
System.out.println(filea.getPath());
System.out.println(filea.getAbsolutePath()); File file6 = new File("D:\\a\\a.txt");
String parent = file6.getParent();//得到父目录
System.out.println(parent); File file3 = new File("D:\\a\\a.txt");
boolean nfile = file3.renameTo(new File("D:\\a\\b.txt")); File file7 = new File("D:\\b.txt");
boolean newFile1 = file7.createNewFile();
boolean delete = file7.delete();//删除指定文件
} /**
* 文件检测
*/
@Test
public void fun3() {
File file1 = new File("D:\\a.txt");
boolean exists = file1.exists();//文件是否存在
System.out.println(exists); boolean bread = file1.canRead();//文件是否可读
System.out.println(bread);
boolean bwrite = file1.canWrite();//文件是否可写
System.out.println(bwrite); boolean file = file1.isFile();
System.out.println(file);
boolean directory = file1.isDirectory();//是否是文件夹
System.out.println(directory); long length = file1.length();
System.out.println(length); long l = file1.lastModified();//返回此抽象路径名表示的文件最后一次被修改的时间
System.out.println(l);
}
}
二、什么是IO流
IO流用来处理设备之间的数据传输。 Java程序中,对于数据的输入/输出操作以”流(stream)” 的方式进行。
java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
1、输入流与输出流概念
输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
2、流的分类
按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)。
按数据流的流向不同分为:输入流,输出流。
按流的角色的不同分为:节点流,处理流。
Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。 由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
处理流与节点流的区别:
节点流:节点流可以从一个特定的数据源读写数据。
处理流:处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
3、IO流的体系
三、IO流的读写操作
1、InputStream 和 Reader 是所有输入流的基类。
InputStream(典型实现:FileInputStream)
int read()
int read(byte[] b)
int read(byte[] b, int off, int len)
Reader(典型实现:FileReader)
int read() int read(char [] c)
int read(char [] c, int off, int len)
程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源。
package main.dyh; import org.junit.Test; import java.io.*; public class TestOutIn { @Test
public void fun1() {
FileReader fileReader = null;
try {
fileReader = new FileReader(new File("D:\\a.txt"));
char[] c = new char[1024];
int len = 0;
while ((len = fileReader.read(c)) != -1){
System.out.println(new String(c,0,len));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
} } @Test
public void fun2() {
FileInputStream fs = null;
try {
fs = new FileInputStream(new File("D:\\a.txt"));
byte[] b = new byte[1024];
int len = 0;
while ((len = fs.read(b)) != -1){
System.out.println(new String(b,0,len));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
}
2、OutputStream 和 Writer 也非常相似: (典型实现:FileOutputStream)
void write(int b/int c);
void write(byte[] b/char[] cbuf);
void write(byte[] b/char[] buff, int off, int len);
void flush();
void close();
需要先刷新,再关闭此流,因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数 :
void write(String str);
void write(String str, int off, int len);
package main.dyh; import org.junit.Test; import java.io.*; public class TestInput { @Test
public void fun1(){
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(new File("D:\\a.txt"));
fileWriter.write("HelloWorld!!");
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} @Test
public void fun2(){
FileOutputStream fo = null;
try {
fo = new FileOutputStream(new File("D:\\a.txt"));
fo.write("woaibeijingtiananmen".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
四、处理流
1、缓冲流
为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组。
根据数据操作单位可以把缓冲流分为:
BufferedInputStream 和 BufferedOutputStream
BufferedReader 和 BufferedWriter
缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法 对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()将会使内存中的数据立刻写出。
package main.dyh; import org.junit.Test; import java.io.*; public class TestBuffer { @Test
public void fun1(){
BufferedOutputStream bo = null;
BufferedInputStream bi = null;
try {
bo = new BufferedOutputStream(new FileOutputStream("D:\\d.txt"));
bi = new BufferedInputStream(new FileInputStream("D:\\d.txt")); bo.write("zhonghuarenming".getBytes());//把数据写到硬盘上 byte[] b = new byte[1024];
int len = 0;
while ((len = bi.read(b)) != -1){//把数据读到内存中
System.out.println(new String(b,0,len));
}
bo.flush();//刷新缓冲区
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
bi.close();
bo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2、转换流
转换流提供了在字节流和字符流之间的转换
Java API提供了两个转换流: InputStreamReader和OutputStreamWriter 字节流中的数据都是字符时,转成字符流操作更高效。
(1)、InputStreamReader 用于将字节流中读取到的字节按指定字符集解码成字符。
需要和InputStream“套接”。
构造方法 public InputStreamReader(InputStream in) public InputSreamReader(InputStream in,String charsetName)
(2)、OutputStreamWriter 用于将要写入到字节流中的字符按指定字符集编码成字节。
需要和OutputStream“套接”。
构造方法 public OutputStreamWriter(OutputStream out) public OutputSreamWriter(OutputStream out,String charsetName)
package main.dyh; import org.junit.Test; import java.io.*; public class TestInReader {
@Test
public void fun1(){
FileInputStream fi = null;
FileOutputStream fo = null;
try {
fi = new FileInputStream("D:\\a.txt");
fo = new FileOutputStream("D:\\aa.txt"); InputStreamReader ir = new InputStreamReader(fi,"GBK");//转换流
OutputStreamWriter or = new OutputStreamWriter(fo,"GBK"); BufferedReader br = new BufferedReader(ir);//缓冲流
BufferedWriter bw = new BufferedWriter(or); bw.write("你好世界!!!"); char[] chars = new char[1024];
int len = 0;
while ((len = br.read(chars)) != -1){
System.out.println(new String(chars,0,len));
}
bw.flush();
} catch (Exception e) {
e.printStackTrace();
}finally { try {
fo.close();
fi.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3、字符编码
编码表的由来 计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表。这就是编码表。
常见的编码表 ASCII:美国标准信息交换码。 用一个字节的7位可以表示。
ISO8859-1:拉丁码表。欧洲码表 用一个字节的8位表示。
GB2312:中国的中文编码表。
GBK:中国的中文编码表升级,融合了更多的中文文字符号。
Unicode:国际标准码,融合了多种文字。 所有文字都用两个字节来表示,Java语言使用的就是unicode。
UTF-8:最多用三个字节来表示一个字符。
编码:字符串—>字节数组
解码:字节数组—>字符串
转换流的编码应用
可以将字符按指定编码格式存储。
可以对文本数据按指定编码格式来解读。
指定编码表的动作由构造器完成。
Java基础之(IO流)的更多相关文章
- java基础之IO流(二)之字符流
java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...
- java基础之IO流(一)字节流
java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- 【java基础】]IO流
IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...
- java基础之 IO流
javaIO流 IO流 : (input output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方. IO技术的作用:主要就是解决设备和设备之间的数据传输问题 ...
- java基础44 IO流技术(输出字节流/缓冲输出字节流)和异常处理
一.输出字节流 输出字节流的体系: -------| OutputStream:所有输出字节流的基类(抽象类) ----------| FileOutputStream:向文件输出数据的输出字节流(把 ...
- java基础之io流总结一:io流概述
IO流概念: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.io流是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. IO流的分类: 根据处理数据类型的不同分为:字符流 ...
- 黑马程序员——JAVA基础之IO流FileReader,FileWriter
------- android培训.java培训.期待与您交流! ---------- IO(Input Output)流 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 J ...
- java基础06 IO流
IO用于在设备间进行数据传输的操作. Java IO流类图结构: IO流分类 字节流: InputStream FileInputStream BufferedInputStream Output ...
- java基础之IO流及递归理解
一.IO流(简单理解是input/output流,数据流内存到磁盘或者从磁盘到内存等) 二.File类(就是操作文件和文件夹的) 1.FIleFile类构造方法 注意:通过构造方法创建的file对象是 ...
随机推荐
- git push和pull如何解决冲突!!!精品
多人合作完成项目时,git push 和 pull经常会发生冲突,根本原因就是远程的东西和本地的东西长的不一样,以下步骤能完美解决所有冲突!(先查看一下分支(git branch),确认没错再进行下面 ...
- "该公众号暂时无法提供服务,请稍后再试"的问题
倒腾了好久,对微信公众号也不是很熟悉.不知道怎么看问题,php学的也不久. 1.定位问题. 网上找了很久,最后找到两种定位问题的方式. a.https://blog.csdn.net/qq_28506 ...
- Linux虚拟网络:Docker网络知识之基础篇
我们在工作中应用了docker容器化技术,服务的部署.维护和扩展都方便了很多.然而,近期在私有化部署过程中,由于不同服务器环境的复杂多变,常常遇到网络方面的问题,现象为容器服务运行正常,但宿主机.容器 ...
- 关于gulp复制文件时把整个目录结构都复制的问题解决
有这么个场景,在开发时分模块开发,但是发布时不一定将按模块分布,比如,为了便于开发,图片是按照模块存放的,但是发布时只是放在images文件夹下,此时就需要用到本文中提到的插件gulp-flatten ...
- tbody滚动条占位导致与thead表头错位
tbody出滚动条导致表头错位,上网上搜了一下,发现全是答非所问,能隐藏滚动条,还用问??我当前作出的效果是当tbody内容在正常情况下显示时,不显示滚动条,当内容区域高度超过外部容器时,滚动条自动显 ...
- uni-app中textarea组件
textarea组件,官方给出的监听事件有以下事件: 其中一定要注意,当使用 v-model 对表单内容进行双向绑定的时候,@input 事件是在绑定变量变化前触发的,所以如果在input事件内打印绑 ...
- [Mybatis]Mybatis常用操作
Mybatis是目前国内比较流行的ORM框架,特点是可以写灵活的SQL语句,非常适合中小企业的面向数据库开发. 本文总结自己开发过程中常用的Mybatis操作. 一.插入操作 主键自增插入单条 < ...
- .NET程序运行原理及基本概念详解
一.引言 我们知道在Java中有虚拟机,代码运行时虚拟机把Java语言编译成与机器无关的字节码,然后再把字节码编译成机器指令执行,那么在.NET中程序是如何运行的呢?其实运行原理是一样的,.NET中的 ...
- electron自定义最小化,最大化和关闭按钮
Electron ipcRenderer 模块 ipcRenderer 模块是一个 EventEmitter 类的实例. 它提供了有限的方法,你可以从渲染进程向主进程发送同步或异步消息. 也可以收到主 ...
- redis(九):Redis 哈希(Hash)(python)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host="123.56.74.190& ...