本文主要借鉴以下博客和网站:

how2j.cn

深入理解java中的I/O

JAVA文件操作

JAVA描述和管理文件的类是java.io.File类,通过File生成的对象file,可以通过以下指令对文件进行操作:

  1. file.exists() – 判断文件是否存在
  2. file.isDirectory() – 判断文件是否为文件夹
  3. file.isFile() – 判断是否是普通文件(不是文件夹)
  4. file.length() – 获取文件的长度
  5. file.lastModified() – 获取文件最后修改的时间
  6. file.getAbsolutePath() – 获取文件的绝对路径
  7. file.list() – 返回当前文件夹的所有子文件的文件名(深度为1),返回类型为字符串数组
  8. file.listFiles() – 返回当前文件夹的所有子文件(深度为1),返回类型为文件数组
  9. file.getParent() – 返回当前文件的父文件夹的名字
  10. file.getParentFile() – 返回当前文件的父文件夹
  11. file.mkdir() – 创建文件夹(如果父类文件夹不存在,则创建无效)
  12. file.mkdirs() – 创建文件夹(如果父类文件夹不存在,则连同父文件夹一同创建)
  13. file.getParentFile().mkdirs()常用,创建一个文件前,常把父类目录都创好
  14. file.delete() – 删除文件

以下将展示几种流的使用方法(只展示读,写文件类似)

JAVA字节流

操作数据类型是字节,也就是JAVA数据类型中的byte,所有字节流的父类是InputStreamOutputStream(两个都是的抽象类)在这里插入代码片



直接上代码:

import java.io.*;
public class Main {
public static void main(String[] args) {
//文件中内容是 aAbB
File file = new File("src/blog/test.txt");
//对于文件操作,采用字节输入流子类FileInputStream
//建议采用在try括号内使用流的声明,即使在异常时也能关闭流,减少资源损耗
try(InputStream fi = new FileInputStream(file)){
byte[] bytes = new byte[(int) file.length()];
//将文件中的数据以字节流形式读入到bytes中
fi.read(bytes);
for(byte b : bytes) {
System.out.println(b);//打印ASCII码的十进制形式
}
}catch (FileNotFoundException fe) {
fe.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

结果为(“aAbB”的ASCII码的十进制):

97

65

98

66

JAVA字符流

与字节流不同,字符流操作的数据对象的最小单元是字符,比较符合我们的日常读文本的习惯,所以在读文本时用的很多,具体的字符输入流和字符输出流为ReaderWriter,专门用于字符的形式读取和写入数据。

具体代码如下:

import java.io.*;
public class Main {
public static void main(String[] args) {
//文件中内容是 aAbB
// cCdD
File file = new File("src/blog/test.txt");
//对于文件操作,采用字符输入流FileReader
//建议采用在try括号内使用流的声明,即使在异常时也能关闭流,减少资源损耗
try(Reader fr = new FileReader(file)){
char[] chs = new char[(int) file.length()];
fr.read(chs);
for(char c : chs) {
System.out.print(c);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }

运行结果如下(输出文本内容aAbBcCdD):

aAbB

cCdD

有时我们要对文本进行逐行处理,但以上的方法都是“一口将文件吃掉“,一次性读完所有的内容,这时我们需要一个新的流来帮我们一步步做,这时缓存流就登上了舞台。

JAVA缓存流

JAVA缓存流读取数据用的是BufferedReader,写入数据用的是BufferedWriter。这里用到了设计模式中的装饰者模式,在此不过多赘述,我们直接看缓存流是如何”装饰“字符流来实现逐行读取的。

代码如下:

import java.io.*;
public class Main {
public static void main(String[] args) {
//文件中内容是 aAbB
// cCdD
File file = new File("src/blog/test.txt");
//逐行读取,采用缓存流BufferedReader
//建议采用在try括号内使用流的声明,即使在异常时也能关闭流,减少资源损耗
try(
Reader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
)
{
String line = "";
while((line = br.readLine()) != null) {//读取一行
System.out.println(line.toUpperCase());//全部转化为大写
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }

输出处理后的结果:

AABB

CCDD

JAVA对象流

对象流指的是可以直接把一个对象以流的形式传输给其他的介质,但是,把一个对象序列化有一个前提是:这个对象的类,必须实现了Serializable接口。

注意,写入到文本时,对象以序列化后的二进制形式存放,用文本查看时会乱码

代码如下:

import java.io.*;
class Student implements Serializable{
//表示这个类当前的版本,如果有了变化,比如新设计了属性,就应该修改这个版本号
private static final long serialVersionUID = 1L;
String name;
int id;
public Student(String name, int id) {
this.name = name;
this.id = id;
}
@Override
public String toString() {
return "Student [name=" + name + ", id=" + id + "]";
} } public class Main {
public static void main(String[] args) {
File file = new File("src/blog/test.txt");
write(file);
read(file);
} //写入对象
static void write(File file) {
try(
OutputStream out = new FileOutputStream(file);
ObjectOutputStream objout = new ObjectOutputStream(out);//对象输出流
)
{
Student[] students = new Student[2];
students[0]= new Student("xsy", 123456);
students[1] = new Student("theory", 654321);
objout.writeObject(students);//只能写一次
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} //读取对象
static void read(File file) {
try(
InputStream in = new FileInputStream(file);
ObjectInputStream objin = new ObjectInputStream(in);//对象输入流
)
{
Student[] students = (Student[]) objin.readObject(); // 读取文件中的所有对象
for (Student s : students) {
System.out.println(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

对象读取的运行结果为:

Student [name=xsy, id=123456]

Student [name=theory, id=654321]

JAVA数据流

数据流的目的在于对文本数据进行格式化读写,以下代码先写入一个整型int和字符串String,然后按顺序readInt和readUTF读取。

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 Main { public static void main(String[] args) {
write();
read();
} private static void read() {
File f =new File("src\\blog\\test.txt");
try (
FileInputStream fis = new FileInputStream(f);
DataInputStream dis =new DataInputStream(fis);
){
int i = dis.readInt();
String str = dis.readUTF(); System.out.println(i);
System.out.println(str); } catch (IOException e) {
e.printStackTrace();
} } private static void write() {
File f =new File("src\\blog\\test.txt");
try (
FileOutputStream fos = new FileOutputStream(f);
DataOutputStream dos =new DataOutputStream(fos);
){
dos.writeInt(1);
dos.writeUTF("xsy");
} catch (IOException e) {
e.printStackTrace();
} }
}

运行结果如下:

1

xsy

JAVA I/O基本操作的更多相关文章

  1. java之文件基本操作

    java之文件基本操作 1 使用 BufferedReader 在控制台读取字符 public static void readChar() throws IOException{ char c; I ...

  2. 使用mac学习java的一些基本操作

    使用mac学习java的一些基本操作 本文主要讲一下MacOS与windows的不同 iTerm2 使用mac的同学是不需要安装虚拟机来学习linux命令的.只需要使用iTerm2[下载地址]+zsh ...

  3. Java 窗体的基本操作语句 JFrame

    package com.swift; import java.awt.Color; import java.awt.GridLayout; import java.util.Random; impor ...

  4. Java File类基本操作

    我们可以利用Java.io.File类对文件进行操作,基本操作如下: 1)创建文件: public boolean createNewFile() throws IOException 2)删除文件: ...

  5. java 反射的基本操作

    一.反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为j ...

  6. 小学生四则运算出题程序 无操作界面java版 简单的运用java中一些基本操作

    这是本学期java课中实验大纲里的第一个实验,这里简单做了一个无用户界面版本. import java.util.Random; import java.util.Scanner; public cl ...

  7. java 文件的基本操作

    1 /** * java 文件操作 * 2016/5/10 **/ package cn.Java_7; import java.io.*; import java.util.Scanner; imp ...

  8. java列表数据基本操作

    列表数据组基本的增删改查 package cn.edu.fhj.day002; import java.util.ArrayList; public class ArrList { // 定义一个主函 ...

  9. JAVA的输入输出基本操作样例

    这些类的继承关系有些类似,弄一个作为样例,理解一下其中的机制. package cc.openhome; import java.io.*; public class Member { private ...

随机推荐

  1. 「从零单排canal 03」 canal源码分析大纲

    在前面两篇中,我们从基本概念理解了canal是一个什么项目,能应用于什么场景,然后通过一个demo体验,有了基本的体感和认识. 从这一篇开始,我们将从源码入手,深入学习canal的实现方式.了解can ...

  2. 用VMware克隆CentOS 6.5如何进行网络设置

    我们使用虚拟机的克隆工具克隆出了一个电脑,电脑连接采用nat方式 111电脑对于的ip地址设置如下 [root@localhost ~]# cd /etc/sysconfig/network-scri ...

  3. MySQL Workbench 8.0 目录汉化

    <?xml version="1.0"?> <data> <value type="list" content-type=&quo ...

  4. day19__第三次作业

    一.break 与 continue 的区别 答:break 是结束全部循环,continue 是结束当前循环,开始进行下一循环 二.函数传递参数时,所用的内存地址一样吗? 答:一样 name = ' ...

  5. Java中List集合去除重复数据的方法1

    1. 循环list中的所有元素然后删除重复 public   static   List  removeDuplicate(List list)  {         for  ( int  i  = ...

  6. 网络基础和 TCP、IP 协议

    1.网络基本概念 1.1 什么是网络:一些网络设备按照一定的通讯规则(网络协议)进行通讯的系统. 1.2 VPN(虚拟私有网络)加密,相当于专线,从分支机构到总部. 1.3 资源共享的功能和特点: 数 ...

  7. P4817 Fruit Feast G

    最开始拿到这道题的时候,题目中其实只规定了两种水果的饱食度,可以理解成价值或是重量,在不超过T的情况求最大值.第一眼看过去感觉就是装箱问题(背包),只不过这道题用的是完全背包,但是考虑到喝水的情况,做 ...

  8. actuator与spring-boot-admin 可以说的秘密

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  9. redis-cli连接redis服务器操作

    安装redis-cli 命令:redis-cli -h 地址 -p 端口号 认证:auth 密码 选择对应的DB:Select DB号(0~15) 查看对应的Key的过期时间:TTL Key名称 查看 ...

  10. 09 . Kubernetes之pv、pvc及使用nfs网络存储应用

    PV,PVC概述 PV的全称是: PersistentVolume (持久化卷),是对底层的共享存储的一种抽象,PV由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如Ceph.G ...