JAVA基础复习与总结<七> File类_基本的IO概念_输入输出
File类
1、操作目录
mkdir() 创建目录,必须确保父目录存在,如果不存在,创建失败
mkdirs()
list() 文件:目录字符串形式 ,只返回目录和文件的名称
listFiles() :返回目录和名称的路径
Static listRoots() 根路径
2、绝对路径和相对路径
绝对路径:指文件在硬盘上真正存在的路径。比如:D:\Java\HelloWorld.java
相对路径:指某个文件的路径和别的文件的路径关系。比如在d盘里面有两个文件,路径分别是:D:\Java\HelloWorld.java和D:\Java\images\monkey.png。它们都在d盘的Java文件夹里面。那么monkey.png这个文件的路径相对于HelloWorld.java来说就是\images\monkey.png。
注意:../ 代表向上一级目录。Java相对于图片的相对路径是:../HellloWorld.java.
在windows系统中绝对路径以盘符开头,例如:D:\
在非windows系统中绝对路径以根目录开头: /
在不写盘符或者根目录来直接构建file类的情况下,绝对路径就是在当前的工作空间+String name
3、IO流中解决不同系统的路径问题
IO操作中关于路径有两个常量,而这两个常量在不同的操作系统中可能不同。
1)路径分割符 : ;
2)名称分割符: \\(Windows) /(Mac OS)
路径分割符: File.pathSeparator
名称分割符: File.separator
推荐的路径方式:
path="E:"+File.separator+"xp"+File.separator+"test"+File.separator+"2.jpg";
public static void main(String[] args) {
System.out.println(File.pathSeparator);
System.out.println(File.separator);
//路径表示形式
String path ="E:\\xp\\test\\2.jpg";
path="E:"+File.separator+"xp"+File.separator+"test"+File.separator+"2.jpg";
//推荐方式
path="E:/xp/test/2.jpg";
}
}
4、File类的应用
1)遍历目录下的文件
/**
* mkdir() 创建目录,必须确保父目录存在,如果不存在,创建失败
* mkdirs() 创建目录,如果父目录链不存在,一同创建
* list() 文件:目录名字符串形式
* listFiles():过滤器,测试指定文件是否在某目录中
* Static listRoots() 根路径
*/
import java.io.File;
import java.io.FilenameFilter;
public class TestFile {
public static void main(String[] args ){
String path ="/Users/qianjiapeng/Desktop";
File src = new File(path);
if(src.isDirectory()){ //存在并且为目录
System.out.println("=======子目录;文件名=======");
String[ ] subNames = src.list(); //.list()方法存储的是文件名
for(String temp:subNames){
System.out.println(temp); //将该目录下的文件的名称进行了输出
}
System.out.println("========子目录;文件File对象========");
File[] subFiles = src.listFiles(); //listFiles()方法返回的是文件,
// 因此在遍历文件夹以及子文件夹中所有文件时必须使用listFiles()方法,可以用作递归
for(File temp:subFiles){
System.out.println(temp);
}
System.out.println("========子文件.java对象========");
//命令设计模式
subFiles = src.listFiles(new FilenameFilter() {
@Override
/*
dir代表的就是
*/
public boolean accept ( File dir, String name ) { //重写了此方法,dir是父路基,name是子文件名
// System.out.println(dir.getAbsolutePath());
return new File(dir,name).isFile()&&name.endsWith(".txt"); //在父路径下面找到是文件并且符合命名要求的文件
}
});
for(File temp:subFiles){
System.out.println(temp.getAbsolutePath());
}
2)递归实现遍历目录下的文件与子文件
/**
* 输出子孙级目录;文件的名称(绝对路径)
* 1、listFiles()
* 2、递归
*/
public class TestFIle2 {
public static void main(String[] args){
String path = "/Users/qianjiapeng/Desktop";
File parent = new File(path );
//printName(parent);
//输出所有路径下的所有文件夹
File[] roots = File.listRoots();
System.out.println(Arrays.toString(roots)); //这是一个输出根路径
for (File temp: roots){
printName(temp);
}
}
/**
* 输出路径
*/
public static void printName(File src){ //一个递归方法
if(null== src || !src.exists()){
return;
}
System.out.println(src.getAbsolutePath());
if(src.isDirectory()){ //如果是文件夹
for(File sub:src.listFiles()){
printName(sub);
}
}
}
}
IO流
一、概念:
流:流动、流向,从一端移动到另一端。从源头流向目的地。
常见的数据源:程序与文件操作,或者数组,或者网络连接、数据库。以程序为中心。
二、IO流主要用来处理设备间的数据传输
分类:
1、按照流向分类:输入流、输出流。
2、按照操作类型分类:
字节流:二进制,可以处理一切文件。包括纯文本、doc、音频、视频等等。
字符流:只能处理纯文本。
3、按照功能来分:
节点流:包裹源头的。
处理流:增强功能,提高性能。
三、字符流与字节流(重点)与文件(都是以程序为中心的)
1、字节流:
输入流:InputStream
方法:read(byte[ ] b) 、read(byte[ ] b, int off ,int len ) 、 close();
FileInputStram();
输出流:OutputStream
方法:write(byte[ ] b) 、write(byte[ ] b, int off, int len )、close()、flush( );
FileOutputStream();
2、字符流:
输入流:Reader
方法:read(char[ ] cbuf) 、read(char[ ] cbuf,int off, int len)、close( );
输出流:Writer
方法:write(char[ ] cbuf )、write(char[ ] cbuf ,int off, int len)、flush()、close( );
1)向文本文件中写出内容
public class FileOutputTest {
public static void main(String[] args){
FileOutputStream fos = null;
try {
//如果该文件不存在,则会自动创建一个。如果有则直接写入
//如果不传true则原本文件的文件内容被覆盖,传入true则在原来的内容后面继续写
//在开发中文件分割符最好不要直接写/。
fos = new FileOutputStream("/Users"+File.separator+"qianjiapeng/IdeaProjects/Java300/src/TestIO/learn2.txt",true);
String meg = "Hello World!";
fos.write(meg.getBytes());
fos.write("\n".getBytes());
2)FileInputStream读取文件
/**
* FileInputStream读取文件
*/
public class Int_Out {
public static void main (String[] args){
FileInputStream fis = null;
try {
//绝对路径
fis = new FileInputStream("/Users/qianjiapeng/IdeaProjects/Java300/src/TestIO/learn.txt");
// System.out.println(fis.read()); //这里打印的是ASCII码。 .read方法,在读取了一个之后将会将游标自动指向下一个
//System.out.println(fis.read());
//System.out.println(fis.read());
//System.out.println(fis.read());
//读取完毕之后会返回-1 ,可以考虑用循环来读取
//使用循环来读取
//每次在硬盘上读一个字节,效率不高
// int temp;
//while ((temp = fis.read())!= -1){
// char c = (char)temp;
// System.out.print(c);
// }
//相对路径,系统会从项目的根目录开始读取
//fis = new FileInputStream("learn.txt");
//定义byte数组告诉系统一次读取几个字节,减少内存和硬盘键的通信,可以提高效率
byte[] arr = new byte[23];
int temp;
//有参的read方法返回的int值是读取了几个字节
while ((temp=fis.read(arr))!=-1){
System.out.println(new String(arr,0,temp));
}
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}finally {
try {
fis.close();
}catch (IOException e){
e.printStackTrace();
}
}
//要捕获一个文件不存在的异常和输入输出异常
}
}
四、操作
1、举例:搬家 读取文件
1)关联房子 建立与文件联系
2)选择搬家 选择对应流
3)搬家 文件的读取或写出
a) 卡车大小 数组大小
b) 运输 读取、写出
4)打发over 释放资源
2、操作
1)建立联系
2)选择流
3)操作
4)释放资源
InputStream、OutputStream、Writer、Reader都是抽象类。
/**
* 1、建立联系 File对象目的地
* 2、选择流 文件输出流 OutputStream FileOutputStream
* 3、操作 : write() +flush()
* 4、释放资源:关闭
*/
public class Output_Read {
public static void main(String[] args){
// * 1、建立联系 File对象 目的地
File dest = new File("/Users/qianjiapeng/Desktop/2.txt");
// * 2、选择流 文件输出流 OutputStream FileOutputStream
OutputStream os =null;
//以追加的形式写出文件
try {
os = new FileOutputStream(dest,true); //后面是true表示是追加,否则就是覆盖
//3、操作
String str = "good\r\n";
//字符串转字节数组
byte[] data = str.getBytes();
try {
os.write(data,0,data.length);
os.flush(); //强制刷新出去
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件写出失败");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件未找到");
}finally {
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("关闭输出流失败");
}
}
}
}
}
public class Read_Output {
public static void main ( String[] args ) {
//1、建立联系、File对象
File src = new File("/Users/qianjiapeng/Desktop/2.txt");
InputStream is = null; //因为待会要对这个操作进行关闭,因此在外面定义从而提升作用域
try {
try {
is = new FileInputStream(src);
//3、操作,不读读取 ,相当于缓冲数组
byte[] car = new byte[100];
int len = 0; //接收实际读取的大小
//循环读取
while (-1 != (len = is.read(car))) {
//read()操作读取完后会返回-1,判断是否为-1就可以结束读取了
//输出字节数组转成字符串
String info = new String(car,0,len);
System.out.println(info);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件不存在");
} catch (IOException e) {
e.printStackTrace();
System.out.println("读取文件失败");
}
}finally {
//4、释放字节
if(is!=null){ //如果文件本身就不存在,那么也就没有关闭的必要了
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("关闭文件输入流存在");
}
}
}
}
}
}
System.out.println(src.getAbsolutePath());
if(src.isDirectory()){ //如果是文件夹
for(File sub:src.listFiles()){
printName(sub);
}
}
}
}
JAVA基础复习与总结<七> File类_基本的IO概念_输入输出的更多相关文章
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- Java基础14-缓冲区字节流;File类
作业解析 阐述BufferedReader和BufferedWriter的工作原理, 是否缓冲区读写器的性能恒大于非缓冲区读写器的性能,为什么,请举例说明? 答: BufferedReader对Rea ...
- JAVA基础复习与总结<五> String类_File类_Date类
String类 .Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicoe字符组成. .Java没有内置的字符串类型,而是在标准java类库中提供了一个预定义的类String, ...
- Java : java基础(2) 集合&正则&异常&File类
Obj 方法: hashCode() 返回内存地址值, getClass() 返回的时运行时类, getName() 返回类名, toString() 把名字和hashCode() 合在一起返回,如果 ...
- 【转载】JAVA基础复习与总结<三> Object类的常用方法
Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类.这里主要总结Object类中的三个常用方法:toString().equ ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Java基础-进程与线程之Thread类详解
Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...
随机推荐
- TeamViewer 密码有关
TeamViewer这个密码字母代表g不是q.
- step into,step over,step out.
step into:单步执行,遇到子函数就进入并且继续单步执行(简而言之,进入子函数): step over:在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止, ...
- data_summarize.pl data目录文本时长汇总脚本
#!/usr/bin/env perl # Copyright 2018 Jarvan Wang if (@ARGV != 1) { #print STDERR "Usage: keywor ...
- redis集群配置与管理
Redis在3.0版本以后开始支持集群,经过中间几个版本的不断更新优化,最新的版本集群功能已经非常完善.本文简单介绍一下Redis集群搭建的过程和配置方法,redis版本是5.0.4,操作系统是中标麒 ...
- mysql存储引擎和索引
正确的创建合适的索引,是提升数据库查询性能的基础. 第一章 mysql之索引 索引的定义:索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构. 我们为什么要使用索引: a.极大的减少存储引 ...
- redis基础篇
1.redis常见的数据结构 redis是一种以键值对存储的高性能内存数据库,有五种常用的数据类型,string,list,hash,set,zset. 2.redis的过期时间 redis中的key ...
- Codeforces Round #542 (Div. 1) 题解
开学了住校了打不了深夜场 好难受啊QwQ A 显然对于每个起点,我们只需要贪心记录这个起点出发出去的糖果数量以及离自己最近的糖果 因为这个起点最后一次装载糖果一定是装载终点离自己最近的那个糖果 $ O ...
- 肺结节CT影像特征提取(五)——肺结节CT影像ROI区域灰度直方图及其图形化
在博客肺结节CT影像特征提取中,已经实现了肺结节的灰度.纹理和形态特征的提取.但是,对于进一步了解ROI区域像素值或者说CT值的分布来说,还存在一定的不足,不能够很好的显示ROI区域. 因此,本文将进 ...
- Mac下的unity兼容问题,打开项目提示错误:!GetPersistentManager().IsStreamLoaded(assetPath)
安装unity成功之后,打开unity提示如下 那么打开的unity项目很有可能出现找不到资源的错误. 在检查一下你的Mac宗卷格式,如果是APFS格式的话,基本都会不兼容低版本的32位unity应用 ...
- NB群友
链接:https://ac.nowcoder.com/acm/contest/625/A来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言26214 ...