IO和NIO
一.创建IO
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( "*************请选择:*************" ); //获取用户的输入
int choose = input.nextInt();
switch (choose){
case ://创建文件
createNewFile();
break;
case ://删除文件
deleteFile();
break;
case ://修改文件
updateFile();
break;
case ://创建文件夹
mkdirs();
break;
case ://查询文件夹下所有的文件列表
findFileList();
break;
}
}
// 查询文件夹下所有的文件列表
private static void findFileList() {
System.out.println("请您输入查询的文件夹名称:(默认是E:/)");
String fileName = input.next();
//创建File对象
File file=new File("E:/"+fileName);
File[] files = file.listFiles();
int dirNums=;
int fileNums=;
//遍历集合
for (File f:files){
if (f.isDirectory()){
dirNums++;
}
if (f.isFile()){
fileNums++;
System.out.println(f.getName());
}
}
System.out.println("有多少个文件夹?"+dirNums);
System.out.println("有多少个文件?"+fileNums);
} //创建文件夹
private static void mkdirs() {
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("创建失败");
}
} //修改文件
private static void updateFile() {
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 void deleteFile() {
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 void createNewFile() {
System.out.println("请您输入文件的名称:(默认是E:/)");
String fileName = input.next();
//创建File对象
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();
}
}
}
二.流
1.字节流
//创建输出流和输出流对象
InputStream inputStream=null
OutputStream outputStream=null
try{
inputStream=new InputStream("e:/a.txt");
//true 代表是否向文件中拼接,不删除之前的内容
outputStream=new OutputStream("e:/a.txt",true);
//先向文件写入内容
outputStream.write("".getBytes());
//read 方法将返回0~255之间的数字如果流读到了最后,将返回-1
int num=0;
while((num=inputStream.read())!=-1){
System.out.println((char)num);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
inputStream.close();
outputStream.close();
}catch(Exception e){
e.printStackTrace();
} }
2.字符流
//创建输出流和输入流
Reader reader=null;
Writer writer=null;
try{
reader=new FileReader("e:/a.txt");
writer=new FileWriter("e:/a.txt",true);
writer.write("我是小明");
writer.flush();
writer.write("我是小刚");
writer.write("我是小红");
writer.close();
int num=0;
char[]data=new char{1024};
StringBuffer sb=new StringBuffer();
while((num=reader.read(data))!=-1){
sb.append(data);
}
System.out.println(sb.toString())
catch(Exception e){
e.prinrStackTrace();
}finally{
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.二进制流
//创建输出流和输入流对象
InputStream inputStream=null;
OutputStream outputStream=null;
DataInputStream dis=null;
DataOutputStream dos=null;
try{
//获取输入流
inputStream=new InputStream("e:/a.txt");
dis=new DataInputStream(inputStream);
//获取输出流
outputStream=new OutputStream("e:/a.txt");
dos=new DataOutputStream(outputStream);
int num=;
while((num=dis.read())!=-){
dos.write(num);//复制
} }catch (Exception e) {
e.printStackTrace();
}finally{
dos.close();
dis.close();
outputStream.close();
inputStream.close();
}
4.缓冲流
Reader reader=null;
Writer writer=null;
BufferedReader br=null;
BufferedWriter bw=null;
try {
writer=new FileWriter("e:/a.txt",true);
bw=new BufferedWriter(writer); //封装
bw.write("我是小明!");
bw.newLine(); //换行
bw.write("我是小刚!");
bw.flush();
bw.write("我是小红!");
bw.close();
writer.close(); //如果不关闭 后续两句话没法获取
//读取
reader=new FileReader("e:/a.txt");
br=new BufferedReader(reader);//封装
String line=null;
StringBuffer sb=new StringBuffer();
while ((line=br.readLine())!=null){
sb.append(line);
}
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
br.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
5.序列化和反序列化
static Scanner input=new Scanner(System.in);
//创建需要的输入和输出流对象
static InputStream inputStream=null;
static OutputStream outputStream=null;
static ObjectInputStream objectInputStream=null;
static ObjectOutputStream objectOutputStream=null; public static void main(String[] args) {
//注册 序列化
//register();
//登录 反序列化
login();
} //注册
private static void register() {
User user=new User();
System.out.println("请输入您的用户名:");
user.setUserName(input.next());
System.out.println("请输入您的密码:");
user.setPassword(input.next()); try {
outputStream=new FileOutputStream("e:/user.txt");
objectOutputStream=new ObjectOutputStream(outputStream);
//把对象输出到文件中
objectOutputStream.writeObject(user);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
objectOutputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} //登录
private static void login() {
try {
inputStream=new FileInputStream("e:/user.txt");
objectInputStream=new ObjectInputStream(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();
}
}
}
三.NIO
1.buffer
01.buffer 缓冲区:存储的是相同类型的数据集!
本质是一个可以写入数据,并且从中读取数据的内存!
02.position:写入或者读取的数据的当前指针
最大值是:capacity-1
03.limit:有多少数据可以写或者可以读
在write模式下,我们的limit和capacity的值一致!
在read模式下,我们的limit和write模式下的position的值一致
position变成了0!
03.capation:缓冲区的最大容量;
//创建一个容量为20的int类型缓冲区
IntBuffer buffer=IntBuffer.allocate();
System.out.println("capacity====>"+buffer.capacity());
System.out.println("position====>"+buffer.position());
System.out.println("limit====>"+buffer.limit());
//创建一个int类型的数组,便于放进缓冲区
int[]nums={,,,,,};
buffer.put(nums);
System.out.println("*************************");
System.out.println("capacity====>"+buffer.capacity());
System.out.println("position====>"+buffer.position());
System.out.println("limit====>"+buffer.limit());
//重设缓冲区 切换到 读模式
buffer.flip();
System.out.println("*************************");
System.out.println("capacity====>"+buffer.capacity());
System.out.println("position====>"+buffer.position());
System.out.println("limit====>"+buffer.limit());
//读取数据
while(buffer.hasremaining()){
System.out.println(buffer.get());
}
2.channel通道
1.概念
01.基于缓冲区对数据进行读取或者是写入
02.通道是双向的,流是单向的
03.可以异步的读写
2.常用的实现类
01.FileChannel:从文件中读写数据
02.DatagrarmChannel:通过UDP读写网络中的数据
03.Socketchannel:通过TCP读写网络中的数据
04.ServerSocketchannel:可以监听新来的TCP连接,每进来一个都会创建一个新的 Socketchannel。
3.内存映射:就是把文件映射到电脑中的内存中,道过探作内存从而达到操作文件的目的内存中操作速度是最快的
4.java中读取文件的方式:
01. RandomAccessFile随机读取,速度最慢82.F ile Inputstream 流的方式读取
03. BufferReader 缓存的方武读取
04. MappedByteBuffer内存映射,速度是最快的! ***零*米
5.内存映射的种模式: MapMode
01. READ ONLY 对缓冲区的内容只读B
02.READ WRITE茶对绊冲义的内容读写
03. PRIVATE 只会对缓冲区的内容进行修改,不会影响到真实的文件
(通常活用于文件的读取!一般不会涉及到文件的写入)
6.文件锁:
01.FileLock基于FileChanne1对 文件捉供锁的功能!
02.共享锁共享读的操作,只能有个写操作 !防止其他线程获取独占锁!适合读取数据!
03.独占锁:读写不能同时,只能有一个读或者一个写!适合写数据!
lock():阻塞
无参的默认是独占锁:
有参的为共享锁!
tryLock():非阻塞
//创建需要读取和写入的文件地址
File filea=new File("d:/a.txt”);
File fileb=new File("d:/b.txt");
//创建输入流和输出流
FileInputStream input=new FileInputStream(filea);
FileOutputStream output=new FileOutputStream(fileb);
//创建输入流和输出流通道
FileChannel inChannel=input.getChannel();
FileChannel outChannel=outputgetChannel();
//创建缓冲区
ByteBuffer buffer=ByteBuffer.allocate(1024); int num=0;
while((num=outchannel.read())!=-1){
buffer.flip();
outChannel.write(buffer);
buffer.close();
}
outChannel.close();
inChannel.close();
output.close();
input.close();
IO和NIO的更多相关文章
- java的nio之:java的nio系列教程之java的io和nio的区别
当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...
- 面试题_66_to_75_Java IO 和 NIO 的面试题
IO 是 Java 面试中一个非常重要的点.你应该很好掌握 Java IO,NIO,NIO2 以及与操作系统,磁盘 IO 相关的基础知识.下面是 Java IO 中经常问的问题. 66)在我 Java ...
- 传统IO与NIO的比较
本文并非Java.io或Java.nio的使用手册,也不是如何使用Java.io与Java.nio的技术文档.这里只是尝试比较这两个包,用最简单的方式突出它们的区别和各自的特性.Java.nio提出了 ...
- Java IO 和 NIO
昨天面试问到了有关Java NIO的问题,没有答上来.于是,在网上看到了一篇很有用的系列文章讲Java IO的,浅显易懂.后面的备注里有该系列文章的链接.内容不算很长,需要两个小时肯定看完了,将该系列 ...
- JAVA中IO和NIO的详解分析,内容来自网络和自己总结
用一个例子来阐释: 一辆客车上有10个乘客,他们的目的地各不相同,当没有售票员的时候,司机就需要不断的询问每一站是否有乘客需要下车,需要则停下,不需要则继续开车,这种就是阻塞的方式. 当有售票员的时候 ...
- Nio学习4——EchoServer在IO,NIO,NIO.2中的实现
堵塞IO实现: public class PlainEchoServer { public void serve(int port) throws IOException { final Server ...
- 理解IO、NIO、 AIO
转载:https://baijiahao.baidu.com/s?id=1586112410163034993&wfr=spider&for=pc nio 同步: 自己亲自出马持银行卡 ...
- Java NIO:IO与NIO的区别
一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...
- 【杂谈】对IO与NIO的认识
IO流与NIO块的数据缓存 Java的IO是面向流设计的,通常我们通过IO流读取数据,只能指定读取数据的大小,而不能选择数据读取的起始位置.数据就像流水一样,流过我们的应用,一旦流过就无法回头.除非我 ...
- Java提供了哪些IO方式?IO, BIO, NIO, AIO是什么?
IO一直是软件开发中的核心部分之一,而随着互联网技术的提高,IO的重要性也越来越重.纵观开发界,能够巧妙运用IO,不但对于公司,而且对于开发人员都非常的重要.Java的IO机制也是一直在不断的完善,以 ...
随机推荐
- govendor使用
一,开发端 前提是有一个已经go get过依赖包,并编译成功的项目. $ go get -u github.com/kardianos/govendor $ cd project_dir $ gove ...
- Yii2手动下载PHPExcel引入
步奏一 下载PHPExcel (自行下载:下载地址http://phpexcel.codeplex.com/releases/view/119187) 步骤二 将PHPExcel解压后的PHPEx ...
- 【QT】QPixmap和QImage在QLabel显示一张图像
#include <QPixmap> void Dialog::on_Button1_clicked() { QPixmap img; img.load("1.bmp" ...
- A股ROE连续3年超过15%的股票排名
R连续3年,12个季度的滚动ROE,都超过15%的股票排名,个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多ROE连续3年超过15%的股 ...
- [Tensorflow] RNN - 01. Spam Prediction with BasicRNNCell
Ref: http://blog.csdn.net/mebiuw/article/details/60780813 Ref: https://medium.com/@erikhallstrm/hell ...
- react列表数据显示
react的列表数据一般是用map循环显示的. 使用map注意:map的回调函数为箭头函数时,后面如果加大括号(箭头函数常规编写),必须要有return才可以,如果箭头函数后面没有大括号(箭头函数简写 ...
- 父页面操作嵌套iframe子页面的HTML标签元素
一个页面A.html使用iframe嵌套一个页面B.html,在A页面写js操作B页面HTML元素,首先要获取到B页面document对象,才能对嵌套页面进行操作 请看一个实例,在A页面写js操作B页 ...
- css3整理--box-sizing
box-sizing语法: box-sizing : content-box || border-box || inherit 参数取值: content-box:此值为其默认值,其让元素维持W3C的 ...
- NIO相关概念之Scatter / Gather
Scatter /Gather 是java NIO中用来对channel的读取或者写入操作的特殊的形式的描述 Scatter(发散) 是指在读操作的时候,从chanel读取到的数据,写入到多个buff ...
- zope.interface 库学习一
由于python没有接口概念,所以zope 提供了个第三方库开源使用,下面简单介绍zope.interface.implementer的使用 直接看例子,下面例子是在twisted里摘录的 接口IRe ...