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类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...
随机推荐
- weblogic找不到数据源
查看weblogic日志 报错是每个数据源都找不到. 查看oracle用户状态 select username,account_status,lock_date from dba_users; 解 ...
- StackExchange.Redis 异步超时解决方案
Timeout awaiting response (outbound=0KiB, inbound=45417KiB, 5891ms elapsed, timeout is 5000ms), comm ...
- 《Java》第五周学习总结20175301
https://gitee.com/ShengHuoZaiDaXue/20175301.git 本周我学习了第六章的内容接口 重要内容有 理解接口 接口参数 面向接口编程 abstract类与接口的比 ...
- CSS部分语法1
<!-- 第1部分 CSS规则特性 1 继承性:父元素样式可以被子元素继承,一般只能继承颜色和字体: 2 层叠性:给一个元素设置不同声明,效果会叠加: 3 优先级:给同一个元素设置相同声明,效果 ...
- [Reinforcement Learning] Cross-entropy Method
Cross-entropy Method(简称CEM)虽然是一种基于交叉熵的算法,但并不是我们熟知的监督学习中的交叉熵方法,与其说它是一种基于交叉熵的算法,倒不如说是一种基于蒙特卡洛和进化策略的算法. ...
- 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)
A. Find a Number 找到一个树,可以被d整除,且数字和为s 记忆化搜索 static class S{ int mod,s; String str; public S(int mod, ...
- js中的 Date对象 在 IOS 手机中的兼容性问题
项目中有个时间相关的需求,很自然的用到了 js 中的 new Date() 获取时间,浏览器使用模拟手机模式访问没有问题,但是真机测试时发现,ios系统的手机无法显示时间. 定位问题发现是 new D ...
- list不是模板
vector和list在命名空间std里,还需要添加声明 using namespace std;
- BMCP位图图片压缩算法
什么是位图?位图也称像素图像或点阵图像,是由多个点组成的,这些点被称为像素.位图可以模仿照片的真实效果,具有表现力强.细腻.层次多和细节多等优点. 图片的压缩格式:在Windows系统中,我们常见的b ...
- django学习笔记-模板层
模板层 将Python嵌入到HTML中. 模板简介 将HTML硬解码到视图并不是那么完美原因如下: 对页面设计时也需要对python代码进行相应的修改,模板可以不就行python代码修改的情况下变更设 ...