Java中的I/O流
Java中的I/O流
导言
在做java实验时发现并不会使用I/O流,经过一段时间学习后,补上此笔记,仅供参考,本人电脑为MacBook Pro,所以所有文件路径按Unix系统下的路径来写
文件对象
文件和文件夹都是File代表
使用绝对路径或者相对路径创建File
绝对路径:/Users/apple/Desktop/Numbers.txt
相对路径:/Desktop/Numbers.txt
package file
import java.io.File;
public class TestFile {
public static void main(String[] args) {
File f1 = new File("/Users/apple/Desktop/Numbers.txt");
System.out.println("f1的路径" + f1.getAbsolutePath());
}
}
文件的常用方法
package file;
import java.io.File;
import java.util.Date;
public class TestFile {
public static void main(String[] args) {
File f = new File("/Users/apple/Desktop/Numbers.txt");
System.out.println("当前文件是:" +f);
//文件是否存在
System.out.println("判断是否存在:"+f.exists());
//是否是文件夹
System.out.println("判断是否是文件夹:"+f.isDirectory());
//是否是文件(非文件夹)
System.out.println("判断是否是文件:"+f.isFile());
//文件长度
System.out.println("获取文件的长度:"+f.length());
//文件最后修改时间
long time = f.lastModified();
Date d = new Date(time);
System.out.println("获取文件的最后修改时间:"+d);
//设置文件修改时间为1970.1.1 08:00:00
f.setLastModified(0);
//文件重命名
File f2 =new File("/Users/apple/Desktop/Number.txt");
f.renameTo(f2);
System.out.println("把Numbers.txt改名成了Number.txt");
}
}
流
流(stream)就是一系列的数据
在Java中,不同种类的数据交互时,就使用流来实现
数据源可以是文件,还可以是数据库,网络或者其他
输入流:InputStream
输出流:OutputStream
下面将介绍一些常用的流
字节流
用字节的形式读取和输入数据
字节输入流:InputStream
字节输出流:OutputStream
- 以字节流的形式读取文件内容
package Stream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IoException;
public class TestStream {
public static void main(String[] args) throws IOException {
File f = new File("/Users/apple/Desktop/Numbers.txt");
//创建基于文件的输入流
FileInputStream fis = FileInputStream(f);
//创建字节数组,其长度就是文件的长度
byte[] ans = new byte[(int)f.length()];
//以字节流的形式读取文件内所有的内容
fis.read(ans);
for(byte b : ans) {
System.out.println(b);
}
//使用完流,进行关闭
fis.close();
}
}
- 以字节流的形式写入文件内容
package Stream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestSream {
public static void main(String[] args) throws IOException {
File f = new File("Result.txt");
byte data[] = {77.444,0.000};
//创建基于文件的输入流
FileOutputStream fos = new FileOutputStream(f);
//把数据写到输入流
fos.write(data);
//关闭输入流
fos.close;
}
}
字符流
专门用于字符的形式的读取和写入数据
Reader 字符输入流
Writer 字符输出流
- 使用字符流读取文件
package Stream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class TestStream {
public static void main(String[] args) throws IOException {
File f = new File("/Users/apple/Desktop/Numbers.txt");
//创建基于文件的Reader
FileReader fr = new FileReader(f);
//创建字符数组
byte[] ans = new byte[(int)f.length()];
//以字符流的形式读取文件的所有内容
fr.read(ans);
//打印
for(char b : ans) {
System.out.println(b);
}
}
}
- 使用字符流把字符串写入到文件
package Stream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class TestStream {
public static void main(String[] args) throws IOException{
File f = new File("/Users/apple/Desktop/Numbers.txt");
FileWriter fr = new FileWriter(f);
String data = "13214124142";
char[] cs = data.toCharArray();
fr.write(cs);
fr.close();
}
}
缓存流
字节流和字符流的弊端:在每读写一次,都会访问其介质,读写频率较高时,性能不佳。
采用缓存流
缓存流在读取的时候,会一次性读取较多的数据到缓存中,以后的每次一出访问,都是在缓存中访问,直到缓存中的数据读取完毕,再到硬盘中读取。
举个例子:我们吃菜的时候,是把锅里的菜盛到盘子里去吃,盘子里吃完了再去锅里盛。
缓存流在写入数据的时候,会先把数据写入到缓存区,直到缓存区到达一定的量,才把这些数据,一起写入到硬盘中去
- 使用缓存流读取数据
package stream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class TestStream {
public static void main(String[] args) throws IOException {
File f = new File("/Users/apple/Desktop/Numbers.txt");
//缓存流必须创建在一个流的基础上
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReadder(fr);
while(br.hasNext()) {
//一次读一行
String line = br.readLine();
System.out.println(line);
}
}
}
- 使用缓存流读取数据
package stream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class TestStream {
public static void main(String[] args) throws IOException {
File f = new File("/Users/apple/Desktop/Numbers.txt");
//缓存流必须创建在一个流的基础上
FileWriter fw = new FileWriter(f);
PrintWriter pw = new PrintWriter(fw);
pw.println("6666");
pw.println("432432");
}
}
- flush
有的时候,需要立即把数据写到硬盘,而不是等缓存满了菜写出去,这时候就用flush
package stream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class TestStream {
public static void main(String[] args) throws IOException {
File f = new File("/Users/apple/Desktop/Numbers.txt");
//缓存流必须创建在一个流的基础上
FileWriter fw = new FileWriter(f);
PrintWriter pw = new PrintWriter(fw);
pw.println("6666");
//强制性把缓存中的数据写入硬盘,无论缓存是否已满
pw.flush();
pw.println("432432");
pw.flush();
}
}
数据流
使用数据流可以进行数据的格式化顺序读写
- 直接进行字符串的读写
注意:要用DataInputStream读取一个文件,这个文件必须是由DataOutputStream写出的,否则会出现EOFException异常。
package stream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOEXception;
public class TestStream {
public static void main(String[] args) {
write();
read();
}
private static void read() {
File f =new File("/Users/apple/Desktop/Numbers.txt");
try (
FileInputStream fis = new FileInputStream(f);
DataInputStream dis =new DataInputStream(fis);
){
boolean b= dis.readBoolean();
int i = dis.readInt();
String str = dis.readUTF();
System.out.println("读取到布尔值:"+b);
System.out.println("读取到整数:"+i);
System.out.println("读取到字符串:"+str);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void write() {
File f =new File("Result.txt");
try (
FileOutputStream fos = new FileOutputStream(f);
DataOutputStream dos =new DataOutputStream(fos);
){
dos.writeBoolean(true);
dos.writeInt(300);
dos.writeUTF("123 this is gareen");
} catch (IOException e) {
e.printStackTrace();
}
}
}
对象流
对象流指的是可以直接把一个对象以流的形式传输给其他的介质,比如硬盘。
一个对象以流的形式进行传输,叫做序列化。该对象所对应的类,必须是实现Serializable接口。
流的关系图
以上就是关于java中流的一些知识。
原文地址:https://www.cnblogs.com/mgd666/p/12698217.html
- Elasticsearch分片、副本与路由(shard replica routing)
- EsRejectedExecutionException排错与线程池类型
- python重试(指数退避算法)
- 动手为王 | Oracle 数据库跨版本升级迁移实践
- 日志归档与数据挖掘
- Redis实现分布式锁
- Mybatis分页插件PageHelper的配置和使用方法
- 另类保存微信公众平台历史消息的方法 - 星标消息
- CentOS环境下Docker私有仓库搭建
- spark三种连接join
- 用firebug给firefox添加信任链接
- Elasticsearch索引别名、Filtered索引别名、Template
- 追本溯源:Oracle 只读表空间的探索实践
- firefox查看微信公众平台的数据分析时就出现不信任链接怎么办?
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释