天道酬勤,学无止境

Java字节流与字符流及文件操作

目录

  • Java.io知识点梳理
  • File类
  • 字节流OutputStream
  • 字节流InputStream
  • 字符流Writer
  • 字符流Reader
  • 字节流与字符流的转换(了解)
  • 字节流与字符流的区别?
    • 两者如何使用?

Java.io知识点梳理

如果要进行所有的文件以及文件内容的开发操作,应该使用java.io包完成,而在java.io包里面一共有五个核心类和一个核心接口:

  1. 五个核心类:File、InputStream、OutputStream、Reader、Writer
  2. 一个核心接口:Serializable
    在这里插入图片描述

File类

在整个java.io包里面,File类是唯一一个与文件本身操作有关的类 ,但是不涉及到文件的具体内容,所谓的文件本身,指的是文件的创建和删除等。

几个重点掌握方法:
1.构造方法:public File(String pathname) 设置文件路径
2.普通方法:public boolean delete(); 删除文件
3.普通方法:public boolean exists()判断文件是否存在
4.普通方法:public File getParentFile();public String getParentFile();得找到父路径
5.普通方法:public Boolean mkdirs() 创建多级子目录
6普通方法:.public long length() 取得文件大小,按照字节大小返回;

例:创建目录及文件

import java.io.File;

public class TestFile02 {
	public static void main(String[] args) throws Exception{
		File file = new File("g:"+File.separator+"demo"+File.separator+"next"+File.separator+"test.txt");//设置路径
		System.out.println(file.getParent());//g:\demo\next
		if(!(file.getParentFile().exists())) {//如果父路径不存在
			file.getParentFile().mkdirs();//如果nex不存在,就创建next
		}
		if(file.exists()) {
			System.out.println("删除成功"+file.delete());
		}else {
			System.out.println(file.createNewFile());
		}
	}
}

注意:1.为什么不使用"\\"(表示转义成\)或者“\”?

1.在Windows系统里面支持的是“\”路径分隔,Linux(部署项目)下使用的是“/”路径分隔符;
解决:在File类里面提供有一个常量:public static final String separator(特殊,一般为大写的常量)

2.为什么创建文件时会有延迟?

在进行java.io操作的过程中,出现延迟情况,是因为java程序是通过JVM间接调用操作系统的文件处理函数进行文件处理操作(它不能直接操作文件),所以中间出现延迟。

字节流OutputStream

OutputStream类是一个专门进行字节数据输出的一个类,这个类定义如下

public abstract class OutputStream extends Object
	implements Closeable, Flushable //实现了两个接口
public interface Closeable extends AutuCloseable 
public interface  AutuCloseable 

了解一下它实现的两个接口Closeable和Flushable
在JDK1.7的时候引入了一个非常神奇的自动关闭机制,所以让Closeable又多继承了一个AutoCloseable接口,但是OutputStream类在JDk1.0的时候就提供有close()、和flush()两个操作方法,所以以上的两个接口就几乎可以忽略了。

使用OutputStream输出文件内容

OutputStream本身是属于抽象类,如果想要为抽象类进行对象的实例化操作,那么一定要使用抽象类子类,而本身要进行的是对文件的操作,所以可以使用FileOutStream子类。
在FileOutStream子类里定义的构造方法:public FileOutputStream(File file)
创建文件输出流以写入由指定的 File对象表示的文件。

在OutputStream类提供有三个输出方法:
在这里插入图片描述

**例:**输出字节数组

	public static void main(String[] args) throws Exception {
		//1.定义输出文件的路径     (资源访问到处都是异常)
		File file =new File("G:"+File.separator+"demo1"+File.separator+"OutpS.text");
		//1.此时由于目录不存在,所以文件不能输出,那么得创建目录
		if(!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();
		}
		//2.使用OUtputStream和其子类进行对象实例化
		//2.此目录存在,文件不存在,利用其构造(File file)生成文件
		OutputStream output =new FileOutputStream(file,true);
		//3.要进行文件内容的输出,并将字符串变为字节数组
		String str ="你好,HelloWorld\r\n";
		byte data[]=str.getBytes();
		//4.将内容输出
		output.write(data);
		//资源操作的最后一步一定要进行关闭
		output.close();
	}

以上对内容进行了输出,并且如果此时要输出的文件不存在,那么将自动进行创建。

**例:**出指定位置(开始),指定长度,字节

public class TestOutpS03 {
	public static void main(String[] args) throws Exception {
		File file =new File("G:"+File.separator+"demo1"+File.separator+"OutpS03.text");
		if(!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();
		}
		//2.此目录存在,文件不存在,利用其构造(File file)生成文件
		OutputStream output =new FileOutputStream(file);
		String str ="你好,HelloWorld!";
		byte data[]=str.getBytes();
		output.write(data,6,5);
		output.close();
	}
}

输出结果为:Hello
注意:我们这是对字节进行输出,一个中文or中文标点占用两个字节(你好,),所以我们是从“H”开始,输出5个字节后结束。

以上操作默认为覆盖内容,如要追加内容,在后面加true在这里插入图片描述
如果涉及到追加那么,那么我们就得换行,而这里的换行
为什么必须是\r加上\n?
\r是回车符
\n是换行符
Linux和Unix系统的换行是"\n",而Windows的换行并不是直接的“\n”,因为Windows不认为"\n"是换行,在文档中只是一个空格或者小黑框。所以应该是先回车,再换行。

字节流InputStream

InputStream也一个抽象类,所以如果想进行文件读取,我们的使用它的子类FileStream(具体实现接口与OutputStream差不多)

其子类构造方法:public FileOutputStream(File file)

在InputStream中定义了如下三种方法读取数据:

1.读取的单个字节:public abstract int read()
|-返回值:从输入流读取数据的下一个字节。 值字节被返回作为int范围0至255 。 如果没有字节可用,因为已经到达流的末尾,则返回值-1 。(返回值与2.3有区别)
2.将读取的数据保存在字节数组里:public int read(byte[]b) (不建议用)
|-返回值:返回读取的数据长度,已经到达流的末尾,则返回值-1 。
3.将读取的数据保存在部分字节数组里:public int read(byte[]b, int off,int len)
|-返回值:读取的部分数据的长度,已经到达流的末尾,则返回值-1 。

例:将读取的数据保存在部分字节数组里

public class TestInputS02 {
	public static void main(String[] args) throws Exception {
		File file =new File("G:"+File.separator+"demo1"+File.separator+"OutpS.text");
		if(file.exists()) {//文件存在
			//2.使用InputStream进行读取
			InputStream input =new FileInputStream(file);
			byte data[]=new byte [1024];//准备一个1024的字节数组(缓冲区)
			//将内容存到数组中,并用len接收他的长度
			int len=input.read(data);
			System.out.println(len);//接收返回值
			input.close();
			System.out.println("【"+new String(data,0,len)+"】");
		}else {
			System.out.println("文件不存在!");
		}
	}
}

这个是我们文本内容
在这里插入图片描述
输出结果:
在这里插入图片描述
可以看到这个返回值是字节长度。

例:读取的单个字节:public abstract int read()

		File file =new File("G:"+File.separator+"demo1"+File.separator+"InpS.text");
		if(file.exists()) {//文件存在
			InputStream input =new FileInputStream(file);
			byte data[]=new byte [1024];//准备一个1024的字节数组(缓冲区)
			int temp =0; //接收每次读取的字节数据
			for(int x=0;x<5;x++) {
				temp=input.read(); //只接收5个返回值
				System.out.println(temp);
			}

这是我们的文本内容
在这里插入图片描述
结果:
在这里插入图片描述
可以看到这时返回的是该字所对应的ASCII值

字符流Writer

public abstract class Writer
	 implement Closerable,Appendable,Flushable

Appendable接口定义如下:(虽然有这个接口,但我们基本上用不上,因为Writer接口本身就有write方法)
在这里插入图片描述

在Writer类里面定义有以下的输出方法(部分):

输出全部字符数组:public void write(char[] cuuf)
输出字符串:public void write(String Str)
Writer是一个抽象类,如果要想为这个类的对象实例化,应该使用FileWriterd子类(和FileOUtputStream一样提供有File构造)

例:使用Writer输出字符串
在这里插入图片描述
可以发现Writer可以作为字符串输出流,可以直接进行字符串的输出

字符流Reader

Reader是进行字符数据读取的输入流,其本身也是抽象类

在Reader类里面提供有一系列的读取内容的方法

Public int read(char [] cbuf)
表示读取的数据长度,如果已经读到结尾了返回-1
在read中没有能够返回字符串的方法

例:
在这里插入图片描述
与字节输入流相比结构几乎是一样只是数据类型byte换成char。

字节流与字符流的转换(了解)

public class InputStreamReader extends Reader	

在java.io包里面提供有两个类:InputStreamReader(Reader的子类)、OUtputStreamWriter(Writer的子类)
两个构造方法:
1.public InputStreamReader(InputStream in)
2. public InputStreamWriter(OutputStream out)
在这里插入图片描述

这种转换的意义不大,但有一种情况可能会用到(字符流方便处理中文数据)

字节流与字符流的区别?

字节流与字符流的最大的区别是:字节流直接与终端进行数据交换,而字符流需要将数据经过缓冲区处理后才可以输出。(OutputStream字节流如果没有使用close关闭数据流,结果可以正常输出,而Writer字符流没有使用close关闭数据流,那么缓冲区之中处理的内容不会被强制清空,所以不会输出数据),如果有特殊情况不能够关闭字符流,可以使用flush()方法强制清空缓冲区。

 flush方法和close方法的区别
    - flush :刷新缓冲区,流对象可以继续使用。
    - close:  先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

相同:使用两个流进行数据输出(输入)时,都是以字节的方式保存(读取),而在使用字符流读取的时候,实际上也是对字节数据进行读取,只不过这个转换的过程被操作系统隐藏了,在缓冲区里面机进行数据的转换。

两者如何使用?

用字节数据处理的比较多,例如:图片、视频、音乐、文字
字符流:唯一的好处是能对中文进行处理。
所以:在开发中如果要处理中文最好使用字符流,如果不是中文使用字节流(使用较多)。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Java IO流及装饰者设计模式学习笔记
    1、IO流基本概念 IO流及输入输出流,常用可分为两大类:字节流、字符流。 区别与应用场景:字节流在处理出入输出时不会用到缓存,而字符流用到了缓存。字符流用来处理单个字节无法表示的内容。 字符流原理:若干字节->解码方式->解码->索引字符集->字符。 2、IO类设计模式与设计原理 IO类在设计时采用了装饰者设计模式(Decorator),主要通过抽象装饰者类来实现。 2.1、装饰者设计模式 定义及优点:在不改变原有对象的基础之上,将功能附加到对象上。使用不同装饰类以及这些类的排列组合,可以动态的实现不同的效果。 2.2、IO流中的装饰者模式 以InputStream为例,通过抽象装饰者类FilterInputStream来实现装饰类,如BufferedInputStream就是一个继承FilterInputStream类实现的装饰类。 2.3、如何实现一个新的装饰类 示例如下: import java.io.FileInputStream; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; /** * @author my: * @version 2020-09-07 * IO流实现机制练习(装饰者模式) */ public class Demo_1
  • 技术问答-12 java字节流和字符流
    1.什么是流Java中,把所有的输入和输出都当做流来处理。“流”是一种抽象概念,他代表任何有能力产出数据的数据源对象或者有能力接收数据的接收端对象。“流”屏蔽了实际的输入/输出设备中处理数据的细节。一个程序可以打开一个数据源上的流,然后按顺序读取这个流中的数据到程序中,这样的流称为输入流。一个程序打开一个目的地的流,然后按顺序的把程序中的数据写入到这个目的地中,这样的流称为输出流。2.字节流Java中的字节流处理的最基本单位是字节,他通常用来处理二进制数据。Java中最基本的两个字节流是InputStream OutputStream ,他们分别代表了一组基本的输入字节流和输出字节流。InputStream 和 OutputStream 是抽象类,实际使用中我们会用到他们的一系列子类例子:InputStream public abstract int read() throws IOException; 这个方法是从字节流中读取一个字节若到了末尾返回-1 ,他会一直阻塞直到返回一个读取到的字节或者是-1,字节流默认情况下不支持缓存,也就是每一次read调用都会请求操作系统来读取一个字节,这会伴随一次磁盘IO操作read(byte b[]) 这个方法只是在内部循环调用了read方法 关于磁盘IO操作并没有减轻 如果我们想减少磁盘IO操作,也就是使用内存缓冲
  • JAVA文件IO操作
    JAVA文件IO操作 学习札记 引子1、File类File类RandomAccessFile类 2、流类管道流ByteArrayInputStream和ByteArrayOutputStreamDataInputStream和DataOutputStream(数据字节输入流和数据字节输出流)SequenceInputStream文件合并流字节流与字符流的转化 3、字符编码4、对象序列化 发布于2019年09月06日 ⇲禁止转载于copy 笔记属于应用和基础原理层面,为浅谈;不涉及源代码解析。 引子 当我们要将Java程序中产生的数据永久性地保存起来的时候,应该想到的是将数据存到文件当中。将数据存入文件和将数据从文件中取出就涉及到了I/O的输入输出技术。Java提供了I/O操作可以将数据保存到多种类型的文件当中(当然每种特定格式的文件有其独特的构造方式和存取方式),本篇笔记将带你了解操作各种类型文件都具有的共同部分,了解了这些共同之处,就算遇到鲜有接触的文件格式也能灵活驾驭。 包括内容:File类、各种流类、字符的编码、对象序列化 1、File类 File类 是IO包中唯一代表磁盘文件本身的对象,进一步说就是File类起到了一个文件句柄的作用,所有对磁盘文件层面的操作都需要通过它,所有对磁盘文件的存取操作都需要先通过获取File类来完成
  • 【Java基础-3】吃透Java IO:字节流、字符流、缓冲流
    Java IO流 前言1 初识Java IO1.1 IO流分类1.2 案例实操 2 IO流对象2.1 File类2.2 字节流2.3 字符流2.4 序列化 3 IO流方法3.1 字节流方法3.2 字符流方法 4 附加内容4.1 位、字节、字符4.2 IO流效率对比4.3 NIO 前言 有人曾问fastjson的作者(阿里技术专家高铁):“你开发fastjson,没得到什么好处,反而挨了骂背了锅,这种事情你为什么要做呢?” 高铁答道:“因为热爱本身,就是奖励啊!” 这个回答顿时触动了我。想想自己,又何尝不是如此。写作是个痛苦的过程,用心写作就更加煎熬,需字字斟酌,反复删改才有所成。然而,当一篇篇精良文章出自己手而呈现眼前时,那些痛苦煎熬就都那么值得。如果这些博文能有幸得大家阅读和认可,就更加是莫大的鼓舞了。技术人的快乐就是可以这么纯粹和简单。 点波关注不迷路,一键三连好运连连! IO流是Java中的一个重要构成部分,也是我们经常打交道的。这篇关于Java IO的博文干货满满,堪称全网前三(请轻喷!) 下面几个问题(问题还会继续补充),如果你能对答如流,那么恭喜你,IO知识掌握得很好,可以立即关闭文章。反之,你可以在后面得文章中寻找答案。 Java IO流有什么特点?Java IO流分为几种类型?字节流和字符流的关系与区别?字符流是否使用了缓冲?缓冲流的效率一定高吗?为什么
  • Java ,如何用标准的输入输出流重定向到一个文件
    最近,在学习Java,并且学习到了Java的IO(输入与输入),什么是Java IO呢? IO流位于java.io包中,根据操作数据不同,分为字节流和字符流;根据数据输入方面的不同又可分为输入流和输出流,无论是何种流,最终都依赖于操作系统。一、字节流:1、字节流,主要用于图片、音频、视频的传输,以二进制的形式进行,分为字节输入流和字节输出流;字节流操作的是字节数组;字符流操作的是字符数组。2、字节输入与字节输出流的继承体系图 InputStream 常用方法方法声明功能描述int read()从输入流读取一个8位的字节,把它转换为0-255之间的整数,并返回这一整数int read(byte[] b)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取的字节数int read(byte[] b,int off,len)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节void close()关闭此输入流并释放与该流关联的所有系统资源 OutputStream 常用方法方法声明功能描述void write(int b)向输出流写入一个字节void write(byte[] b)把参数b指定的字节数组的所有字节写到输出流void write(byte[] b,int off,len
  • 字节流和字符流详解
    1.流的概念 在编程中是一种抽象的概念,就好比“水流”,从一段流向另一端在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。 2.流的分类 按照流向可以分为:输入流(如:键盘,麦克风),输出流(如:显示器,音箱) 按照传输单位可以分为:字节流和字符流 3.什么是字节流,什么是字符流 字节流: 它处理单元为1个字节(byte),操作字节和字节数组,存储的是二进制文件,如果是音频文件、图片、歌曲,就用字节流好点(1byte = 8位); 字符流: 它处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,如果是关系到中文(文本)的,用字符流好点(1Unicode = 2字节 = 16位); 所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能
  • FileInputStream与FileReader(FileInputStream vs FileReader)
    问题 FileReader rd=new FileReader("new.mp4"); FileWriter wr=new FileWriter("output.mp4"); int ch; while((ch=rd.read())!=-1) wr.write(ch); wr.flush(); wr.close(); 当我使用FileReader和FileWriter读写mp4文件时, output.mp4文件无法很好地呈现。 但是当我使用FileInputStream和FileOutputStream它工作得很好。 因此,我可以得出结论FileReader和FileWriter仅用于读取和写入文本吗? 回答1 是的,您的结论是Reader和Writer正确子类适用于读取/写入文本内容。 InputStream / OutputStream用于二进制内容。 如果您看一下文档: Reader用于读取字符流的抽象类 InputStream抽象类是表示字节输入流的所有类的超类。 回答2 FileReader (以及其他扩展Reader的东西)的确适用于text 。 从阅读器的文档中: 读取字符流的抽象类。 (强调一下。)查看一下API,您将发现它与文本有关–整个地方都是char而不是byte 。 InputStream和OutputStream用于二进制数据,例如mp4文件。
  • 字节流和字符流(Byte Stream and Character stream)
    问题 请解释什么是字节流和字符流。 这些到底是什么意思? Microsoft Word文档是面向字节还是面向字符? 谢谢 回答1 流是顺序访问文件的一种方式。 字节流逐字节访问文件。 字节流适用于任何类型的文件,但不适用于文本文件。 例如,如果文件使用unicode编码,并且一个字符用两个字节表示,则字节流将分别处理这些字节,您需要自己进行转换。 字符流将逐字符读取文件。 必须为字符流提供文件的编码,以使其正常工作。 尽管Microsoft Word文档包含文本,但是无法使用字符流(它不是文本文件)进行访问。 您需要使用字节流来访问它。 回答2 ByteStreams : 从oracle文档页面中有关字节流的信息: 程序使用字节流执行8位字节的输入和输出。 所有字节流类都继承于InputStream和OutputStream 。 何时使用: 字节流仅应用于最原始的I / O 何时不使用: 您不应该使用字节流读取字符流 例如读取文本文件 字符流: 从oracle文档页面中有关字符流的信息: Java平台使用Unicode约定存储字符值。 字符流I / O会自动将此内部格式与本地字符集转换。 所有字符流类均来自Reader和Writer 。 字符流通常是字节流的“包装器”。 字符流使用字节流执行物理I / O,而字符流则处理字符和字节之间的转换。 有两个通用的字节到字符“桥”流:
  • IO
    IO 文件操作一定要慎重 1.File类:文件和目录路径名的抽象表示。(一个file类对象可以表示一个文件)。 用户界面和操作系统使用依赖于系统的路径名字符串来命名文件和目录。 此类提供了一个抽象的,与系统无关的分层路径名视图。 抽象路径名有两个组成部分: 可选系统有关的前缀字符串,如磁盘驱动器符, "/“对于UNIX根目录下,或者”\\"的Microsoft Windows UNC路径,并 一个零个或多个字符串名称的序列。 抽象路径名中的第一个名称可以是目录名称,对于Microsoft Windows UNC路径名,可以是主机名。 抽象路径名中的每个后续名称表示目录; 姓氏可以表示目录或文件。 空抽象路径名没有前缀和空名称序列。 常用的构造方法 File​(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。 File​(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 File​(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。 常用方法: boolean delete() 删除此抽象路径名表示的文件或目录。 boolean mkdir() 创建此抽象路径名指定的目录。 boolean mkdirs()
  • JAVA字节流和字符流的区别
    之前在复习IO的时候,为了方便记忆,提到了以Stream结尾的为字节流,以Writer或者Reader结尾的为字符流。 除了在使用上的不一样,那究竟两者有什么区别呢。直接给出结论:字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。 测试方法:使用OutputStream和Writer分别对文本文件做写入,但是并不关闭、不刷新(flush)输出流,执行后看是否能成功写入。 OutputStream package com.leolee.eurekaclient.test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Tests { public static void main(String[] args) throws IOException { final String text = "Hello"; File file = new File("C:" + File.separator + "Users" + File.separator + "LeoLee" + File.separator + "Desktop
  • 什么是序列化?(What is Serialization?)
    问题 我开始使用面向对象编程(OOP),并且想知道:在OOP中,序列化的含义是什么? 回答1 序列化是将内存中的对象转换为字节流的过程,因此您可以执行诸如将其存储在磁盘上或通过网络发送等操作。 反序列化是相反的过程:将字节流转换为内存中的对象。 回答2 简而言之,序列化是将对象转换为字节流的过程,以便可以通过网络进行传输或将其存储在持久性存储中。 反序列化与之完全相反-从网络或持久性存储中获取字节流,并将其转换回具有相同状态的Object。 要了解的是如何解释或操作这些字节流,以便我们获得完全相同的对象/相同状态。 有多种方法可以实现这一目标。 他们之中有一些是 - XML :将对象转换为XML,通过网络传输它或将其存储在文件/数据库中。 检索它并将其转换回具有相同状态的对象。 在Java中,我们使用JAXB (用于XML绑定的Java体系结构)库。(从Java 6起,它与JDK捆绑在一起)。 JSON :可以通过将对象转换为JSON (JavaScript对象表示法)来完成此操作。 再次有GSON库可用于此目的。 或者我们可以使用OOP语言本身提供的序列化。 例如,在Java中,您可以序列化对象,使其实现Serializable interface并写入对象流。 回答3 什么是序列化? 通过图片的简单说明: 用类推解释: 假设我正在和我的好友通电话谈论我的新小狗。 这是我的问题
  • java基础 - IO流 字节流与字符流 每天积极向上
    字节流(2字节 = 8bit) 输入:InputStream 输出:OutputStream 字符流(4字节 = 16bit) 输入:Reader 输出:Writer 处理文本用字符流,处理媒体文件用字节流 字节流处理文本:字节流一次读2个字节,而一个中文占用3个字节(对copy文件没有影响),对Console显示会出现乱码问题 对象流与序列化 什么是序列化:序列化就是一种用来处理对象流的机制,对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输 被static或transient修饰的成员变量不能序列化 实现 Serializable接口 与 编写private static final long serialVersionUID = -12123123L; class Students implements Serializable{ private static final long serialVersionUID=1213123121212L; String name; int age; public Students(String name, int age) { this.name = name; this.age = age; } } 序列化与反序列化 /** * 可以通过网络传播或保存在本地磁盘上 */ 序列化
  • java IO流_字节流_节点流_文件读取_写出_追加及覆盖文件 练习
    package IO流_字节流_节点流_文件读取_写出_追加文件; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.imageio.stream.FileImageInputStream; /** IO流_字节流_节点流_文件读取_写出_追加文件一.读取文件 1.建立联系,File对象 源头 2.选择流:文件输入流(读取),InputStream(字节流);FileInputStream(多态) 3.操作:byte[] car = new byte[1024](定义字节数组大小) + read(每次读取几个)+获取大小+输出 4.释放资源 二.写出文件 1.建立联系,File对象 目的地 2.选择流:文件输出流,OutputStream(字节流);FileOutputStream(多态) 3.操作:write()+flush 4.释放资源 */ public class Demo01 {
  • 史上最骚最全最详细的IO流教程,没有之一!
    目录 1、告白IO流的四点明确2、File类 1.1 File概述1.2 构造方法1.3 常用方法 1.3.1 获取功能的方法1.3.2 绝对路径和相对路径1.3.3判断功能的方法1.3.4 创建删除功能的方法1.4 目录的遍历1.5 递归遍历文件夹下所有文件以及子文件3、初探IO流 1.1 什么是IO1.2 IO的分类1.3 关于IO的分流向说明字节流OutputStream与InputStream的故事2.1 文件的世界里一切皆为字节2.2 字节输出流(OutputStream)2.3 字节输入流(InputStream)字符流Reader和Writer的故事字符流1、 字符输入流(Reader) FileReader类构造方法FileReader读取字符数据2、字符输出流(Writer) FileWriter类 构造方法FileWriter写出数据关闭close和刷新flushFileWriter的续写和换行FileReader和FileWriter类完成文本文件复制IO异常的处理1、缓冲流【掌握】 1.1 简要概述1.2 字节缓冲流 构造方法感受缓冲流的高效1.3 字符缓冲流 构造方法字符缓冲流特有方法1.4 字符缓冲流练习 代码实现2、转换流【掌握】 2.1 字符编码与解码字符集2.2 编码问题导致乱码2.3 InputStreamReader类-----
  • java.lang、java.io、java.net、java.util解释整理
    为应对近期单位认证:整理点Java知识 首先整理Java常见的类库: 1.Java.lang 这个 算是我们开发经常用到的基础类了,包含的类有object超类,8种类型的包装类,字符串类,线程类,异常类等 如下所示:图来自:链接 异常处理机制: Throwable Throwable Throwable是 Java 语言中所有错误或异常的超类。 Throwable包含两个子类: Error 和 Exception。它们通常用于指示发生了异常情况。 Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。 Exception Exception及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。 RuntimeException RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 编译器不会检查RuntimeException异常。例如,除数为零时,抛出ArithmeticException异常。RuntimeException是ArithmeticException的超类。当代码发生除数为零的情况时,倘若既"没有通过throws声明抛出ArithmeticException异常",也"没有通过try…catch…处理该异常"
  • java IO流之字节流
    1 IO流相关概念 1.1 什么是IO流? IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 1.2 IO流分类 按流向来分 输入流InputStream Reader(读取数据) 输出流OutStream Writer(写数据) 按操作类型分 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的 字符流 : 字符流只能操作纯字符数据 1.3 Java中常用IO流的类 字节流的抽象父类: InputStream 输入流 OutputStream 输出流 字符流的抽象父类: Reader 字符读取流 Writer 字符写入流 2 InputStream InputStream是抽象类,表示字节输入流,用于读数据。 直接已知子类: AudioInputStream ByteArrayInputStream FileInputStream(学习文件输入流) FilterInputStream ObjectInputStream PipedInputStream SequenceInputStream StringBufferInputStream InputStream之FileInputStream 概述: FileInputStream 从文件系统中的某个文件中获得输入字节
  • JAVA I/O流的分类
    Java中 对文件的操作是以流的方式进行的。流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后将 这些流还可以写到另外的目的地(文件、内存、控制台、网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分。   二、分类   流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕。流分类的方式很多:   1、按照输入的方向分,输入流和输出流,输入输出的参照对象是Java程序。   2、按照处理数据的单位不同分,字节流和字符流,字节流读取的最小单位是一个字节(1byte=8bit),而字符流一次可以读取一个字符(1char = 2byte = 16bit)。   3、按照功能的不同分,分节点流和处理流,节点流是直接从一个源读写数据的流(这个流没有经过包装和修饰),处理流是在对节点流封装的基础上的 一种流,FileInputStream是一个节点流,可以直接从文件读取数据,但是BufferedInputStream可以包装 FileInputStream,使得其有缓冲功能。   其实除了以上三种分类外,还有一些常常听到的一些分类比如:对象流、缓冲流、压缩流、文件流等等。其实都是节点流和处理流的子分类。当然你也可以创建新的流类型,只要你需要。   三、流分类的关系   不管流的分类是多么的丰富和复杂
  • 字节流与字符流的区别
    要把一片二进制数据数据逐一输出到某个设备中,或者从某个设备中逐一读取一片二进制数据,不管输入输出设备是什么,我们要用统一的方式来完成这些操作,用一种抽象的方式进行描述,这个抽象描述方式起名为IO流,对应的抽象类为OutputStream和InputStream ,不同的实现类就代表不同的输入和输出设备,它们都是针对字节进行操作的。在应用中,经常要完全是字符的一段文本输出去或读进来,用字节流可以吗?计算机中的一切最终都是二进制的字节形式存在。对于“中国”这些字符,首先要得到其对应的字节,然后将字节写入到输出流。读取时,首先读到的是字节,可是我们要把它显示为字符,我们需要将字节转换成字符。由于这样的需求很广泛,人家专门提供了字符流的包装类。 底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进行写入。字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,这为我们向IO设别写入或读取字符串提供了一点点方便。 字符向字节转换时,要注意编码的问题,因为字符串转成字节数组, 其实是转成该字符的某种编码的字节形式,读取也是反之的道理。 讲解字节流与字符流关系的代码案例:import java.io.BufferedReader;import java.io.FileInputStream;import java.io
  • 还在迷茫于java的文件操作吗?来看看Java文件操作的套路 - Java基础
    JavaSE - 对于文件操作的介绍 文章目录 一、IO原理二、"流" 简介流的分类流的结构 三、代码实现 字符流操作文本文件的实现:字符流简介FileReader读取文件打印到控制台① 利用read()空参方法进行读取② 利用read(char[] c)方法进行读取<1> 错误的写法:<2> 正确的写法: FileWriter内存中写出到文件① 覆盖写出(覆盖文件中原有数据)② 追加写出(在原有数据后面追加) 文件的复制(前两个结合起来) 字节流操作非文本文件的实现:字节流简介FileInputStream && FileOutputStream实现图片(非文本)的复制 通用方法实现指定路径下文件的复制,并获取耗时 🔺缓冲流来进行数据处理(效率高)BufferedInputStream && BufferedOutputStream 实现复制操作为什么缓冲流的效率高?BufferedReader && BufferedWriter 实现文本文档复制①方式一:使用write(char[] , 0 , len)写入:②使用write(String )进行写入: 转换流(分辨也是看后缀)- 相对难作用InputStreamReader实现字节的输入流到字符的输入流的转换InputStreamReader 和 OutputStreamWriter综合(将UTF-8的转为gbk的存储)
  • Java读取文件的不同方法(Java reading a file different methods)
    问题 似乎有很多方法可以读取Java中的文本文件( BufferedReader , DataInputStream等)。我个人最喜欢的是在构造函数中带有File Scanner (它更简单,可以更好地处理数学数据,并具有熟悉的语法) 。 蜘蛛侠鲍里斯(Boris the Spider)也提到Channel和RandomAccessFile 。 有人可以解释每种方法的利弊吗? 具体来说,我什么时候要使用它们? (编辑)我想我应该很具体,并补充说我对Scanner方法有很强的偏好。 所以真正的问题是,当我岂不要使用它? 回答1 让我们从头开始。 问题是你想做什么? 了解文件实际上是什么很重要。 文件是光盘上字节的集合,这些字节是您的数据。 Java提供了以上各种级别的抽象: File(Input|Output)Stream -阅读这些字节流byte 。 File(Reader|Writer) -从字节流中读取,作为char流。 Scanner -从char流中读取并标记化它。 RandomAccessFile将这些字节读取为可搜索的byte[] 。 FileChannel以安全的多线程方式读取这些字节。 在每个装饰的顶部都有装饰器,例如,您可以使用BufferedXXX添加缓冲。 您可以使用PrintWriter向FileWriter添加换行意识。