当前位置: 首页 > news >正文

网站建设服务公司哪家好珠海做网站的公司

网站建设服务公司哪家好,珠海做网站的公司,网站遮罩是什么,淄博学校网站建设方案文章目录Java中的文件操作File常用构造方法方法文件内容的读写——数据流InputStreamFileInputStream利用Scanner进行字符读取OutputStreamPrintWriter按字符读取文件(FileReader)练习代码实例如何按字节进行数据读如何按字节进行数据写如何按字符进行数据读如何按字符进行数据…

文章目录

  • Java中的文件操作
    • File
      • 常用构造方法
      • 方法
    • 文件内容的读写——数据流
        • InputStream
        • FileInputStream
        • 利用Scanner进行字符读取
        • OutputStream
      • PrintWriter
      • 按字符读取文件(FileReader)
      • 练习
      • 代码实例
        • 如何按字节进行数据读
        • 如何按字节进行数据写
        • 如何按字符进行数据读
        • 如何按字符进行数据写


Java中的文件操作

在Java中,一般谈到文件,都是指一个存在磁盘上的文件(狭义的文件),抛开Java,站在系统的角度来看,操作系统在管理很多软件资源和硬件设备的时候,都是把这些东西抽象成了一个一个的文件了,这也是系统中典型的"一切皆文件"的思想。

狭义的文件,可以分为两类

  1. 普通文件
  2. 目录文件(文件夹)

在Java标准库java.io下提供了一个File类来对文件(包括目录)进行了抽象描述,注意:有File对象并不表示File对象的文件一定存在。

File

常用构造方法

构造方法说明
File(File parent,String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent,String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示

绝对路径:可以简单理解为带有盘符的

相对路径:基于当前位置的路径一般以 . 或 … 开头,.\表示当前路径,…\表示上一级路径

方法

返回值类型方法名说明
StirnggetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返回 true
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
booleandeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行
String[]list返回 File 对象代表的目录下的所有文件名
File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象表示
booleanmkdir()创建 File 对象代表的目录
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作
booleancanRead()判断用户是否对文件有可读权限
booleananWrite()判断用户是否对文件有可写权限

所谓的文件移动(剪切粘贴),对于操作系统来说,其实是一个非常高效的操作。每个文件都有个属性,这个属性里就包括了文件的路径,移动操作其实只是修改了文件的路径属性而已。

所谓的文件复制(复制粘贴),对于操作系统来说,很可能是一个非常低效的操作。就需要把文件的内容都读读出来,然后再拷贝一份,写入磁盘中。如果文件比较大,复制粘贴的开销就比较大了

经典面试题

给你一个list方法,如何遍历一个目录中所有的文件(包含子目录中的文件)

public class TestDemo {private static List<String> result = new ArrayList<>();public static void printAllFile(String path) {File file = new File(path);//判读这个路径是否真实存在if (file.exists()) {File[] files = file.listFiles();for (File f : files) {//如果是普通文件if (f.isFile()) {result.add(f.getName());} else if (f.isDirectory()) {//如果是目录文件printAllFile(f.getPath());} else {//其它文件..(管道)}}}}public static void main(String[] args) {printAllFile("./");for (String s : result) {System.out.println(s);}}
}

文件内容的读写——数据流

在Java标准库中,读写文件相关的类,有很多。

InputStream/FileInputStream

文件读取操作,按照字节为单位进行读文件

OutputStream/FileOutputStream

文件写入操作,按照字节为单位进行写文件

InputStream

返回值类型方法名说明
intread()读取一个字节的数据以整数形式放回,返回-1代表已经读取完了
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读取到的数量,返回-1代表已经读取完了
intread(byte[] b,int off,int len)最多读取 len - off 个字节的数据到 b 中,放在从off开始,返回实际读取的数量,-1代表已经读取完毕
voidclose()关闭字节流

注意:使用流对象,读写完文件之后,一定要及时关闭,如果没有关闭,就可能造成资源泄露

FileInputStream

构造方法说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流
public class Main {public static void main(String[] args) throws IOException {//这种写法更好try (InputStream inputStream = new FileInputStream(".\\.\\.\\test.txt")) {while (true) {int len = inputStream.read();if (len == -1) {break;}System.out.printf("%c",len);}}catch (IOException e) {e.printStackTrace();}}public static void main1(String[] args) throws IOException {InputStream inputStream = null;try {//创建实例就相当与在打开文件inputStream = new FileInputStream("./././test.txt");//通过逐个字节的方式把文件内容读取出来while (true) {//read无参版本默认每次读取一个字节//无参版本的read。返回值就是每次读取的字节//这个返回值就是 0~255int len = inputStream.read();//如过读到文件末尾(EOF)就会返回 -1if (len == -1) {break;}System.out.printf("%c",len);}} catch (IOException e) {e.printStackTrace();}finally {try {//关闭inputStream.close();} catch (IOException e) {e.printStackTrace();}}}
}

InputStream只是一个抽象类,要使用还需要具体的实现类,关于InputStream实现类有很多,基本可以认为不同的输入设备上都可以对应一个InputStream类,我们现在只关心从文件中读取,所有使用FileInputStream。它继承于InputStream。

注意:如果FileInputStream的创建写到 try()的括号里,就不需要手动close了,等代码执行完毕后会自动close.只要实现了Closeable接口就可以放到try里.

还可以利用byte数组来读取文件内容

public static void main(String[] args) {try (InputStream inputStream = new FileInputStream("./././test.txt")) {while (true) {byte[] bytes = new byte[1024];int len = inputStream.read(bytes);if (len == -1) {break;}String s = new String(bytes,0,len);System.out.println(s);}} catch (IOException e) {e.printStackTrace();}}

利用Scanner进行字符读取

上面的读取方法,直接使用InputStream进行读取是比较麻烦的,这个时候就可以使用常用的Scanenr类来进行读取

构造方法说明
Scanner(InputStream is, String charset)使用 charset 字符集进行 is 的扫描读取
public static void main(String[] args) {//如果要从文件读取出中文,借出 Scanner 就可以从文件中读取try (InputStream inputStream = new FileInputStream("./././test.txt")){//这中写法就不用调用 Scanner的 close 方法try (Scanner sc = new Scanner(inputStream,"utf-8")) {while (sc.hasNext()) {String str = sc.next();System.out.print(str);}}} catch (IOException e) {e.printStackTrace();}}

OutputStream

返回值方法说明
voidwrite(int b)文件写入,指定字节数据
voidwrite(byte[] b)将b这个字符数组中的全部数据写入输出流中
intwrite(byte[] b,int off,int len)将 b 这个字符数组中从 off 开始的数据写入 输出流中,一共写 len 个
voidclose()闭此输出流并释放与此流相关联的任何系统资源
voidfluch()强制刷新缓冲区

我们知道I/O的速度是很慢的,所以,大多的OutputStream为了减少设备操作的次数,为了提高效率,就可以减少直接访问磁盘的次数。使用缓冲区,就能很好的解决这个问题。

缓冲区其实是一段内存空间(这个内存是OutputStream里自带的),当我们使用write方法来写数据的时候,并不是直接把数据写到磁盘上,而是先放到缓冲区(内存中),如果缓冲区满了,或者手动调用flush,猜真的会把数据写到磁盘上。

内存和磁盘之间的缓冲区,往往是一个内存空间

CPU和内存之间,其实也有缓冲区(L1,L2,L3,cache)

代码实例:

public static void main(String[] args) {//一旦按照 OutputStream 的方式打开文件,就会把文件的原来的内容给清空try (OutputStream outputStream = new FileOutputStream("./././test.txt")) {/* 写入一个字符outputStream.write('h');outputStream.write('e');*///按照字节来写入byte[] buffer = new byte[] {'a','b','c','d'};//outputStream.write(buffer);//按照字符串来写入String s = "你好世界 !";//将String 转换成 byte数组,指定字符串为 UTF-8outputStream.write(s.getBytes("UTF-8"));//刷新缓冲区outputStream.flush();}catch (IOException e) {e.printStackTrace();}}

PrintWriter

PrintWriter 类中提供了我们熟悉的 print/println/printf 方法

public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("./././test.txt")) {//利用 PrintWriter 类来包装一下 OutputStream 然后可以更方便的进行读写try (PrintWriter writer = new PrintWriter(outputStream)) {writer.println("这是第一行");writer.println("这是第二行");writer.println(200+300);writer.println("这一行是数字"+1024);}outputStream.flush();}catch (IOException e) {e.printStackTrace();}}

按字符读取文件(FileReader)

public static String readFile(String filePath) {StringBuilder result = new StringBuilder();try (FileReader fileReader = new FileReader(filePath)) {while (true) {//返回的是一个字符,但是不可能有负数,用int才能装下int ch = fileReader.read();if (ch == -1) {break;}result.append((char)ch);}} catch (IOException e) {e.printStackTrace();}return result.toString();}

练习

练习1:指定一个目录,扫描这个目录,找到文件名中包含了指定字符的文件.并提示用户是否要删除这个文件,根据用户的输入决定是否删除.

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//指定一个目录,扫描这个目录,找到文件名名中包含了指定字符的文件,并让用户选择是否要删除文件
public class TestDemo1 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入一个绝对路径 -> ");String rootPath = sc.next();//判断该路径是否存在File fileDir = new File(rootPath);if (!fileDir.exists()) {System.out.println("你输入的路径不正确,程序退出!");}//输入要查找的一个关键字System.out.println("请输入一个查找的关键字:");String keyWord = sc.next();//递归查找List<File> results = new ArrayList<>();KeyWordFindFile(fileDir,keyWord,results);//遍历结果判断是否需要删除for (File file : results) {System.out.println("是否删除文件(Y/N)"+file.getName());String input = sc.next();if (input.equals("Y")) {file.delete();System.out.println("删除成功");}}}/*** 递归查找文件名中包含关键字的文件* @param rootPath File对(绝对路径)* @param fileNameKeyWord 查找的关键字* @param result list*/private static void KeyWordFindFile(File rootPath,String fileNameKeyWord,List<File> result) {File[] files = rootPath.listFiles();for (File file : files) {if (file.isDirectory()) {//如果是目录就递归KeyWordFindFile(file,fileNameKeyWord,result);} else if (file.isFile()) {//判断文件名是否包含关键字if (file.getName().contains(fileNameKeyWord)) {result.add(file);}}}}
}

练习2:把文件复制到指定目录下

//把指定文件复制到另外一个路径,一定是文件public static void main(String[] args) throws IOException {System.out.print("请输要复制文件的绝对路径 -> ");Scanner sc = new Scanner(System.in);String originalPath = sc.next();//判断是否是文件File originalFile = new File(originalPath);if (!originalFile.isFile()) {System.out.println("输入文件绝对路径错误程序退出");return;}System.out.print("请输入文件要复制到的绝对路径(指定文件名) -> ");String targetPath = sc.next();File targetFile = new File(targetPath);//判断文件是否已经存在if (targetFile.exists()) {System.out.println("文件已存在,是否替换(Y/N)");String input = sc.next();if (input.equals("N")) {System.out.println("复制取消");return;}}//开始复制try (InputStream inputStream = new FileInputStream(originalFile);OutputStream outputStream = new FileOutputStream(targetFile)) {//一次性最多读取1024个字节byte[] bytes = new byte[1024];while (true) {int len = inputStream.read(bytes);if (len == -1) {break;}//读多少写多少outputStream.write(bytes,0,len);}//不flush也是可以的,在close后会自动flushoutputStream.flush();} catch (IOException e) {e.printStackTrace();}System.out.println("复制成功!");}

练习3:扫描指定目录,并找到 名称 或者内容中包含指定 字符 的所有普通文件(不包含目录)

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class TestDemo3 {//扫描指定目录,并找到 名称 或者内容中包含指定 字符 的所有普通文件(不包含目录)public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入一个指定目录的绝对路径 -> ");String path = sc.next();File dirPath = new File(path);if (!dirPath.isDirectory()) {System.out.println("你输入的绝对路径不是一个目录。程序自动退出");return;}System.out.print("请输入一个要查找的关键字 -> ");String keyWord = sc.next();//递归遍历目录下的所有文件List<File> result = new ArrayList<>();getAllFile(dirPath,result,keyWord);for (File file : result) {System.out.println(file.getName());}}private static void getAllFile(File dirPath,List<File> result,String keyWord) {File[] files = dirPath.listFiles();if (files == null || files.length == 0) {return;}for (File file : files) {if (file.isDirectory()) {getAllFile(file,result,keyWord);} else if (file.isFile()) {//如果是文件就判断是否包含关键字if(containKeywords(file,keyWord)) {result.add(file);}}}}//判断文件内容是否包含关键字 keyWordprivate static boolean containKeywords(File file,String keyWord) {StringBuilder stringBuilder = new StringBuilder();//使用 Scanner 以UTF-8字符集读取try (InputStream inputStream = new FileInputStream(file);Scanner scanner = new Scanner(inputStream,"UTF-8")) {while (scanner.hasNext()) {String s = scanner.nextLine();stringBuilder.append(s);}} catch (IOException e) {e.printStackTrace();}return stringBuilder.indexOf(keyWord) != -1;}
}

代码实例

如何按字节进行数据读

try (InputStream input = new ...) {byte[] bytes = new byte[1024];while (true) {int len = input.read(bytes);if (len == -1) {break;}//0到len表示bytes读到的数据String reslult = new String(bytes,0,len);}
}

如何按字节进行数据写

try (OutputStream output = new ...) {byte[] bytes = new byte[1024];while (/* 还有未完成的业务数据 */) {// 将业务数据填入 buf 中,长度为 nint len = ...;output.write(bytes, 0, len);}output.flush();//刷新缓冲区
}

如何按字符进行数据读

try (InputStream is = ...) {try (Scanner scanner = new Scanner(is, "UTF-8")) {while (scanner.hasNextLine()) {String line = scanner.nextLine();// 根据 line 做业务处理}}
}

如何按字符进行数据写

try (OutputStream os = ...) {try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-8")) {try (PrintWriter writer = new PrintWriter(osWriter)) {while (/* 还有未完成的业务数据 */) {writer.println(...);}writer.flush(); // 进行数据刷新操作}}
}

啥样的类可以放到 try()里,实现了 Closeble接口的就可以放入 try()里


http://www.zhongyajixie.com/news/5151.html

相关文章:

  • 适合初学者做的网页阳东网站seo
  • 云一网站建设免费建设网站平台
  • 网站前端开发流程惠城网站设计
  • 南阳网站建设怎么把产品推广到各大平台
  • wordpress翻墙seo下拉优化
  • 苏州外贸公司网站建设流程图百度手机网页版入口
  • 网页设计作品简单跨境电商seo是什么意思
  • 大鹏网站建设公司网站收录一键提交
  • 网站模板jsp百度知道app官方下载
  • 沂南网站设计如何优化推广中的关键词
  • 3d动画制作教程视频seo的流程是怎么样的
  • 怎么做百度网站验证码刚刚刚刚刚刚刚刚刚刚刚刚刚刚
  • 小型电商网站开发百度竞价排名榜
  • wordpress默认插件安徽seo团队
  • 可以做ppt的网站有哪些方面手机百度快照
  • 如何做物流网站营销推广型网站
  • 自己如何建一个网站杭州网站提升排名
  • 电商网站设计与开发营销手机系统安装
  • 做代刷主站网站关键词推广seo怎么优化
  • 微博网站可以做兼职吗seo 优化
  • 网上书城 网站建设方案免费建站网站一级
  • 面对不法网站该怎样做上海培训机构
  • 西宁网站推广流量宝官网
  • 做系统之前的网站同城广告发布平台
  • 微信服务号菜单链接网站怎么做宁波seo关键词优化制作
  • 日本站群服务器b站推广网站mmm
  • web网站开发需要的软件跟我学seo从入门到精通
  • 北京百子湾后现代城网站建设seo关键词排名优化怎样
  • 网站建设项目明细seo优化推广
  • 静态网页设计用什么软件windows11优化大师