java IO流编程
JavaIO流详解(三)----字节流InputStream和OutPutStream

JavaIO流详解(三)----字节流InputStream和OutPutStream我们都知道在计算机中,⽆论是⽂本、图⽚、⾳频还是视频,所有的⽂件都是以⼆进制(字节)形式存在的,IO流中针对字节的输⼊输出提供了⼀系列的流,统称为字节流。
字节流是程序中最常⽤的流。
在JDK中,提供了两个抽象类InputStream和OutputStream,它们是字节流的顶级⽗类,所有的字节输⼊流都继承⾃InputStream,所有的字节输出流都继承⾃OutputStream。
既然⼆者是抽象类,那么就不能实例化,都是依赖于具体继承它们的⼦类去实现。
但⼆者抽象类中也包含它们各⾃的⽅法,如果我们先了解清楚抽象类中每⼀个⽅法的含义,那么对于后续具体的⼦类将会有⾮常⼤的帮助。
1、字节输⼊流InputStreamInputStream是所有字节输⼊流的⽗类,定义了所有字节输⼊流都具有的共同特征。
其内部提供的⽅法如下:image上图中的三个read()⽅法都是⽤来读数据的。
int read():每次读取⼀个字节,返回读取到的字节。
int read(byte[] b):每次读取b 数组长度的字节数,然后返回读取的字节的个数[注意与read() ⽅法的区别],读到末尾时返回-1。
int read(byte[] b,int off,int len):每次读取b 数组长度的字节数,从数组b 的索引为off 的位置开始,长度为len个字节。
⼩贴⼠:close⽅法,当完成流的操作时,必须调⽤此⽅法,释放系统资源。
其中InputStream的实现类FileInputStream是专门⽤于读取⽂件中的数据,通过它将⽬标设备上的数据读⼊到程序。
FileInputStream的构造⽅法:FileInputStream(File file):通过打开与实际⽂件的连接来创建⼀个FileInputStream ,该⽂件由⽂件系统中的File对象file命名。
io流关闭问题

//fos.close();
OutputStreamWriter osw2 = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw2 = new BufferedWriter(osw2);
bw2.write("java IO close test1111111111111111");
BufferedInputStream的close方法中对InputStream进行了关闭,下面是jdk中附带的源代码:
java.io.BufferedInputStream的api:
close Βιβλιοθήκη public void close()throws IOException 关闭此输入流并释放与该流关联的所有系统资源。
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
bw.write("java IO close test");
bw.close();
bw2.close();//报错的,提示流已经关闭了。
}
验证ok
因此,可以只调用外层流的close方法关闭其装饰的内层流,验证例子:
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("d:\\a.txt");
javaio流练习题

javaio流练习题Java IO流练习题Java IO流是Java语言中用于输入和输出操作的重要组件。
掌握IO 流的使用对于Java程序员来说是至关重要的。
本文将介绍一些Java IO 流的练习题,旨在帮助读者熟悉IO流的用法。
练习一:文件复制题目要求:编写一个程序,实现文件的复制功能。
程序接收两个文件路径作为参数,将源文件复制到目标文件路径下,并输出复制完成的信息。
解题思路:1. 使用FileInputStream读取源文件的内容;2. 使用FileOutputStream将读取到的内容写入到目标文件;3. 分别关闭输入流和输出流。
练习二:文本文件排序题目要求:编写一个程序,从一个文本文件中读取多行文本,并按字母顺序对其进行排序,然后将排序后的结果写入到另一个文件中。
解题思路:1. 使用BufferedReader读取文本文件的内容,将每一行存储到一个List<String>中;2. 使用Collections类的sort方法对List<String>进行排序;3. 使用BufferedWriter将排序后的结果写入到另一个文本文件。
练习三:对象序列化与反序列化题目要求:编写一个程序,实现对象的序列化和反序列化。
程序可以接收一个对象作为参数,将对象序列化后保存到一个文件中,并可以将文件中的对象反序列化,并输出对象的内容。
解题思路:1. 创建一个实现Serializable接口的类,表示需要被序列化和反序列化的对象;2. 使用ObjectOutputStream将对象写入到文件中;3. 使用ObjectInputStream从文件中读取对象,并输出对象的内容。
练习四:文件压缩与解压缩题目要求:编写一个程序,实现文件的压缩和解压缩功能。
程序可以接收一个文件作为参数,将文件压缩后保存到另一个文件中,并可以将压缩后的文件解压缩。
解题思路:1. 使用ZipOutputStream将文件压缩并写入到另一个文件中;2. 使用ZipInputStream从压缩文件中读取内容,并解压缩。
Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Prope。。。

Java⾃学第10期——File类与IO流(输⼊输出流、处理流、转换流、缓冲流、Prope。
1、IO简介IO(输⼊输出)通过java.io包下的类和接⼝来⽀持,包下包括输⼊、输出两种IO流,每种输⼊输出流⼜可分为字符流和字节流两⼤类。
2、File类File类是io包下与平台⽆关的⽂件和⽬录,File能新建、删除、重命名⽂件和⽬录,不能访问⽂件本⾝,后者需要使⽤输⼊输⼊流。
2.1 构造⽅法File类的构造⽅法:File(File parent, String child) 参数:⽗路径,⼦路径根据 parent 抽象路径名和 child 路径名字符串创建⼀个新 File 实例。
File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建⼀个新 File 实例。
File(String parent, String child)根据 parent 路径名字符串和 child 路径名字符串创建⼀个新 File 实例。
File(URI uri)通过将给定的 file: URI 转换为⼀个抽象路径名来创建⼀个新的 File 实例。
2.2 静态⽅法File类静态⽅法:static String pathSeparator()与系统有关的路径分隔符,为了⽅便,它被表⽰为⼀个字符串。
static char pathSeparatorChar()与系统有关的路径分隔符。
static String separator()与系统有关的默认名称分隔符,为了⽅便,它被表⽰为⼀个字符串。
static char separatorChar()与系统有关的默认名称分隔符。
2.3 常⽤⽅法:2.3.1 获取相关public String getAbsolutePath()返回此File的绝对路径名字符串。
public String getPath()将此File转换为路径名字符串。
public String getName()返回由此File表⽰的⽂件或⽬录的名称。
IO流之ZipInputStream和ZipOutputStream的认识及常用使用(转)。。。

IO流之ZipInputStream和ZipOutputStream的认识及常⽤使⽤(转)。
ZipInputStream和ZipOutputStream定义压缩流在⽇常中经常会使⽤到zip或rar这样的压缩⽂件,更加便利了我们⽇常⽂件的传输和使⽤。
当然在java中也提供了相应的输⼊输出流来压缩和解压gzip、zip和rar这样的⽂件。
ZipInputStream“压缩⽂件输⼊流”,⽤于读取磁盘上的压缩⽂件ZipOutputStream“压缩⽂件输出流”,⽤于将程序中的压缩流写出到磁盘上。
通常需要使⽤ZipFile ZipInputStream/ZipOutputStream ZipEntry级File完成解压缩操作。
其他相似流在JAVA IO中,不仅可以实现ZIP压缩格式的输⼊、输出,也可以实现JAR及GZIP⽂件格式的压缩:JAR压缩的⽀持类保存在java.util.jar包中,常⽤的类有如下⼏个:JAR压缩输出流:JarOutputStreamJAR压缩输⼊流:JarInputStreamJAR⽂件:JARFileJAR实体:JAREntryGZIP是⽤于UNIX系统的⽂件压缩,在Linux中经常会使⽤到*.gz的⽂件,就是GZIP格式,GZIP压缩的⽀持类保存在java.util.zip包中,常⽤的类有如下⼏个:GZIP压缩输出流:GZIPOutputStreamGZIP压缩输⼊流:GZIPInputStream使⽤⽤例压缩// 压缩⼊⼝1public static void compress(String srcPath, String destPath,boolean dirFlag) throws Exception {compress(new File(srcPath), new File(destPath), dirFlag);}// 压缩⼊⼝2public static void compress(String srcPath, String destPath) throws Exception {compress(new File(srcPath), new File(destPath), DEFAULT_DIR);}// 压缩⼊⼝3public static void compress(File srcFile, File destFile, boolean dirFlag) throws Exception {compress(srcFile, new ZipOutputStream(new FileOutputStream(destFile)), dirFlag);}public static void compress(File srcFile, ZipOutputStream zos, boolean dirFlag) throws Exception {// 需要解压的压缩⽂件对象// 压缩输出流// 是否在压缩⽂件时创建⼀个⽗⽂件夹后再压缩if (srcFile.isDirectory()) {if (dirFlag) {doCompress(zos, srcFile, srcFile.getName() + File.separator);} else {doCompress(zos, srcFile, "");}} else {doCompress(zos, srcFile, "");}zos.close();}public static void doCompress(ZipOutputStream zos, File file, String baseDir) throws Exception {if (file.isDirectory()) {// 递归循环,只压缩其中所有⽂件File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {doCompress(zos, files[i], baseDir);}} else {// 进⾏⽂件压缩的操作byte[] buff = new byte[DEFAULT_BUFF_SIZE];InputStream in = new FileInputStream(file);zos.putNextEntry(new ZipEntry(baseDir + File.separator + file.getName()));int len;while ((len = in.read(buff,0 ,DEFAULT_BUFF_SIZE)) != -1) {zos.write(buff, 0, len);}in.close();}}解压/*** Default buff byte size**/private static final int DEFAULT_BUFF_SIZE = 1024;/*** Default basedir value**/private static final boolean DEFAULT_DIR = false;// 程序⼊⼝1public static void decompress(String srcPath) throws Exception {decompress(new File(srcPath));}// 程序⼊⼝2public static void decompress(File srcFile) throws Exception {File baseFile = srcFile.getParentFile();decompress(srcFile, baseFile);}// 程序⼊⼝3public static void decompress(String srcPath, String destPath) throws Exception {decompress(new File(srcPath), new File(destPath));}// 程序基本⼊⼝public static void decompress(File srcFile, File destFile) throws Exception { CheckedInputStream cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32()); ZipInputStream zis = new ZipInputStream(cis);// 解压操作doDecompress(destFile, zis);zis.close();}private static void doDecompress(File destFile, ZipInputStream zis) throws Exception {ZipEntry zipEntry = null;while ((zipEntry = zis.getNextEntry()) != null) {String dir = destFile.getPath() + File.separator + zipEntry.getName();File dirFile = new File(dir);// 如果⽗⽂件夹不存在,则递归创建其⽗⽂件夹fileProber(dirFile);if (zipEntry.isDirectory()) {// 如果zipEntry是⽬录,则创建⽬录dirFile.mkdirs();} else {// 解压压缩⽂件的其中具体的⼀个zipEntry对象doDecompressFile(dirFile, zis);}zis.closeEntry();}}// ⼀般意义上的⽂件复制操作private static void doDecompressFile(File destFile, ZipInputStream zis) throws Exception { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));int len;byte[] buff = new byte[DEFAULT_BUFF_SIZE];while ((len = zis.read(buff, 0 ,DEFAULT_BUFF_SIZE)) != -1) {bos.write(buff, 0, len);}bos.close();}/*** ⽂件探测** When the parent file not exist.Create it.** @param dirFile* @throws Exception*/public static void fileProber(File dirFile) throws Exception {File parentFile = dirFile.getParentFile();if (!parentFile.exists()) {fileProber(parentFile);parentFile.mkdirs();}}⼯具类/*** Copyright © 2018, LeonKeh* <p>* All Rights Reserved.*/package cn.cherry.se.l_io_zipoutputinputstream;import java.io.*;import java.util.zip.*;/*** ZIP 解压缩⼯具包** @author Leon* @version 2018/6/6 23:07*/public class ZipUtils {/*** Default buff byte size**/private static final int DEFAULT_BUFF_SIZE = 1024;/*** Default basedir value**/private static final boolean DEFAULT_DIR = false;public static void decompress(String srcPath) throws Exception {decompress(new File(srcPath));}public static void decompress(File srcFile) throws Exception {File baseFile = srcFile.getParentFile();decompress(srcFile, baseFile);}public static void decompress(String srcPath, String destPath) throws Exception {decompress(new File(srcPath), new File(destPath));}public static void decompress(File srcFile, File destFile) throws Exception { CheckedInputStream cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32());ZipInputStream zis = new ZipInputStream(cis);doDecompress(destFile, zis);zis.close();}private static void doDecompress(File destFile, ZipInputStream zis) throws Exception {ZipEntry zipEntry = null;while ((zipEntry = zis.getNextEntry()) != null) {String dir = destFile.getPath() + File.separator + zipEntry.getName();File dirFile = new File(dir);fileProber(dirFile);if (zipEntry.isDirectory()) {dirFile.mkdirs();} else {doDecompressFile(dirFile, zis);}zis.closeEntry();}}private static void doDecompressFile(File destFile, ZipInputStream zis) throws Exception { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));int len;byte[] buff = new byte[DEFAULT_BUFF_SIZE];while ((len = zis.read(buff, 0 ,DEFAULT_BUFF_SIZE)) != -1) {bos.write(buff, 0, len);}bos.close();}/*** ⽂件探测** When the parent file not exist.Create it.** @param dirFile* @throws Exception*/public static void fileProber(File dirFile) throws Exception {File parentFile = dirFile.getParentFile();if (!parentFile.exists()) {fileProber(parentFile);parentFile.mkdirs();}}public static void compress(String srcPath, String destPath,boolean dirFlag) throws Exception { compress(new File(srcPath), new File(destPath), dirFlag);}public static void compress(String srcPath, String destPath) throws Exception {compress(new File(srcPath), new File(destPath), DEFAULT_DIR);}public static void compress(File srcFile, File destFile, boolean dirFlag) throws Exception { compress(srcFile, new ZipOutputStream(new FileOutputStream(destFile)), dirFlag);}public static void compress(File srcFile, ZipOutputStream zos, boolean dirFlag) throws Exception { if (srcFile.isDirectory()) {if (dirFlag) {doCompress(zos, srcFile, srcFile.getName() + File.separator);} else {doCompress(zos, srcFile, "");}} else {doCompress(zos, srcFile, "");}zos.close();}public static void doCompress(ZipOutputStream zos, File file, String baseDir) throws Exception { if (file.isDirectory()) {File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {doCompress(zos, files[i], baseDir);}} else {byte[] buff = new byte[DEFAULT_BUFF_SIZE];InputStream in = new FileInputStream(file);zos.putNextEntry(new ZipEntry(baseDir + File.separator + file.getName()));int len;while ((len = in.read(buff,0 ,DEFAULT_BUFF_SIZE)) != -1) {zos.write(buff, 0, len);}in.close();}}ZipInputStream 默认utf-8编码会存在中⽂乱码,解决⽅式:使⽤gbk编码。
【黑马程序员】Java IO流学习总结

【黑马程序员】Java IO流学习总结Java流操作有关的类或接口:Java流类图结构:流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。
即数根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
IO流的分类•根据处理数据类型的不同分为:字符流和字节流•根据数据流向不同分为:输入流和输出流字符流和字节流字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。
本质节流和字符流的区别:•读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映•处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能结论:只要是处理纯文本数据,就优先考虑使用字符流。
除此之外都使用字节流。
输入流和输出流对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据Java IO流对象1.输入字节流InputStream IO 中输入字节流的继承图可见上图,可以看出:1 InputStream 是所有的输入字节流的父类,它是一个抽象类。
2 ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它本地文件中读取数据。
PipedInputStream 是从与其它线程共用的管道中读取数据,与P 3 ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。
2.输出字节流OutputStreamIO 中输出字节流的继承图可见上图,可以看出:1 OutputStream 是所有的输出字节流的父类,它是一个抽象类。
2 ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、PipedOutputStream 是向与其它线程共用的管道中写入数据,3 ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。
Java-IO流

IO流一、流的概念程序的主要任务是操纵数据。
在Java中,把一组有序的数据序列称为流。
根据操作的方向,可以把流分为输入流和输出流两种。
程序从输入流读取数据,向输出流写出数据。
文件输入流输出流文件内存-------------------> Java程序------------------------>内存键盘控制台| |数据源数据目的地Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常见的输入流和输出流进行了抽象。
如果数据流中最小的数据单元是字节,那么称这种流为字节流;如果数据流中最小的数据单元是字符,那么称这种流为字符流。
在I/O类库中,java.io.InputStream和java.io.OutputStream分别表示字节输入流和字节输出流,java.io.Reader和java.io.Writer分别表示字符输入流和字符输出流。
注意:它们四个都是抽象类二、字节输入流和输出流概述在java.io包中,java.io.InputStream表示字节输入流,java.io.OutputStream表示字节输出流,它们都是抽象类,不能被实例化。
InputStream类提供了一系列和读取数据有关的方法:1.read(): 从输入流读取数据:有三种重载形式:a.int read():从输入流读取一个8位的字节(1字节是8位),把它转换为0-255之间的整数,并返回这一整数。
如果遇到输入流的结尾,则返回-1;b.int read(byte[] b): 从输入流读取若干个字节,把它们保存到参数b指定的字节数组中。
返回的整数表示读取的字节数。
如果遇到输入流的结尾,则返回-1;c.int read(byte[] b, int off, int len): 从输入流读取若干个字节,把它们保存到参数b指定的字节数组中。
返回的整数表示读取的字节数。
参数off指定在字节数组中开始保存数据的起始下标,参数len指定读取的字节数目。
java基础八股文

java基础八股文Java基础八股文Java是一门跨平台的面向对象编程语言,广泛应用于企业级应用开发、移动应用开发、游戏开发等领域。
本文将从Java基础的八个方面,介绍Java编程的核心知识点。
一、变量与数据类型Java中的变量需要先声明再使用,可以分为基本数据类型和引用数据类型。
基本数据类型包括byte、short、int、long、float、double、char、boolean,引用数据类型包括数组、类、接口等。
需要注意的是,Java是一门强类型语言,变量类型必须与赋值类型一致。
二、运算符与表达式Java中的运算符包括算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符等。
表达式是由操作数和运算符组成的式子,可以通过运算符的优先级和括号来改变表达式的计算顺序。
三、流程控制Java中的流程控制语句包括条件语句、循环语句和跳转语句。
条件语句包括if语句和switch语句,循环语句包括for循环、while循环和do-while循环,跳转语句包括break语句、continue语句和return语句。
四、数组和字符串Java中的数组是一组相同类型的数据集合,可以通过下标访问数组元素。
字符串是一组字符的集合,可以通过String类来创建和操作字符串。
五、面向对象编程Java是一门面向对象的编程语言,支持封装、继承和多态等特性。
封装可以隐藏类的内部细节,继承可以从父类继承属性和方法,多态可以通过父类引用指向不同的子类对象。
六、异常处理Java的异常处理机制可以捕获和处理程序中的异常情况,防止程序崩溃或出现错误结果。
异常分为受检异常和非受检异常,可以使用try-catch语句来处理异常。
七、集合框架Java的集合框架提供了一组用于存储和操作数据的类和接口,包括List、Set、Map等数据结构。
集合框架提供了丰富的API,可以方便地进行数据的增删改查等操作。
八、IO流和网络编程Java的IO流可以实现数据的输入和输出,包括字节流和字符流。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
I/O流编程
●流的概念
⏹数据从一个对象到另一个对象过程的
抽象称为(数据)流(Stream)。
⏹I/O流指输入流(InputStream)与输出
流(OutputStream)
⏹读入流(Reader)/写入流(Writer)
●File类
⏹此类只操作文件对象,而不操作文件内
容。
⏹Java中把目录当作文件来处理。
示例1: File类简单应用
⏹File类的构造:
◆File(String path,String name) 如:
◆File(String pathname)
如:
◆File(File path,String name) 如:
◆File(URI vpathname)
如:
⏹File类常用方法:
◆mkdirs()/mkdir()
◆createNewFile()/createTempFil
e()
◆isFile()/isDirectory()/isAbso
lute/canRead()/canWrite()
◆getName()/getPath()/getParent
()/getAbsolutePath()
◆setReadable()/setWritable()/s
etReadOnly()
示例2:File常用方法
示例3:列某一目录中的所有的.exe文件
●流的分类
⏹字节流
◆以字节为单位对文件内容进行读写
操作。
◆InputStream/OutputStream
●输入字节流与输出字节流的根类
●JavaIO中的所有输入流与输出流
类都是它们子类。
◆FileInputStream/FileOutputStr
eam
●文件的输入流与输出流,只读写文
件的内容。
◆常用的方法
●read()
●write()
●available()
●flush()
●close()
示例4:将指定的字符串以字节流的形式写到指定的文件中去
示例5: 将指定的文件中的内容以字节流的形式读出并输出到控件台中
示例6:以字节流的形式封装带有Copy功能的文件操作类(MyFile)
⏹字符流
◆Reader/Writer
●输入字符流与输出字符流的根类
◆FileReader/FileWriter
●文件输入字符流与文件输出字符流
的类
◆BufferedReader/BufferedWriter
●在缓冲区中高效读写字符流
◆常用方法
●read()/readLine()
●newLine()/write()/append()
●flush()
●close()
示例7:将指定的字符串以字符流的形式写到指定的文件中去
示例8: 将指定的文件中的内容以字符流的形式读出并输出到控件台中
示例9:以字符流的形式封装带有Copy功能的文件操作类(MyFile)
⏹二进制流(字节流)
◆DataInput/DataOutput接口
◆FilterInputStream/FilterOutpu
tStream类
◆DataInputStream/DataOutputStr
eam
◆常用的方法
●read()/readChar()/readBoolean
()/readUTF()/readDouble()/rea
dFloat()/readFully()
●write()/writeChar()/writeBool
ean()/writeUTF()/writeDouble(
)/writeFloat()/writeInt()/wri
teLong()
●available()
●size()
●flush()
●close()
示例10:读/写二进制文件(user.dat)
示例11:复制二进制文件(.jpg)
⏹打印输出流(字符流)
⏹PrintStream
⏹PrintWriter
示例12:
⏹随机文件访问(字符流)
◆RandomAccessFile类
●seek()搜索位置
●length()最大的长度
●read()
●write()
●close()
示例13:
对象序列化
◆将数据排成系列进入流中。
◆将序列化的数据恢复为数据集合的
过程称为序列化的解体(读)。
◆可序列化的类都实现了
Serializable接口
◆ObjectInput/ObjectOutput接口
◆ObjectInputStream/ObjectOutpu
tStream
示例14:读写序列化的流。