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机制也是一直在不断的完善,以 ...
随机推荐
- r 随机数
R软件一个显著的优点是它提供了丰富的随机数发生器,比SAS.Matlab方面很多,比Excel更不知方便到哪里去了.这无疑为统计学.工程学以及寿险精算学提供了很大的方便,比如我们要产生200个服从正态 ...
- centos7 防火墙
1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...
- [Node.js] 02 - Read Eval Print Loop
视频课程:带你入门Nodejs,提及了非常多的后端知识点 发布时间: 2017年10月7日 课程时长:193 分钟 类别:后端 课时:22 npm Resource: npm模块管理器[阮一峰] np ...
- SpringBoot------个性化启动Banner设置
1.添加Banner.txt文件 . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ ...
- 使用WPF Animated GIF实现GIF图片的播放
这个类库很方便,也很简单:http://wpfanimatedgif.codeplex.com/ 参考博客:http://blog.csdn.net/gqqnb/article/details/721 ...
- file类型input框设置上传相同文件,并都可以触发change事件。
在使用file类型input框是,删除了第一次上传到文件,再次上传相同文件,无法触发change事件,所以在删除的js上添加如下js代码: document.getElementById('fileU ...
- 6 CLR实例构造器
引用类型构造器 如果我们没有定义实例构造器,那么编译器会为我们默认产生一个无参构造器. 实例对象初始化过程 为实例分配内存: 初始化附加成员,包括方法表指针和SyncBlockIndex变量(我们已经 ...
- numpy 中不常用的一些方法
作者:代码律动链接:https://zhuanlan.zhihu.com/p/36303821来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 挑战 1:引入 numpy ...
- day_10 py 字典
#!/usr/bin/env/python#-*-coding:utf-8-*-'''字典: (就是增加个索引名字,然后归类了一下) infor = {键:值,键:值} 列表存储相同的信息随着列表里面 ...
- Linux下部署多个Tomcat(完整)
Linux下部署多个Tomcat 1.环境:1.1.Centos 5.01.2.apache-tomcat-6.0.18 2.需要解决一下几个问题2.1.不同的tomcat启动和关闭监听不同的端口2. ...