java 类持久化_Java 持久化之 -- IO 全面整理(看了绝不后悔)

目录:

266de660cbca2a8d39f209f22b37eefd.png

一、java io 概述

什么是IO?

IO包括输入流和输出流,输入流指的是将数据以字符或者字节形式读取到内存 分为字符输入流和字符输入流

输入流指的是从内存读取到外界 ,分为字符输入流和字节输出流

Java IO即Java 输入输出系统。不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进行IO(文件、控制台、网络),我们还要考虑具体和它们的通信方式(顺序、随机、二进制、按字符、按字、按行等等)。Java类库的设计者通过设计大量的类来攻克这些难题,这些类就位于java.io包中。

什么是流?

在Java IO中,流是一个核心的概念。流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。在Java IO中流既可以是字节流(以字节为单位进行读写),也可以是字符流(以字符为单位进行读写)

二、Java IO类库的框架

2.1 Java IO的类型

虽然java IO类库庞大,但总体来说其框架还是很清楚的。从是读媒介还是写媒介的维度看,Java IO可以分为:

1. 输入流:InputStream和Reader

2. 输出流:OutputStream和Writer

而从其处理流的类型的维度上看,Java IO又可以分为:

1. 字节流:InputStream和OutputStream

2. 字符流:Reader和Writer

01:File

创建文件   删除文件 修改文件 删除文件信息

02:字节流InputStream            OutputStream基类(父类)

03:字符流Reader                Writer

04:缓冲流BufferReader           BufferWriter依赖于Reader  Writer

05:二进制流DataInputStream        DataOutputStream依赖于InputStream OutputStream

06:序例化objectInputStream      ObjectOutputStream依赖于InputStream OutputStream

35e8c074252cd9dc91f3bc06279d62df.png

我们的程序需要通过InputStream或Reader从数据源读取数据,然后用OutputStream或者Writer将数据写入到目标媒介中。其中,InputStream和Reader与数据源相关联,OutputStream和writer与目标媒介相关联。 以下的图说明了这一点:

a7ff1a00261ef9fcb9f6c485f6ddecbe.png

三、Java IO的基本用法

3.1 Java IO :字节流(字节流对应的类应该是InputStream和OutputStream)

例1,用字节流写文件

packagecom.dzq;import java.io.*;/*** 字节流 InputStream OutputStream*/

public classByteDemo {public static voidmain(String[] args) {//创建输入流和输出流对象

InputStream inputStream=null;

OutputStream outputStream=null;try{

inputStream=new FileInputStream("e:/aaa.txt");//true代表是否向文件拼接,不能删除之前的内容

outputStream=new FileOutputStream("e:/aaa.txt",true);//向文件写入内容

outputStream.write("54321".getBytes());//read方法0-255,如果流读到了最后,将返回-1

int num=0;//int -1 字符串 null

while ((num=inputStream.read())!=-1){

System.out.println((char)num);

}

}catch(Exception e) {

e.printStackTrace();

}try{

inputStream.close();

outputStream.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

3.2 Java IO :字符流(字符流对应的类应该是Reader和Writer)

例3,用字符流写文件

packagecom.dzq;import java.io.*;/** 字符流 Reader Writer*/

public classCharDemo{public static voidmain(String[] args) {//创建字符流输出和输入

Reader reader=null;

Writer writer=null;try{

reader=new FileReader("e:/aaa.txt");

writer=new FileWriter("e:/aaa.txt",true);

writer.write("我爱我家!");

writer.write("我爱我家?");

writer.write("我爱我家!!");

writer.write("我爱我家??");

writer.flush();

writer.write("我爱我家!!!!");

writer.close();//读取//创建一次性读取多个字符

char[] bytes =new char[1024];int num=0;

StringBuffer stringBuffer=newStringBuffer();while((num=reader.read(bytes))!=-1){

stringBuffer.append(bytes);

}

System.out.println(bytes);

}catch(Exception e) {

e.printStackTrace();

}finally{try{

writer.close();

reader.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

3.3 Java IO  :二进制流(DataInputStream DataOutputStream依赖于InputStream和OutputStream)

packagecom.dzq;import java.io.*;/**二进制流 DataInputStream DataOutputStream*/

public classDataDemo {public static voidmain(String[] args) {//创建输入流和输出流对象

InputStream inputStream=null;

OutputStream outputStream=null;

DataInputStream dataInputStream=null;

DataOutputStream dataOutputStream=null;try{//获取输入流

inputStream=new FileInputStream("e:/aaa.txt");

dataInputStream=new DataInputStream(inputStream);//封装//获取输出流

outputStream=new FileOutputStream("e:/aaa.txt");

dataOutputStream=newDataOutputStream(outputStream);//读取

int num=0;while ((num=dataInputStream.read())!=-1){

dataOutputStream.write(num);//复制

}

}catch(Exception e) {

e.printStackTrace();

}finally{try{

dataOutputStream.close();

dataInputStream.close();

outputStream.close();

inputStream.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

3.4 Java IO(缓冲流BufferReader  BufferWriter依赖于Reader 和Writer)

packagecom.dzq;import java.io.*;/***缓冲流 BufferReader BufferWriter*/

public classBufferDemo {public static voidmain(String[] args) {//创建字符流输出和输入

Reader reader = null;

Writer writer= null;

BufferedReader bufferReader=null;

BufferedWriter bufferedWriter=null;try{//写入

writer=new FileWriter("e:/aaa.txt") ;

bufferedWriter=new BufferedWriter(writer);//封装

bufferedWriter.write("我爱我家1");

bufferedWriter.write("我爱我家2");

bufferedWriter.write("我爱我家3");

bufferedWriter.newLine();//换行

bufferedWriter.write("我爱我家4");

reader.close();

bufferedWriter.close();//如果不关闭后两行出不来//读取

reader=new FileReader("e:/aaa.txt") ;

bufferReader=new BufferedReader(reader);//封装//拼接

String line=null;

StringBuffer stringBuffer=newStringBuffer();while((line=bufferReader.readLine())!=null){

stringBuffer.append(line);

}

System.out.println(stringBuffer.toString());

}catch(Exception e) {

e.printStackTrace();

}finally{try{

bufferReader.close();

reader.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

3.5 Java IO序列化和非序列化

User类:

packagecom.cd;importjava.io.Serializable;public class User implementsSerializable{publicString username;publicString password;publicString getUsername() {returnusername;

}public voidsetUsername(String username) {this.username =username;

}publicString getPassword() {returnpassword;

}public voidsetPassword(String password) {this.password =password;

}publicUser(String username, String password) {this.username =username;this.password =password;

}publicUser(){

}

}

各方法:

packagecom.cd;/*** 序列化和非序列化*/

import java.io.*;importjava.util.Scanner;public classObjectDemo {static Scanner input=newScanner(System.in);//创建输出流和输入流

static InputStream inputStream=null;static OutputStream outputStream=null;static ObjectInputStream objectInputStream=null;static ObjectOutputStream objectOutputStream=null;public static voidmain(String[] args) {//登录

Login();//注册

register();

}//注册

private static voidregister() {

User user=newUser();

System.out.println("请输入你的用户名");

user.setUsername(input.next());

System.out.println("请输入你的密码");

user.setPassword(input.next());try{

outputStream=new FileOutputStream("e:/aaa.txt");

objectOutputStream=newObjectOutputStream(outputStream);//把对象输出到文件中

objectOutputStream.writeObject(user);

}catch(Exception e) {

e.printStackTrace();

}finally{try{

objectOutputStream.close();

outputStream.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}//登录

private static voidLogin() {try{

inputStream=new FileInputStream("e:/user.txt");

objectInputStream=newObjectInputStream(inputStream);//读取对象

User user=(User) objectInputStream.readObject();

System.out.println(user);

}catch(Exception e) {

e.printStackTrace();

}finally{try{

objectInputStream.close();

inputStream.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

3.6Java IO :字节流转换为字符流(InputStreamReader)

public static void convertByteToChar() throwsIOException{

File file= new File( "d:/test.txt");//获得一个字节流 InputStream is= new FileInputStream( file);//把字节流转换为字符流,其实就是把字符流和字节流组合的结果。

Reader reader= newInputStreamReader( is);char [] byteArray= new char[( int) file.length()];int size=reader.read( byteArray);

System. out.println("大小:"+size +";内容:" +newString(byteArray));

is.close();

reader.close();

}

3.7 File 操作文件

DEMO:

public classFileDemo

{static Scanner input =newScanner(System.in);public static voidmain( String[] args )

{

System.out.println("***********欢迎进入文件操作系统*******************");

System.out.println(" *******************1:创建文件*******************");

System.out.println("*******************2:删除文件*******************");

System.out.println("*******************3:修改文件*******************");

System.out.println("*******************4:创建文件夹*******************");

System.out.println("*******************5:删除文件夹*******************");

System.out.println("*******************6:查询文件夹下所有的列表*******************");int choose =input.nextInt();switch(choose){case 1://创建文件

createNewFile();break;case 2://删除文件

deleteNewFile();break;case 3://修改文件

updateNewFile();break;case 4://创建文件夹

mkdirs();break;case 5://删除文件夹

deletemkdirs();break;case 6://查询文件夹下所有的列表

findFileList();break;

}

}

创建文件

private static voidcreateNewFile()

{

System.out.println("请输入文件的名称:(默认为E:/)");

String fileName=input.next();//创建文件

File file=new File("E:/"+fileName);//默认的路径

if(file.exists()){

System.out.println("该文件已存在!");

}else{try{boolean flag =file.createNewFile();if(flag){

System.out.println("文件夹创建成功");

}else{

System.out.println("文件夹创建失败");

}

}catch(IOException e) {

e.printStackTrace();

}

}

}

删除文件

private static voiddeleteNewFile()

{

System.out.println("请输入你要删除的文件名称:(默认为E:/)");

String fileName=input.next();//创建File对象

File file =new File("E:/"+fileName);if(file.exists()){boolean flag =file.delete();if(flag)

{

System.out.println("删除成功");

}else{

System.out.println("删除失败");

}

}else{

System.out.println("该文件不存在");

}

}

修改文件

private static voidupdateNewFile()

{

System.out.println("请你输入需要修改的文件的名称:(默认为E:/)");

String oldFileName=input.next();

System.out.println("请你输入文件的新名称:(默认为E:/)");

String newFileName=input.next();//创建File对象

File oldFile=new File("E:/"+oldFileName);

File NewFile=new File("E:/"+newFileName);if(oldFile.renameTo(NewFile)){

System.out.println("修改成功");

}else{

System.out.println("修改失败");

}

}

创建文件夹

private static voidmkdirs() {

System.out.println("请输入你要创建的文件名称:(默认为E:/)");

String fileName=input.next();//创建File对象

File file =new File("E:/"+fileName);if(file.mkdirs()){

System.out.println("创建成功");

}else{

System.out.println("创建失败");

}

}

删除文件夹

一:删除文件夹的方法(先删除文件夹里面的东西在删除文件)

public static voiddelFolder(String folderPath) {try{

delAllFile(folderPath);//删除完里面所有内容

String filePath =folderPath;

filePath=filePath.toString();

java.io.File myFilePath= newjava.io.File(filePath);

myFilePath.delete();//删除空文件夹

} catch(Exception e) {

e.printStackTrace();

}

}

二:删除文件夹的方法

public static booleandelAllFile(String path) {boolean flag = false;

File file= newFile(path);if (!file.exists()) {returnflag;

}if (!file.isDirectory()) {returnflag;

}

String[] tempList=file.list();

File temp= null;for (int i = 0; i < tempList.length; i++) {if(path.endsWith(File.separator)) {

temp= new File(path +tempList[i]);

}else{

temp= new File(path + File.separator +tempList[i]);

}if(temp.isFile()) {

temp.delete();

}if(temp.isDirectory()) {

delAllFile(path+ tempList[i]);//先删除文件夹里面的文件

delFolder(path + tempList[i]);//再删除空文件夹

flag = true;

}

}returnflag;

}

三:删除文件夹的终极方法

private static voiddeletemkdirs() {

System.out.println("请输入你要删除的文件夹名称:(默认为E:/)");

String fileName=input.next();//创建File对象

File file =new File("E:/"+fileName);if(file.exists()){boolean flag = delAllFile("E:/qqq");if(flag)

{

System.out.println("删除失败");

}else{

file.delete();

System.out.println(" 删除成功");

}

}else{

System.out.println("该文件不存在");

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea 找不到或无法加载主类_解决IDEA中Groovy项目no Groovy library is defined的问题

实验环境IDEA2019.1.2Groovy-2.5.8错误重现新建了一个Groovy工程&#xff0c;指定了groovy版本&#xff0c;如图新建了一个简单的Groovy Class&#xff0c;运行&#xff0c;出现如下错误错误的尝试(以下是试错过程&#xff0c;并不能解决问题&#xff0c;读者可以不要跟着操作&…

C语言标识符、关键字和注释

这一节主要讲解C语言中的几个基本概念。标识符定义变量时&#xff0c;我们使用了诸如“a”“abc”“mn123”这样的名字&#xff0c;它们都是程序员自己起的&#xff0c;一般能够表达出变量的作用&#xff0c;这叫做标识符&#xff08;Identifier&#xff09;。标识符就是程序员…

java 类.class_面试官:Java反射是什么?我回答不上来!

一.概念反射就是把Java的各种成分映射成相应的Java类。Class类的构造方法是private&#xff0c;由JVM创建。反射是java语言的一个特性&#xff0c;它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和…

巧解C语言运算符的优先级和结合性

本篇文章我们从一个例子入手讲解&#xff0c;请看下面的代码&#xff1a;#include int main(){ int a 16, b 4, c 2; int d a b * c; int e a / b * c; printf( "d%d, e%d\n", d, e); return 0; }运行结果&#xff1a;d24, e81) 对于表达式a b * c&#xff0…

jms mdb_MDB!= JMS,反之亦然

jms mdb基本 消息驱动Bean&#xff08;又称为MDB&#xff09;只是另一个EJB&#xff0c;例如无状态&#xff0c;有状态或单例。 使用MessageDriven批注指定。 MDB用于异步消息处理 它们与无状态EJB 相似 &#xff0c;因为它们都是由EJB容器池化的 但是&#xff0c;它们与无状…

C语言中的三目运算符是啥?有何用处?

一般来说&#xff0c;C语言中的三目运算符为a?b:c即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为&#xff1a;表达式1? 表达式2&#xff1a;表达式3求值规则为&#xff1a;如果表达式1的值为真&#xff0c;则以表达式2 的值作为条件表达式的值&#xff0c;否…

status_code想要得到302却得到200_中考200天倒计时!教你高效规划!抓紧抢报预留座位!...

教育点击右上方蓝字关注金石教育金石教育青岛站推送青岛教育资讯&#xff0c;关注孩子成长关注教育主讲人——段莲1、金石教育首席学习规划师&#xff1a;在中考规划行业&#xff0c;段莲老师已经深入研究多年&#xff0c;了解最新的中考数据&#xff0c;并且能够把握住每个数据…

gui jfr_Java飞行记录器(JFR)

gui jfrJFR是一个Java分析器&#xff0c;它使您可以研究代码的运行时特征。 通常&#xff0c;您将使用探查器来确定代码的哪些部分导致大量内存分配或导致消耗过多的CPU。 有很多产品在那里。 过去&#xff0c;我使用过YourKit&#xff0c;OptimizeIt&#xff0c;JProfiler&am…

java 命名内部类_如何把java SWT程序中的匿名内部类改写成命名内部类?

展开全部//请看最后一个e69da5e6ba9062616964757a686964616f31333363386134private class ,其实命名内部类跟普通的java程序一样写&#xff0c;只要知道你自己的监听器要继承于哪个类&#xff0c;实现什么方法public class Level4Class extends ViewPart {private TableViewer …

C语言 | 递增运算符

如何灵活使用C语言递增运算符。 解题思路&#xff1a;自增运算符 使操作数的值加1&#xff0c;其操作数必须为可变左值&#xff08;可简单地理解为变量&#xff09;。对于自增就是加1这一点&#xff0c;读者应该不会有什么疑问。难点在于&#xff1a; 可以置于操作数前面&#…

数据结构实验之图论四:迷宫探索_迷宫搜索类的双向bfs问题(例题详解)

前言文章若有疏忽还请指正&#xff01;更多精彩还请关注公众号&#xff1a;bigsai头条号&#xff1a;一直码农一直爽在搜索问题中&#xff0c;以迷宫问题最具有代表性&#xff0c;无论是八皇后的回溯问题&#xff0c;还是dfs找出口&#xff0c;bfs找最短次数等等题目的问题。在…

ngrok服务器搭建_利用暴露在外的API,无法检测的Linux恶意软件将矛头指向Docker服务器...

K8s已经成为一线大厂分布式平台的标配技术。你是不是还在惆怅怎么掌握它&#xff1f;来这里&#xff0c;大型互联网公司一线工程师亲授&#xff0c;不来虚的&#xff0c;直接上手实战&#xff0c;3天时间带你搭建K8s平台&#xff0c;快速学会K8s&#xff0c;点击下方图片可了解…

干货 | C语言系列3——常量,运算符,常用数学函数......

符号常量和const常量1.符号常量符号常量通俗来讲就是“替换”&#xff0c;又称为宏定义。格式如下&#xff1a;#define 标识符 常量宏定义可以定义单个变量为常量&#xff0c;也可以定义某个语句或片段。宏定义有一点需要特别注意&#xff0c;它只是“机械”替换&#xff0c;并…

javafx 浏览器_浏览器中的JavaFX

javafx 浏览器浏览器中的JavaFX屏幕截图 最近&#xff0c;Carl Dea和我启动了一个新项目&#xff0c;将JavaFX 8引入浏览器。 今天&#xff0c;我想介绍我们创建的前两个概念验证&#xff0c;以查看该想法是否完全可行。 对于不耐烦的人&#xff0c;这里是到PoC的链接。 但请注…

javafx 示例_JavaFX列表示例

javafx 示例这是使用JavaFX构建的示例列表应用程序。 该应用程序是待办事项列表。 该应用程序具有添加&#xff0c;更新和删除列表中项目的功能。 列表数据存储在HSQLDB关系数据库中。 该应用程序使用JDBC&#xff08;Java数据库连接&#xff09;API访问数据库。 该应用程序打包…

嵌入式C语言的7个硬核知识

1void 与 void*void表示的是无类型&#xff0c;不可以采用这个类型声明变量或常量&#xff0c;但是可以把指针定义为void类型&#xff0c;如void* ptr。void指针可以指向任意类型的数据&#xff0c;可用任意数据类型的指针对void指针赋值&#xff0c;比如int *ptrInt&#xff1…

C语言指针用得好犹如神助!这些使用技巧值得收藏

指针用的好犹如神助&#xff0c;用不好会让你叫苦连连&#xff0c;但大多数人是用不好指针的&#xff0c;所以后来的很多语言都把指针封装&#xff0c;屏蔽。比如JAVA&#xff0c;java是没有指针的&#xff0c;但是很多地方都用到指针&#xff0c;不过不对用户开放&#xff0c;…

wso2_使用WSO2开发

wso2几个月以来&#xff0c;我又开始使用WSO2产品。 在接下来的文章中&#xff0c;我描述了我遇到的一些&#xff08;小&#xff09;问题以及如何解决它们。 设置开发环境时&#xff0c;我要做的第一件事是在Mac上下载Developer Studi o&#xff08;64位版本&#xff09;。 解…

有意思的C语言运算符

在C语言中&#xff0c;运算符用于执行程序代码运算&#xff0c;会针对两个或者两个以上操作数进行运算。比如&#xff1a;5 - 2&#xff0c;它的操作数是 5 和 2&#xff0c;而运算符则是 “-”。常见的运算符可大致分为 4 种类型&#xff1a;算术运算符、关系运算符、赋值运算…

java反向映射_opencv 直方图和直方图反向映射

histogram使用np进行直方图像素统计通过histogram对图像的三个通道分别进行一维直方图统计&#xff0c;由于被统计的数组必须是一维的&#xff0c;所以使用ravel将二维数组转换为一维数组&#xff0c;通过range参数指定统计区间为0--256&#xff0c;bin参数指定将统计区间分为2…