Java 流(Stream)、文件(File)和IO

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。

Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

读写文件

如前所述,一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。

下图是一个描述输入流和输出流的类层次图。

/**
* 第一套:字节流,实现对字节 数据 的读取操作
*/
InputStream fis =null;
try {
fis = new FileInputStream("d:/我的青春我做主.txt");
//实现读取操作
int data;//储存读到的字节
while ((data=fis.read())!=-1) {
System.out.print((char)data);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fis!=null) {
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 实现对字节的写入内存的操作
*/
//1.创建字节输出流
OutputStream fis = null;
try {
fis = new FileOutputStream(new File("d:/Hello.txt"));
String str = "呵呵呵哒";
byte[] words = str.getBytes();
fis.write(words, 0, words.length);
System.out.println("写入成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fis!=null) { fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* FileReader和BufferReader读取文件
* 字符编码:ASCII码,0~127,8位二进制数01010101,一个字节,
* 16位二进制数 0101010101010101 0~65535
* Unicode ,采用字节流读取中文信息会乱码,所以采用字符字符流来读取中文信息。
* 第二套:字符流对文件实现读取和写入的操作
* 1.输入流
* 基类:Reader
* FileReader
* 构造
* FileReader(File file),(String name)
* 常用方法:
* int reader().读取一个字符,返回字符编码
* int reader(char[] b,off,length)
*
*/
//1.创建一个字符流对象,读取文本文件
Reader frReader = null;
StringBuffer frBuffer =null;
try {
frReader = new FileReader("d:/我的青春我做主.txt");
//2.读取文本文件
/*int word;
while ((word=frReader.read())!=-1) {
System.out.print((char)word); }*/
char[] words = new char[1024];//存储读取到的字符
frBuffer = new StringBuffer();
int len =frReader.read(words);//读取到字符数组中
while (len!=-1) {
frBuffer.append(words);
len = frReader.read(words); }
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (frReader!=null) {
frReader.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(frBuffer.toString()); /**
* 字符流,写入操作
*/
FileWriter fwFileWriter = null;
try {
//写入文件,可追加
fwFileWriter = new FileWriter("d:NIO.txt",true);
fwFileWriter.write("lalallal======llala");
} catch (IOException e1) {
e1.printStackTrace();
}finally{
try {
fwFileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 第三套:使用BufferReader,单缓冲区的数据读取和写入(字符输入流)
* 读取
*/
FileReader frFileReader = null;
BufferedReader bWriter = null;
try {
frFileReader = new FileReader("D:NIO.txt");
bWriter = new BufferedReader(frFileReader);
//读取一行数据
String Line = bWriter.readLine();
while(Line!=null){
System.out.println(Line);
Line=bWriter.readLine();
} } catch (Exception e) {
e.printStackTrace();
}finally {
try {
bWriter.close();
frFileReader.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
/**
* 写入
*/
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw= new FileWriter("D:AI.txt",true);
bw = new BufferedWriter(fw);
bw.write("故乡的偶遇缘分");
bw.newLine();
bw.write("lalal");
bw.flush();//刷新
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (bw!=null) { bw.close();
}
} catch (IOException e) { e.printStackTrace();
}
}
/**
* 第四套:用字节流类DataOutputStream写二进制文件,之前只能读取文本文件,写入图片和视频甚至压缩文件和文档
* DataInputStream读取
*/
DataInputStream dis =null;
OutputStream os=null;
DataOutputStream ooStream=null;
InputStream is=null;
try {
//读取视频文件的路径
is = new FileInputStream("D:\\英雄时刻\1424719291.1.avi");
//copy任何的文件
dis = new DataInputStream(is);
os = new FileOutputStream("E:\\英雄时刻\1424719291.1.avi");
ooStream = new DataOutputStream(os);
byte[] bytes = new byte[1024];//一次转1k的数据
int data=0;
try {
while((data=dis.read(bytes))!=-1){
ooStream.write(bytes,0,data);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
ooStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
dis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 序列化和反序列化
* 序列化是将对象状态转换为可保持或传输的格式的过程。
* 与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。*
*
* 序列化
*/
List<Dog> list = new ArrayList<Dog>();
list.add(new Dog("鲍鱼",18));
list.add(new Dog("鲤鱼",16));
try {
FileOutputStream fos = new FileOutputStream("save.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(list);
fos.close();
oos.close();
System.out.println("序列化成功!");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e1){
e1.printStackTrace();
}
/**
* 反序列化
*/
FileInputStream fis = null;
ObjectInputStream oiStream=null;
try {
fis = new FileInputStream("save.bin");
oiStream=new ObjectInputStream(fis);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
try {
List<Dog> list2 = (List<Dog>)oiStream.readObject();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (Dog dog: list) {
System.out.println(dog.getName());
}

JavaFile I/O流的更多相关文章

  1. JavaFile、递归、字节流、字符流整理

    File 1.1                File类的构造函数 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作. 当把持久设备上的数据读取到内存中的这个动作称为输入 ...

  2. IO流05--毕向东JAVA基础教程视频学习笔记

    Day20 10 创建java文件列表11 Properties简述12 Properties存取13 Properties存取配置文件14 Properties练习15 PrintWriter16 ...

  3. Java基础---IO(二)--File类、Properties类、打印流、序列流(合并流)

    第一讲     File类 一.概述 1.File类:文件和目录路径名的抽象表现形式 2.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与文件夹的属性信息进行操作 3)File类的实例是不 ...

  4. IO流----File,递归,字节流,字符流

    要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘.光盘.U盘等)上. 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作. 当把持久设备上的数据读 ...

  5. Java自学-I/O 缓存流

    Java 缓存流BufferedReader,PrintWriter 以介质是硬盘为例,字节流和字符流的弊端: 在每一次读写的时候,都会访问硬盘. 如果读写的频率比较高的时候,其性能表现不佳. 为了解 ...

  6. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  7. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  8. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  9. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

随机推荐

  1. Mysql5.7和8.0版本的文件夹版安装教程(整合版,超详细)

    安装Mysql(5.7版本) 下载地址在这里可以自选版本,找到合适的版本进行下载 解压安装包 配置环境变量 win+r 输入 sysdm.cpl 点击高级 点击环境变量 新建一个系统变量 变量名为MY ...

  2. Three.js实现脸书元宇宙3D动态Logo

    背景 Facebook 近期将其母公司改名为 Meta,宣布正式开始进军 元宇宙 领域.本文主要讲述通过 Three.js + Blender 技术栈,实现 Meta 公司炫酷的 3D 动态 Logo ...

  3. 细说ThreadLocal(一)

    前言 java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.如下图所示: 其中堆是占虚拟机中内存最大的,堆被所有线程所共享,其最主要的便是存放实例对象.也因为堆内存是共 ...

  4. [hdu6997]愿望幽灵

    约定:$[x^{n}]F(x)$​​​​​​表示多项式$F$​​​​​​的$n$​​​​​​次项系数 对于多项式$F$​​​​​​,定义$F$​​​​​的复合逆$\hat{F}$​​​​​为满足$F( ...

  5. [noi239]count

    将每一个ai表示为$ai=ki\cdot m+ri$,即满足$m\sum ki+\sum ri=n$且$0<ri<m$枚举$S=\sum ri$(S范围是$k\le S\le k(m-1) ...

  6. Electron快速入门之事件

    const { app, BrowserWindow } = require('electron') function createWindow () {   const win = new Brow ...

  7. vue的常用指令

    https://www.bootcdn.cn/ 前端资源库 <!-- 常用内置指令 v:text : 更新元素的 textContent v-html : 更新元素的 innerHTML v-i ...

  8. R语言与医学统计图形-【23】ggplot2坐标系转换函数

    ggplot2绘图系统--坐标系转换函数 包括饼图.环状条图.玫瑰图.戒指图.坐标翻转. 笛卡尔坐标系(最常见). ArcGIS地理坐标系(地图). Cartesian坐标系. polar极坐标系. ...

  9. (转载)java排序实现

    Java实现几种常见排序方法 日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法. ...

  10. ARM汇编基础指令

    Cortex-A7 常用汇编指令 一.处理器内部数据传输指令 1.mov 将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面 MOV R0,R1 @将寄存器 R1 中的数据传递给 ...